我有点困惑,在使用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