Geodjango: PointField и GEOSGeometry

Если я смогу это сделать:

>>> 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?


person Nick B    schedule 03.10.2013    source источник
comment
LAT и LONG отображаются в обратном порядке в соответствии с сообщением gis stackexchange gis.stackexchange.com/questions/11626/   -  person dan gleebits    schedule 01.05.2015


Ответы (2)


Вы, конечно, можете сделать это, но с небольшой модификацией

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

OR

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

Когда вы делаете

`'POINT(lat lon)'`

вы не заменяете локальные переменные lat и lon соответствующими значениями локальных переменных, и они оцениваются буквально. Таким образом, вам нужно будет использовать замену.

РЕДАКТИРОВАТЬ: Изменен порядок (lat, lon) на (lon, lat), чтобы соответствовать порядку, который ожидает GEOSGeometry. Хотя это прямо не указано в документации, видно из их примеров.

person karthikr    schedule 03.10.2013
comment
Идеальный ответ. Большое спасибо! - person Nick B; 03.10.2013
comment
Как упоминалось в stackoverflow.com/a/26472089/1405577, ТОЧКА должна быть ТОЧКОЙ (долгота, широта). Пожалуйста, исправьте этот комментарий. - person mjabadilla; 13.07.2018

Принятый ответ неверен. Точки имеют форму «POINT(долгота, широта)». Вы перевернули их.

person Shroud    schedule 20.10.2014
comment
Мне потребовалось некоторое время, чтобы понять это. Я думаю, это должно быть указано в документах. - person Amin Alaee; 12.01.2017