3

我正在使用 GeoDjango 构建一个 Web 服务,其中涉及用户提交的事件,包括位置。我使用以下方法为我的位置创建了一个模型字段django.contrib.gis.db

location = models.PointField(srid=900913)

我在阅读时选择指定900913这是谷歌地图使用的投影,我通过在谷歌地图上放置标记来获取位置。坐标以 lat/lng 形式呈现给我。我使用 GEOS 将这一点存储在 PostGIS DB 中:

location = geos.Point(data['lng'], data['lat'], srid=900913)

如果我想在地图上查看这一点,我会从我的数据库(例如lat = location.coords[1])中获取 lat 和 lng,并使用它们将我的地图居中,这很好。

当我想浏览地图并显示位于地图边界内的数据库中的事件时,我使用 GeoDjango 的within查询和地图边界(以 lat/lng 格式):

    bounds = geos.Polygon.from_bbox((swLng, swLat, neLng, neLat))
    events = Event.objects.filter(location__within=bounds)

这似乎工作正常,我在地图上显示与这些事件的纬度/经度相对应的图钉。

到目前为止,没有任何迹象表明有任何问题,但是我对这些东西完全陌生,我想确保当我不可避免地想以更复杂的方式使用我的位置数据时,我能正确处理它。我怀疑的原因是我的 Django 管理窗格没有在 OpenStreetMap 上正确显示位置。它显示了一个似乎对应于此处显示的 (0,0) 点的点。位置字段的显示文本版本是SRID=900913;POINT(-1.277482509613037 50.874104373286066),显然仍然是 lat/lng。当我在管理地图上移动鼠标时,我可以看到右下角显示的坐标是 900913 格式,而不是 lat/lng。

请您解释一下我如何以正确的格式存储我的位置点,以及这比简单地使用 lat/lng 有什么优势(我的猜测是,如果我想指定以公里为单位的查找距离,我不能使用我的纬度/经度位置)。

4

0 回答 0