我正在使用GeoDjango构建一个Web服务,该服务涉及用户提交的事件,包括位置。我使用django.contrib.gis.db
为我的位置创建了一个模型字段:
location = models.PointField(srid=900913)
我选择指定900913
,因为我读到这是Google地图使用的投影,我通过在Google地图上放置标记来获取位置。坐标以lat / lng形式呈现给我。我使用GEOS将这一点存储在PostGIS数据库中:
location = geos.Point(data['lng'], data['lat'], srid=900913)
如果我想在地图上查看此点,我会从我的数据库中获取lat和lng(例如lat = location.coords[1]
)并使用它们将我的地图居中,这样就可以了。
当我想浏览地图并显示位于地图边界内的DB中的事件时,我使用GeoDjango的within
查询和地图边界(以lat / lng格式):
bounds = geos.Polygon.from_bbox((swLng, swLat, neLng, neLat))
events = Event.objects.filter(location__within=bounds)
这似乎工作正常,我在地图上显示与这些事件的纬度/经度相对应的图钉。
到目前为止,没有任何迹象表明任何事情都会出错,但是我对这些事情完全不熟悉,而且我想确保在我不可避免地希望以更复杂的方式使用我的位置数据时,我能够做到这一点。我怀疑的原因是我的Django管理窗格没有在OpenStreetMap上正确显示位置。它显示的一个点似乎对应于显示here的(0,0)点。显示的位置字段文本版本为SRID=900913;POINT(-1.277482509613037 50.874104373286066)
,显然仍处于lat / lng状态。当我在管理地图上移动鼠标时,我可以看到右下角显示的坐标是900913格式,而不是lat / lng。
请你能解释一下我如何以正确的格式存储我的位置点,以及这比仅使用lat / lng有什么好处(我的猜测是,如果我想指定以km为单位的距离进行查找,我可以不要使用我的lat / lng位置。