Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Geodjango: PointField and GEOSGeometry

If I can do this:

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

Why can I not do this:

>>> 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".

How can I use a variable to create a GEOSGeometry object?

like image 704
Nick B Avatar asked Oct 03 '13 18:10

Nick B


2 Answers

The accepted answer is incorrect. Points take the form of "POINT(longitude latitude)". You've reversed them.

like image 175
Shroud Avatar answered Oct 04 '22 01:10

Shroud


You can surely do that, but with a slight modification

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

OR

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

When you do

`'POINT(lat lon)'`

you are not replacing the local variables lat and lon with their appropriate local variable values, and they are being evaluated literally. So, you would need to use substitution.

EDIT: Changed order of (lat, lon) to (lon, lat) to match the order GEOSGeometry is expecting. Although not explicitly stated in the documentation, it is evident from their examples.

like image 22
karthikr Avatar answered Oct 04 '22 00:10

karthikr