GeoDjango, какой SRID использовать для взаимодействия PointField с API Карт Google V3?

Я немного сбит с толку, что я должен установить значение моего SRID в моем GeoDjango PointField, чтобы оставаться точным в контексте геокодирования адресов через API Google Maps в координаты и расстояния, запрашиваемые через Django-Postgis?

Я получаю смешанные мнения, читая темы вокруг сети и потока стека, и я не уверен, что делать. Как вы можете видеть, мое приложение использует Geopy с Google Maps API для геокодирования адреса. Прямо сейчас мое поле координат не имеет установленного SRID, который по умолчанию равен 4326 (EPSG: 4326). Теперь, видимо, это видит Землю как шар, а не плоскую поверхность.

Согласно ответу в следующем вопросе используются такие вещи, как карты Google (EPSG 3857), который, по-видимому, имеет SRID 900913. https://gis.stackexchange.com/questions/48949/epsg-3857-or-4326-for-googlemaps-openstreetmap-and-leaflet

Значит ли это, что я должен установить свой SRID на 900913? Все координаты модели моего ресторана сохраняются тем же методом, который показан ниже с использованием геокодера. Я бы так предположил.

Теперь это то, где меня отбрасывают, следующий учебник http://invisibleroads.com/tutorials/geodjango-googlemaps-build.html использует поле точек с их SRID, установленным в 4326 (по умолчанию), и их точки маркера отлично отображаются на картах Google,

В настоящее время мои запросы достаточно точны, но все же кажется, что это немного не так.

Помощь приветствуется, спасибо!

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

Модель ресторана

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

1 ответ

Решение

Вы должны использовать 4326 (что означает широту и долготу, используя датум WGS84 и сфероид для моделирования формы глобуса), чтобы добавить точки в Google Maps. Устройства, такие как GPS, которые регистрируют ваше положение на земном шаре, сохранят данные в 4326, которые затем будут проецироваться внутри Google Maps на 3857 (в метрах). Если вы посмотрите на пример загрузки GeoJSON, вы увидите, что точки находятся в 4326.

900913 (который является просто GOOGLE в написании калькулятора) вызвал много недоразумений и возник из-за того, что изначально EPSG был очень странным в отношении того, что они считают неточной проекцией, главным образом потому, что он предполагает, что мир является сферой. В любом случае он стал популярным благодаря глобальной известности Google и его математической управляемости. Впоследствии EPSG дал ему новое официальное обозначение 3857 (ну, технически, было и другое, 3587, просто чтобы вызвать еще большую путаницу). Таким образом, хотя люди все еще говорят о 900913, официально вы должны использовать 3587. 3587 проецируется в метрах и используется для генерации плиток для отображения в Картах Google, но не должен использоваться для добавления к нему точечных источников, где вы определенно хотите использовать 4326,

Здесь есть хорошая статья, если вы хотите узнать больше об истории этого: http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/

Другие вопросы по тегам