2013-04-02 42 views
8

我需要使用Bing Map服務,EF 5和SQL Server 2008對地理編碼進行大量地址編碼。我在SQL中使用地理數據類型,該地理數據類型由EF轉換爲DbGeography類型。DbGeography上的coordinatesSystemId

當我創建一個DbGeography對象,這樣

string point = string.Format("POINT({0} {1})",address.Longitude,address.Latitude); 
address.Location = System.Data.Spatial.DbGeography.PointFromText(point, 4326); 

第二個參數要求一個 「coordinateSystemId」。這究竟是什麼?我看到很多示例使用4326. 我對空間數據很陌生,但我猜測有一組定義良好的座標系?我似乎無法找到一個定義。

回答

9

有地理信息系統的整體StackExchange,如果你和我一樣,黃蜂在有一個編碼器不知道GIS,你是在一坐:

https://gis.stackexchange.com/questions/48949/epsg-3857-or-4326-for-googlemaps-openstreetmap-and-leaflet

原來有一個在映射標準(「GIS」)稱爲EPSG,人們似乎用「EPSG」,「 EPSG SRID「和」SRID「可互換使用。在大多數GPS座標系統的使用中,如果您在談論地球(包括您從Google地圖獲得的LatLngs),那麼您使用的是EPSG SRID 4326,如果您正在討論平面2D地圖(如Google Custom Map) ,你正在談論EPSG SRID 3857.

還有一些關於WGS的malarkey可以忽略。

.Net只查找EPSG SRID中的實際數字ID。這將是超級有益的,如果這些人在DbGeography只是常量,如:

public class DbGeography 
{  
    public const int SridGps = 4326; 
    public const int Srid2dPlane = 3857; 

但沒有這樣的運氣。

無論如何,考慮在你的應用程序中使它們成爲常量,而不是隻是繞着無證魔術數字。我們的小幫手類:

public class GeoHelper 
{ 
    public const int SridGoogleMaps = 4326; 
    public const int SridCustomMap = 3857; 



    public static DbGeography FromLatLng(double lat, double lng) 
    { 
     // http://codepaste.net/73hssg 
     return DbGeography.PointFromText(
      "POINT(" 
      + lng.ToString() + " " 
      + lat.ToString() + ")", 
      SridGoogleMaps); 
    } 
}