我有点困惑,我应该在我的GeoDjango PointField中将SRID值设置为什么,以便在通过google映射api进行地理编码以坐标和距离通过django-postgis查询地址时保持准确?
我得到的意见参差不齐,阅读线程围绕网络和堆叠流,我不知道该做什么。如您所见,我的应用程序正在使用geopy和google对一个地址进行地理编码。现在,我的坐标字段没有默认为4326的SRID集,即(EPSG: 4326)。很明显,它把地球看作是一个地球仪,而不是一个平面。
根据以下问题的答案,比如谷歌地图的使用(EPSG3857),它的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 (默认),它们的标记点完美地出现在谷歌地图上。
目前,我的查询是体面的准确,但仍然觉得有点不对劲。
感谢你的帮助,谢谢!
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发布于 2014-07-02 10:18:22
您应该使用4326 (即纬度和经度,使用WGS84基准和球体来模拟地球形状)向Google添加点。全球定位系统( GPS )等设备将在4326中保存数据,然后在Google内部投影到3857 (以米为单位)。如果你看一下加载GeoJSON的示例,你会发现这些点都在4326。
900913 (这只是谷歌在计算器的写作)引起了许多混乱,并引发了一个事实,最初EPSG对他们认为是不准确的预测非常嗤之以鼻,主要是因为它认为世界是一个球体。不过,由于谷歌在全球的知名度和数学上的可控性,它还是很受欢迎。随后,EPSG给了它一个新的正式名称3857 (技术上也有一个,3587,只是为了引起更多的混乱)。所以,虽然人们还在谈论900913,但官方认为你应该使用3587。3587是以米为单位投影的,用于生成在Google中显示的瓷砖,但不应用于向其添加点源,因为您肯定希望使用4326。
这里有一篇很好的文章,如果您想知道更多关于这方面的历史的话:http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/
https://stackoverflow.com/questions/24526928
复制相似问题