53 lines
1.3 KiB
Python
53 lines
1.3 KiB
Python
|
"""Proxy for coordinates stored outside Shapely geometries
|
||
|
"""
|
||
|
|
||
|
from shapely.geometry.base import EMPTY
|
||
|
from shapely.geos import lgeos
|
||
|
|
||
|
|
||
|
class CachingGeometryProxy(object):
|
||
|
|
||
|
context = None
|
||
|
factory = None
|
||
|
__geom__ = EMPTY
|
||
|
_gtag = None
|
||
|
|
||
|
def __init__(self, context):
|
||
|
self.context = context
|
||
|
|
||
|
@property
|
||
|
def _is_empty(self):
|
||
|
return self.__geom__ in [EMPTY, None]
|
||
|
|
||
|
def empty(self, val=EMPTY):
|
||
|
if not self._is_empty and self.__geom__:
|
||
|
lgeos.GEOSGeom_destroy(self.__geom__)
|
||
|
self.__geom__ = val
|
||
|
|
||
|
@property
|
||
|
def _geom(self):
|
||
|
"""Keeps the GEOS geometry in synch with the context."""
|
||
|
gtag = self.gtag()
|
||
|
if gtag != self._gtag or self._is_empty:
|
||
|
self.empty()
|
||
|
if len(self.context) > 0:
|
||
|
self.__geom__, n = self.factory(self.context)
|
||
|
self._gtag = gtag
|
||
|
return self.__geom__
|
||
|
|
||
|
def gtag(self):
|
||
|
return hash(repr(self.context))
|
||
|
|
||
|
|
||
|
class PolygonProxy(CachingGeometryProxy):
|
||
|
|
||
|
@property
|
||
|
def _geom(self):
|
||
|
"""Keeps the GEOS geometry in synch with the context."""
|
||
|
gtag = self.gtag()
|
||
|
if gtag != self._gtag or self._is_empty:
|
||
|
self.empty()
|
||
|
self.__geom__, n = self.factory(self.context[0], self.context[1])
|
||
|
self._gtag = gtag
|
||
|
return self.__geom__
|