2013-04-02 14 views
8

Potrzebuję geokodować dużą liczbę adresów, używając usługi Bing Map, EF 5 i SQL Server 2008. Używam typu danych geograficznych w SQL, co przekłada się na typ DbGeography przez EF.coordinateSystemId on DbGeography

Kiedy utworzyć obiekt DbGeography, jak to

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

Drugi parametr wymaga "coordinateSystemId". Czym dokładnie jest to? Wiele przykładów widzę w użyciu 4326. Jestem nowy w danych przestrzennych, ale zgaduję, że istnieje zestaw dobrze zdefiniowanych układów współrzędnych? Nie mogę znaleźć definicji.

Odpowiedz

9

Jest cała Stack Exchange Network dla GIS, a jeśli, jak ja, trzmieli w tam jako koder nie wiedząc, GIS, jesteś w na przejażdżkę:

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

okazuje się, że to norma w mapowaniu („GIS”) o nazwie EPSG, a ludzie wydają się użyć „EPSG”, " EPSG SRID, "i" SRID "zamiennie, gdy się do niego odwołuje. W większości przypadków korzystania z GPS, jeśli mówisz o Ziemi (w tym o LatLngs, które dostajesz z Map Google), używasz EPSG SRID 4326, a jeśli mówisz o płaskiej mapie 2D (jak niestandardowa mapa Google) , mówisz o EPSG SRID 3857.

Jest też trochę malarkey o WGS, które możesz zignorować.

. NET szuka tylko rzeczywistego numeru identyfikacyjnego w identyfikatorze SRG EPSG. Byłoby bardzo pomocne, gdyby były to tylko stałe na DbGeography, takie jak:

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

Ale nie takie szczęście.

W każdym razie rozważ wprowadzenie stałych w swojej aplikacji, a nie tylko obrzucanie nieudokumentowaną liczbą magiczną. Nasza mała klasa pomocników:

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); 
    } 
}