2014-07-02 43 views
8

我有点困惑,我应该如何将我的SRID值设置到我的GeoDjango PointField中,以便通过Google地图api将地址解析为经由django-postgis查询的坐标和距离的地址环境中保持准确?GeoDjango,用于PointField与Google Maps V3 API接口的SRID是什么?

我正在阅读围绕网络和叠层流程的线程,并且不确定要做什么。正如你可以看到我的应用程序正在使用gemap和谷歌地图API来对地址进行地理编码。现在我的坐标字段没有设置默认为4326的SRID(EPSG:4326)。现在显然这将地球视为一个地球,而不是一个平坦的表面。

根据以下问题的东西,如谷歌地图的答案使用(EPSG 3857),这显然有900913. https://gis.stackexchange.com/questions/48949/epsg-3857-or-4326-for-googlemaps-openstreetmap-and-leaflet

的SRID那么,这是否意味着我要我的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 

回答

18

您应该使用4326(这意味着纬度和经度,用WGS84数据和球体的地球的形状模型)把点添加到谷歌地图。记录您在地球上的位置的GPS等设备将保存4326中的数据,然后将其内部投影到3857(以米为单位)。如果你看看example for loading 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/

+1

这是非常有益的。历史课实际上有助于清理事情。谢谢! – user3739703

+0

这是否也意味着我应该使用4326从搜索API返回的点? – bigblind

+0

@bigblind,对不起,哪个搜索API? –