Geodjango:PointField和GEOSGeometry

8

如果我能做到这一点:

>>> from django.contrib.gis.geos import GEOSGeometry
>>> from django.contrib.gis.geos import Point
>>> point = GEOSGeometry('POINT(1 5)')
>>> print point
POINT (1.0000000000000000 5.0000000000000000)

为什么我不能这么做:
>>> lat = 1
>>> lon = 5
>>> point = GEOSGeometry('POINT(lat lon)')

GEOS_ERROR: ParseException: Expected number but encountered word: 'lat'
GEOSException: Error encountered checking Geometry returned from GEOS C function "GEOSWKTReader_read_r".

如何使用变量创建GEOSGeometry对象?

3
根据gis stackexchange上的帖子http://gis.stackexchange.com/questions/11626/does-y-mean-latitude-and-x-mean-longitude-in-every-gis-software,LAT和LONG似乎被颠倒了。 - dan gleebits
2个回答

19

被接受的答案是不正确的。 点的形式应该是“POINT(经度 纬度)”。您颠倒了它们的顺序。


我花了一些时间才弄清楚这个问题。我想这应该在文档中提到。 - Amin Alaee

8
你可以做到这一点,但需要稍作修改。
point = GEOSGeometry('POINT(%s %s)' % (lon, lat))

或者

point = GEOSGeometry('POINT(%d %d)' % (lon, lat))

当你执行时,
`'POINT(lat lon)'`

您没有使用适当的本地变量值替换latlon本地变量,并且它们被按字面意义评估。因此,您需要使用替换。

编辑:将(lat,lon)的顺序更改为(lon,lat)以匹配GEOSGeometry期望的顺序。尽管在文档中没有明确说明,但从他们的示例中可以看出。


2
如 https://dev59.com/63fZa4cB1Zd3GeqPTJLJ#26472089 所述,POINT 应该是 POINT(longitude, latitude)。请更正此注释。 - mjabadilla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接