def _nearest(self, geom, exclusive): envelope = geom.envelope def callback(item1, item2, distance, userdata): try: callback_userdata = ctypes.cast(userdata, ctypes.py_object).value idx = ctypes.cast(item1, ctypes.py_object).value geom2 = ctypes.cast(item2, ctypes.py_object).value dist = ctypes.cast(distance, ctypes.POINTER(ctypes.c_double)) if callback_userdata["exclusive"] and self._geoms[idx].equals( geom2): dist[0] = sys.float_info.max else: lgeos.GEOSDistance(self._geoms[idx]._geom, geom2._geom, dist) return 1 except Exception: log.exception("Caught exception") return 0 item = lgeos.GEOSSTRtree_nearest_generic( self._tree, ctypes.py_object(geom), envelope._geom, lgeos.GEOSDistanceCallback(callback), ctypes.py_object({"exclusive": exclusive}), ) return ctypes.cast(item, ctypes.py_object).value
def nearest(self, geom): """ Get the nearest object in the index to a geometry object. Parameters ---------- geom : geometry object The query geometry Returns ------- geometry object The nearest geometry object in the index to `geom`. Will always only return *one* object even if several in the index are the minimum distance away. `None` if the index is empty. Examples -------- >>> from shapely.strtree import STRtree >>> from shapely.geometry import Point >>> tree = STRtree([Point(i, i) for i in range(10)]) >>> tree.nearest(Point(2.2, 2.2)).wkt 'POINT (2 2)' Will only return one object: >>> tree = STRtree ([Point(0, 0), Point(0, 0)]) >>> tree.nearest(Point(0, 0)).wkt 'POINT (0 0)' """ if self._n_geoms == 0: return None envelope = geom.envelope def callback(item1, item2, distance, userdata): try: geom1 = ctypes.cast(item1, ctypes.py_object).value geom2 = ctypes.cast(item2, ctypes.py_object).value dist = ctypes.cast(distance, ctypes.POINTER(ctypes.c_double)) lgeos.GEOSDistance(geom1._geom, geom2._geom, dist) return 1 except Exception: return 0 item = lgeos.GEOSSTRtree_nearest_generic(self._tree_handle, ctypes.py_object(geom), envelope._geom, \ lgeos.GEOSDistanceCallback(callback), None) result = ctypes.cast(item, ctypes.py_object).value return result
def nearest(self, geom): if self._n_geoms == 0: return None envelope = geom.envelope def callback(item1, item2, distance, userdata): try: geom1 = ctypes.cast(item1, ctypes.py_object).value geom2 = ctypes.cast(item2, ctypes.py_object).value dist = ctypes.cast(distance, ctypes.POINTER(ctypes.c_double)) lgeos.GEOSDistance(geom1._geom, geom2._geom, dist) return 1 except: return 0 item = lgeos.GEOSSTRtree_nearest_generic(self._tree_handle, ctypes.py_object(geom), envelope._geom, \ lgeos.GEOSDistanceCallback(callback), None) result = ctypes.cast(item, ctypes.py_object).value return result