geodjango查询格式坐标 - 转换lat lon,打开街道地图

时间:2017-08-29 16:13:26

标签: django python-2.7 geodjango pyproj

我的模型城市中有一个多边形,但在我的地图中 bogota具有坐标-8243997.66798 , 517864.86656 - >开放的街道地图;但我需要使用像(4.697857, -74.144554) - >这样的坐标进行查询谷歌地图。

pnt = 'POINT(%d %d)'%(lon, lat)
zonas = ciudad.zona_set.filter(polygon__contains=pnt)

zonas为空:/, 如何将latlon转换为开放街道地图中的标准坐标,或者如何知道一个输入的{strong> srid 代码(lat,lon)

pnt = GEOSGeometry('POINT(-96.876369 29.905320)', srid=srid_from_lat_lon)

感谢

1 个答案:

答案 0 :(得分:0)

进行空间查询时,最好传递具有指定空间参照系(srid)的几何体。像这样,GeoDjango会自动将输入查询几何转换为表格的坐标系(在您的情况下是城市模型的坐标系)。

在您给出的第一个代码示例中,您没有在几何体上指定srid,因此pnt = 'POINT(%d %d)'%(lon, lat)没有srid。在这种情况下,GeoDjango将假设srid对于输入和模型数据表是相同的。在你的例子中并非如此,这就是你没有得到任何匹配的原因。

因此,您需要使用正确的SRID创建点。如果从OSM获取坐标,则坐标很可能位于Web Mercator projection,其中包含srid 3857。此投影通常用于Web制图。

为此,您可以像EWKT format (which is essentially SRID + WKT)那样使用:

pnt = 'SRID=4326;POINT(-96.876369 29.90532)'

或者如果您在Web Mercator Projection中有坐标,则以下内容应该有效:

pnt = 'SRID=3857;POINT(-8243997.66798  517864.86656)'
zonas = ciudad.zona_set.filter(polygon__contains=pnt)

仅供参考,以下是一些关于如何在EWKT和GEOSGeometries之间进行回顾的示例:

所以这个(正常的WKT,在创建几何时指定了srid)

GEOSGeometry('POINT(-8243997.66798  517864.86656)', srid=3857)

等同于此(EWKT字符串中包含的srid):

GEOSGeometry('SRID=3857;POINT(-8243997.66798  517864.86656)')