def _bbox_2_wkt(bbox, srid): '''Given a bbox dictionary, return a WKTSpatialElement, transformed into the database\'s CRS if necessary. returns e.g. WKTSpatialElement("POLYGON ((2 0, 2 1, 7 1, 7 0, 2 0))", 4326) :param bbox: :param srid: ''' db_srid = int(toolkit.config.get(u'ckan.spatial.srid', u'4326')) bbox_template = Template( u'POLYGON (($minx $miny, $minx $maxy, $maxx $maxy, $maxx $miny, $minx $miny))' ) wkt = bbox_template.substitute(minx=bbox[u'minx'], miny=bbox[u'miny'], maxx=bbox[u'maxx'], maxy=bbox[u'maxy']) if srid and srid != db_srid: # Input geometry needs to be transformed to the one used on the database input_geometry = ST_Transform(WKTElement(wkt, srid), db_srid) else: input_geometry = WKTElement(wkt, db_srid) return input_geometry
def test_update_extent(self): package = factories.Dataset() geojson = json.loads(self.geojson_examples["point"]) shape = asShape(geojson) package_extent = PackageExtent( package_id=package["id"], the_geom=WKTElement(shape.wkt, self.db_srid), ) package_extent.save() if legacy_geoalchemy: assert( Session.scalar(package_extent.the_geom.geometry_type) == "ST_Point" ) else: from sqlalchemy import func assert( Session.query( func.ST_GeometryType(package_extent.the_geom) ).first()[0] == "ST_Point" ) # Update the geometry (Point -> Polygon) geojson = json.loads(self.geojson_examples["polygon"]) shape = asShape(geojson) package_extent.the_geom = WKTElement(shape.wkt, self.db_srid) package_extent.save() assert(package_extent.package_id == package["id"]) if legacy_geoalchemy: assert( Session.scalar(package_extent.the_geom.geometry_type) == "ST_Polygon" ) assert( Session.scalar(package_extent.the_geom.srid) == self.db_srid ) else: assert( Session.query( func.ST_GeometryType(package_extent.the_geom) ).first()[0] == "ST_Polygon" ) assert(package_extent.the_geom.srid == self.db_srid)
def test_create_extent(self): package = factories.Dataset() geojson = json.loads(self.geojson_examples['point']) shape = asShape(geojson) package_extent = PackageExtent(package_id=package['id'], the_geom=WKTElement( shape.wkt, self.db_srid)) package_extent.save() assert_equals(package_extent.package_id, package['id']) if legacy_geoalchemy: assert_equals(Session.scalar(package_extent.the_geom.x), geojson['coordinates'][0]) assert_equals(Session.scalar(package_extent.the_geom.y), geojson['coordinates'][1]) assert_equals(Session.scalar(package_extent.the_geom.srid), self.db_srid) else: from sqlalchemy import func assert_equals( Session.query(func.ST_X(package_extent.the_geom)).first()[0], geojson['coordinates'][0]) assert_equals( Session.query(func.ST_Y(package_extent.the_geom)).first()[0], geojson['coordinates'][1]) assert_equals(package_extent.the_geom.srid, self.db_srid)
def test_create_extent(self): package = factories.Dataset() geojson = json.loads(self.geojson_examples["point"]) shape = asShape(geojson) package_extent = PackageExtent( package_id=package["id"], the_geom=WKTElement(shape.wkt, self.db_srid), ) package_extent.save() assert (package_extent.package_id == package["id"]) if legacy_geoalchemy: assert (Session.scalar( package_extent.the_geom.x) == geojson["coordinates"][0]) assert (Session.scalar( package_extent.the_geom.y) == geojson["coordinates"][1]) assert (Session.scalar( package_extent.the_geom.srid) == self.db_srid) else: from sqlalchemy import func assert (Session.query(func.ST_X(package_extent.the_geom)).first() [0] == geojson["coordinates"][0]) assert (Session.query(func.ST_Y(package_extent.the_geom)).first() [0] == geojson["coordinates"][1]) assert (package_extent.the_geom.srid == self.db_srid)
def test_update_extent(self): ''' ''' package = factories.Dataset() geojson = json.loads(self.geojson_examples[u'point']) shape = asShape(geojson) package_extent = PackageExtent(package_id=package[u'id'], the_geom=WKTElement(shape.wkt, self.db_srid)) package_extent.save() if legacy_geoalchemy: assert_equals( Session.scalar(package_extent.the_geom.geometry_type), u'ST_Point') else: from sqlalchemy import func assert_equals( Session.query( func.ST_GeometryType(package_extent.the_geom)).first()[0], u'ST_Point') # Update the geometry (Point -> Polygon) geojson = json.loads(self.geojson_examples[u'polygon']) shape = asShape(geojson) package_extent.the_geom = WKTElement(shape.wkt, self.db_srid) package_extent.save() assert_equals(package_extent.package_id, package[u'id']) if legacy_geoalchemy: assert_equals( Session.scalar(package_extent.the_geom.geometry_type), u'ST_Polygon') assert_equals( Session.scalar(package_extent.the_geom.srid), self.db_srid) else: assert_equals( Session.query( func.ST_GeometryType(package_extent.the_geom)).first()[0], u'ST_Polygon') assert_equals(package_extent.the_geom.srid, self.db_srid)
def _get_extent_object(self, geometry): ''' :param geometry: ''' if isinstance(geometry, basestring): geometry = json.loads(geometry) shape = asShape(geometry) return PackageExtent(package_id=u'xxx', the_geom=WKTElement(shape.wkt, 4326))
def save_package_extent(package_id, geometry=None, srid=None): '''Adds, updates or deletes the package extent geometry. package_id: Package unique identifier geometry: a Python object implementing the Python Geo Interface (i.e a loaded GeoJSON object) srid: The spatial reference in which the geometry is provided. If None, it defaults to the DB srid. Will throw ValueError if the geometry object does not provide a geo interface. The responsibility for calling model.Session.commit() is left to the caller. :param package_id: :param geometry: (Default value = None) :param srid: (Default value = None) ''' db_srid = int(toolkit.config.get(u'ckan.spatial.srid', u'4326')) existing_package_extent = Session.query(PackageExtent).filter( PackageExtent.package_id == package_id).first() if geometry: shape = asShape(geometry) if not srid: srid = db_srid package_extent = PackageExtent(package_id=package_id, the_geom=WKTElement(shape.wkt, srid)) # Check if extent exists if existing_package_extent: # If extent exists but we received no geometry, we'll delete the existing one if not geometry: existing_package_extent.delete() log.debug(u'Deleted extent for package %s' % package_id) else: # Check if extent changed if not compare_geometry_fields(package_extent.the_geom, existing_package_extent.the_geom): # Update extent existing_package_extent.the_geom = package_extent.the_geom existing_package_extent.save() log.debug(u'Updated extent for package %s' % package_id) else: log.debug(u'Extent for package %s unchanged' % package_id) elif geometry: # Insert extent Session.add(package_extent) log.debug(u'Created new extent for package %s' % package_id)
def _get_extent_object(self, geometry): if isinstance(geometry, six.string_types): geometry = json.loads(geometry) shape = asShape(geometry) return PackageExtent(package_id="xxx", the_geom=WKTElement(shape.wkt, 4326))