GeoDjango,与Google Maps V3 API接口的PointField使用哪个SRID?

13

我有点困惑,在使用GeoDjango PointField时,为了在通过Google Maps API将地址转换为坐标并通过Django-PostGIS查询距离时保持准确性,应该将我的SRID值设置为多少。

我在网上和Stackoverflow上看到了不同的意见,不确定该做什么。正如您所看到的,我的应用程序正在使用带有Google Maps API的Geopy来对地址进行地理编码。现在,我的坐标字段没有设置SRID,默认为4326(EPSG:4326)。现在显然,这将地球视为一个球体而不是一个平面。

根据以下问题的答案,诸如Google Maps之类的东西使用(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的PointField,他们的标记点在Google Maps上显示得非常完美。

目前我的查询还算准确,但仍然感觉有点不对劲。感谢您的帮助!

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个回答

26
您应该使用4326(意味着使用WGS84基准和椭球体来建模地球的形状的纬度和经度)向Google Maps添加点。记录在地球上位置的设备(如GPS)将保存数据在4326中,然后在Google Maps内部投影到3857(以米为单位)。如果您查看加载GeoJSON示例,您将看到点位于4326中。
900913(只是计算机写法中的GOOGLE)引起了很多混乱,并且起源于最初的EPSG对他们认为不准确的投影方法非常挑剔,主要是因为它假定世界是一个球体。由于Google具有全球知名度和数学上的可操作性,它仍然变得流行起来。随后,EPSG为其指定了新的正式名称3857(实际上还有另一个名称3587,这只会导致更多的混淆)。因此,尽管人们仍然谈论900913,但官方上您应该使用3587。3587以米为单位进行投影,并用于生成显示在Google Maps中的瓦片,但不应用于添加点源,其中您绝对希望使用4326。

如果您想了解更多关于这个历史的信息,这里有一篇很好的文章:http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/


1
那真的非常有帮助。历史课确实帮助我搞清楚了一些事情。谢谢! - user3739703
这是否意味着我应该在从搜索API返回的点中使用4326? - bigblind
@bigblind,抱歉,请问使用哪个搜索API? - John Powell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接