2014-07-02 68 views
8

Jestem nieco zdezorientowany, co powinienem ustawić moją wartość SRID w GeoDjango PointField, aby zachować dokładność w kontekście adresów geokodowanych za pomocą map Google api do współrzędnych i odległości zapytanych przez django-postgis?GeoDjango, jakiego identyfikatora SRID użyć do interfejsu PointField z interfejsem API Map Google V3?

Im coraz mieszane opinie czytania wątków wokół sieci i przepływu stackover i jestem pewien, co robić. Jak widzisz, moja aplikacja używa geopii z apikcjami google maps do geokodowania adresu. Teraz moje pole współrzędnych nie ma zestawu SRID, którego domyślna wartość to 4326 (EPSG: 4326). Teraz najwyraźniej widzi ziemię jako kulę, a nie płaską powierzchnię.

Zgodnie z odpowiedzią na pytanie następujące rzeczy takie jak google maps użyciu EPSG (3857), który podobno ma SRID z 900913. https://gis.stackexchange.com/questions/48949/epsg-3857-or-4326-for-googlemaps-openstreetmap-and-leaflet

Czy to oznacza, należy ustawić mój SRID do 900913? Wszystkie współrzędne mojego modelu restauracji są zapisywane w tej samej metodzie, co poniżej, przy użyciu geokodera. Zakładam, że tak.

Teraz jest to miejsce, w którym zostanę odrzucony. Poniższy samouczek: http://invisibleroads.com/tutorials/geodjango-googlemaps-build.html używa pola punktowego z ich SRID ustawionym na 4326 (domyślnie), a ich punkty znacznikowe wyglądają idealnie na mapach google.

Obecnie moje zapytania są przyzwoicie dokładne, ale nadal wydaje się trochę nie tak.

Pomoc jest doceniana, dzięki!

from geopy.geocoders import GoogleV3 
from django.contrib.gis.geos import * 
from django.contrib.gis.measure import D 

geo = GoogleV3() 
def home_page(request): 
distance = 3680 
address, coordinates = geo.geocode('Swanston Street, Melbourne Australia') 
ref_location = Point(coordinates) 
query = Restaurant.objects.filter(restaurant_location__distance_lte=(ref_location, D(m=distance))).distance(ref_location).order_by('distance') 
    return render(request, 'swings/home.html', {'restaurants': query}) 

Restauracja model

class Restaurant(models.Model): 
    name = models.CharField(max_length=25, blank=False) 
    user = models.ForeignKey(User) 
    address = models.CharField(max_length=50, blank=False) 
    restaurant_location = models.PointField(null=False, blank=False) 
    objects = models.GeoManager() 

    def __str__(self): 
     return self.name 

Odpowiedz

18

Należy użyć 4326 (co oznacza długość i szerokość geograficzną, stosując układ odniesienia WGS84 i sferoidalne modelować kształt kuli ziemskiej), aby dodać punkty do Google Maps. Urządzenia takie jak GPS, które rejestrują Twoją pozycję na kuli ziemskiej, będą zapisywać dane w 4326, które następnie będą wyświetlane wewnętrznie w Google Maps do 3857 (co jest w metrach). Jeśli spojrzysz na example for loading GeoJSON zobaczysz, że punkty są w 4326.

900913 (co jest po prostu GOOGLE w pisaniu kalkulatora) spowodowało wiele zamieszania i wynikało z faktu, że początkowo EPSG był bardzo sniffy o co uważają za niedokładną projekcję, głównie dlatego, że zakłada, że ​​świat jest kulą. Stało się to popularne ze względu na globalną pozycję Google i jego matematyczną łatwopalność. Następnie EPSG nadało mu nowe oficjalne oznaczenie 3857 (dobrze technicznie było jeszcze jedno, 3587, tylko po to, by wywołać jeszcze większy zamęt). Tak więc, chociaż ludzie wciąż mówią o 900913, oficjalnie powinieneś użyć 3587. 3587 jest wyświetlany w metrach i używany do generowania kafelków do wyświetlania w Google Maps, ale nie powinien być używany do dodawania źródeł punktów, gdzie zdecydowanie chcesz użyć 4326 .

jest dobry artykuł tutaj, jeśli chcesz dowiedzieć się więcej o historii to: http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/

+1

to było bardzo pomocne. Lekcja historii rzeczywiście pomogła wyjaśnić sprawę. Dzięki! – user3739703

+0

Czy to oznacza również, że powinienem użyć 4326 dla punktów zwróconych przez API wyszukiwania? – bigblind

+0

@bigblind, przepraszam, który interfejs API wyszukiwania? –