예제 #1
0
 def __getitem__(self, key):
     self._update()
     dx = c_double()
     dy = c_double()
     dz = c_double()
     m = self.__len__()
     has_z = self._ndim == 3
     if isinstance(key, int):
         if key + m < 0 or key >= m:
             raise IndexError("index out of range")
         if key < 0:
             i = m + key
         else:
             i = key
         lgeos.GEOSCoordSeq_getX(self._cseq, i, byref(dx))
         lgeos.GEOSCoordSeq_getY(self._cseq, i, byref(dy))
         if has_z:
             lgeos.GEOSCoordSeq_getZ(self._cseq, i, byref(dz))
             return (dx.value, dy.value, dz.value)
         else:
             return (dx.value, dy.value)
     elif isinstance(key, slice):
         res = []
         start, stop, stride = key.indices(m)
         for i in range(start, stop, stride):
             lgeos.GEOSCoordSeq_getX(self._cseq, i, byref(dx))
             lgeos.GEOSCoordSeq_getY(self._cseq, i, byref(dy))
             if has_z:
                 lgeos.GEOSCoordSeq_getZ(self._cseq, i, byref(dz))
                 res.append((dx.value, dy.value, dz.value))
             else:
                 res.append((dx.value, dy.value))
         return res
     else:
         raise TypeError("key must be an index or slice")
예제 #2
0
 def xy(self):
     """X and Y arrays"""
     self._update()
     m = self.__len__()
     x = array('d')
     y = array('d')
     temp = c_double()
     for i in range(m):
         lgeos.GEOSCoordSeq_getX(self._cseq, i, byref(temp))
         x.append(temp.value)
         lgeos.GEOSCoordSeq_getY(self._cseq, i, byref(temp))
         y.append(temp.value)
     return x, y
예제 #3
0
 def __iter__(self):
     self._update()
     dx = c_double()
     dy = c_double()
     dz = c_double()
     has_z = self._ndim == 3
     for i in range(self.__len__()):
         lgeos.GEOSCoordSeq_getX(self._cseq, i, byref(dx))
         lgeos.GEOSCoordSeq_getY(self._cseq, i, byref(dy))
         if has_z:
             lgeos.GEOSCoordSeq_getZ(self._cseq, i, byref(dz))
             yield (dx.value, dy.value, dz.value)
         else:
             yield (dx.value, dy.value)
예제 #4
0
 def ctypes(self):
     self._update()
     has_z = self._ndim == 3
     n = self._ndim
     m = self.__len__()
     array_type = c_double * (m * n)
     data = array_type()
     temp = c_double()
     for i in range(m):
         lgeos.GEOSCoordSeq_getX(self._cseq, i, byref(temp))
         data[n * i] = temp.value
         lgeos.GEOSCoordSeq_getY(self._cseq, i, byref(temp))
         data[n * i + 1] = temp.value
         if has_z:
             lgeos.GEOSCoordSeq_getZ(self._cseq, i, byref(temp))
             data[n * i + 2] = temp.value
     return data
예제 #5
0
 def ctypes(self):
     if not self._ctypes_data:
         temp = c_double()
         n = self._ndim
         m = len(self.geoms)
         array_type = c_double * (m * n)
         data = array_type()
         for i in range(m):
             g = self.geoms[i]._geom
             cs = lgeos.GEOSGeom_getCoordSeq(g)
             lgeos.GEOSCoordSeq_getX(cs, 0, byref(temp))
             data[n*i] = temp.value
             lgeos.GEOSCoordSeq_getY(cs, 0, byref(temp))
             data[n*i+1] = temp.value
             if n == 3: # TODO: use hasz
                 lgeos.GEOSCoordSeq_getZ(cs, 0, byref(temp))
                 data[n*i+2] = temp.value
         self._ctypes_data = data
     return self._ctypes_data
예제 #6
0
 def __call__(self, this):
     self._validate(this)
     env = this.envelope
     if env.geom_type == 'Point':
         return env.bounds
     cs = lgeos.GEOSGeom_getCoordSeq(env.exterior._geom)
     cs_len = c_uint(0)
     lgeos.GEOSCoordSeq_getSize(cs, byref(cs_len))
     minx = 1.e+20
     maxx = -1e+20
     miny = 1.e+20
     maxy = -1e+20
     temp = c_double()
     for i in range(cs_len.value):
         lgeos.GEOSCoordSeq_getX(cs, i, byref(temp))
         x = temp.value
         if x < minx: minx = x
         if x > maxx: maxx = x
         lgeos.GEOSCoordSeq_getY(cs, i, byref(temp))
         y = temp.value
         if y < miny: miny = y
         if y > maxy: maxy = y
     return (minx, miny, maxx, maxy)