You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.7 KiB
69 lines
2.7 KiB
""" |
|
The goal of this module is to be a ctypes wrapper around the GEOS library |
|
that will work on both *NIX and Windows systems. Specifically, this uses |
|
the GEOS C api. |
|
|
|
I have several motivations for doing this: |
|
(1) The GEOS SWIG wrapper is no longer maintained, and requires the |
|
installation of SWIG. |
|
(2) The PCL implementation is over 2K+ lines of C and would make |
|
PCL a requisite package for the GeoDjango application stack. |
|
(3) Windows and Mac compatibility becomes substantially easier, and does not |
|
require the additional compilation of PCL or GEOS and SWIG -- all that |
|
is needed is a Win32 or Mac compiled GEOS C library (dll or dylib) |
|
in a location that Python can read (e.g. 'C:\Python25'). |
|
|
|
In summary, I wanted to wrap GEOS in a more maintainable and portable way using |
|
only Python and the excellent ctypes library (now standard in Python 2.5). |
|
|
|
In the spirit of loose coupling, this library does not require Django or |
|
GeoDjango. Only the GEOS C library and ctypes are needed for the platform |
|
of your choice. |
|
|
|
For more information about GEOS: |
|
http://geos.refractions.net |
|
|
|
For more info about PCL and the discontinuation of the Python GEOS |
|
library see Sean Gillies' writeup (and subsequent update) at: |
|
http://zcologia.com/news/150/geometries-for-python/ |
|
http://zcologia.com/news/429/geometries-for-python-update/ |
|
""" |
|
from django.contrib.gis.geos.base import GEOSGeometry, wkt_regex, hex_regex |
|
from django.contrib.gis.geos.geometries import Point, LineString, LinearRing, Polygon, HAS_NUMPY |
|
from django.contrib.gis.geos.collections import GeometryCollection, MultiPoint, MultiLineString, MultiPolygon |
|
from django.contrib.gis.geos.error import GEOSException, GEOSIndexError |
|
from django.contrib.gis.geos.libgeos import geos_version, geos_version_info |
|
|
|
def fromfile(file_name): |
|
""" |
|
Given a string file name, returns a GEOSGeometry. The file may contain WKB, |
|
WKT, or HEX. |
|
""" |
|
fh = open(file_name, 'rb') |
|
buf = fh.read() |
|
fh.close() |
|
if wkt_regex.match(buf) or hex_regex.match(buf): |
|
return GEOSGeometry(buf) |
|
else: |
|
return GEOSGeometry(buffer(buf)) |
|
|
|
def fromstr(wkt_or_hex, **kwargs): |
|
"Given a string value (wkt or hex), returns a GEOSGeometry object." |
|
return GEOSGeometry(wkt_or_hex, **kwargs) |
|
|
|
def hex_to_wkt(hex): |
|
"Converts HEXEWKB into WKT." |
|
return GEOSGeometry(hex).wkt |
|
|
|
def wkt_to_hex(wkt): |
|
"Converts WKT into HEXEWKB." |
|
return GEOSGeometry(wkt).hex |
|
|
|
def centroid(input): |
|
"Returns the centroid of the geometry (given in HEXEWKB)." |
|
return GEOSGeometry(input).centroid.wkt |
|
|
|
def area(input): |
|
"Returns the area of the geometry (given in HEXEWKB)." |
|
return GEOSGeometry(input).area |
|
|
|
|