我的模型城市中有一个多边形,但在我的地图中
bogota具有坐标-8243997.66798 , 517864.86656
- >开放的街道地图;但我需要使用像(4.697857, -74.144554)
- >这样的坐标进行查询谷歌地图。
pnt = 'POINT(%d %d)'%(lon, lat)
zonas = ciudad.zona_set.filter(polygon__contains=pnt)
zonas为空:/,
如何将lat
和lon
转换为开放街道地图中的标准坐标,或者如何知道一个输入的{strong> srid 代码(lat,lon)
pnt = GEOSGeometry('POINT(-96.876369 29.905320)', srid=srid_from_lat_lon)
感谢
答案 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)')