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_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_new(self): name = "test-spatial-dataset-1" offset = url_for(controller="package", action="new") res = self.app.get(offset, extra_environ=self.extra_environ) assert "Add - Datasets" in res fv = res.forms["dataset-edit"] prefix = "" fv[prefix + "name"] = name fv[prefix + "extras__0__key"] = u"spatial" fv[prefix + "extras__0__value"] = self.geojson_examples["point"] res = fv.submit("save", extra_environ=self.extra_environ) assert not "Error" in res, res package = Package.get(name) # Check that a PackageExtent object has been created package_extent = Session.query(PackageExtent).filter(PackageExtent.package_id == package.id).first() geojson = json.loads(self.geojson_examples["point"]) assert package_extent assert package_extent.package_id == package.id 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
def test_update_extent(self): package = Package.get('annakarenina') geojson = json.loads(self.geojson_examples['point']) shape = asShape(geojson) package_extent = PackageExtent(package_id=package.id, the_geom=WKTSpatialElement( shape.wkt, self.db_srid)) package_extent.save() assert Session.scalar( package_extent.the_geom.geometry_type) == 'ST_Point' # Update the geometry (Point -> Polygon) geojson = json.loads(self.geojson_examples['polygon']) shape = asShape(geojson) package_extent.the_geom = WKTSpatialElement(shape.wkt, self.db_srid) package_extent.save() assert package_extent.package_id == package.id assert Session.scalar( package_extent.the_geom.geometry_type) == 'ST_Polygon' assert Session.scalar(package_extent.the_geom.srid) == self.db_srid
def test_new(self): name = 'test-spatial-dataset-1' offset = url_for(controller='package', action='new') res = self.app.get(offset, extra_environ=self.extra_environ) assert 'Add - Datasets' in res fv = res.forms['dataset-edit'] prefix = '' fv[prefix + 'name'] = name fv[prefix + 'extras__0__key'] = u'spatial' fv[prefix + 'extras__0__value'] = self.geojson_examples['point'] res = fv.submit('save', extra_environ=self.extra_environ) assert not 'Error' in res, res package = Package.get(name) # Check that a PackageExtent object has been created package_extent = Session.query(PackageExtent).filter( PackageExtent.package_id == package.id).first() geojson = json.loads(self.geojson_examples['point']) assert package_extent assert package_extent.package_id == package.id 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
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_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 = Package.get('annakarenina') assert package geojson = json.loads(self.geojson_examples['point']) shape = asShape(geojson) package_extent = PackageExtent(package_id=package.id,the_geom=WKTSpatialElement(shape.wkt, self.db_srid)) package_extent.save() assert package_extent.package_id == package.id 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
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. ''' db_srid = int(config.get('ckan.spatial.srid', '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=WKTSpatialElement( 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('Deleted extent for package %s' % package_id) else: # Check if extent changed if Session.scalar(package_extent.the_geom.wkt) <> Session.scalar( existing_package_extent.the_geom.wkt): # Update extent existing_package_extent.the_geom = package_extent.the_geom existing_package_extent.save() log.debug('Updated extent for package %s' % package_id) else: log.debug('Extent for package %s unchanged' % package_id) elif geometry: # Insert extent Session.add(package_extent) log.debug('Created new extent for package %s' % package_id)
def test_edit(self): name = 'annakarenina' offset = url_for(controller='package', action='edit', id=name) res = self.app.get(offset, extra_environ=self.extra_environ) assert 'Edit - Datasets' in res fv = res.forms['dataset-edit'] prefix = '' fv[prefix + 'extras__1__key'] = u'spatial' fv[prefix + 'extras__1__value'] = self.geojson_examples['point'] res = fv.submit('save', extra_environ=self.extra_environ) assert not 'Error' in res, res package = Package.get(name) # Check that a PackageExtent object has been created package_extent = Session.query(PackageExtent).filter( PackageExtent.package_id == package.id).first() geojson = json.loads(self.geojson_examples['point']) assert package_extent assert package_extent.package_id == package.id 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 # Update the spatial extra offset = url_for(controller='package', action='edit', id=name) res = self.app.get(offset, extra_environ=self.extra_environ) assert 'Edit - Datasets' in res fv = res.forms['dataset-edit'] prefix = '' fv[prefix + 'extras__1__value'] = self.geojson_examples['polygon'] res = fv.submit('save', extra_environ=self.extra_environ) assert not 'Error' in res, res # Check that the PackageExtent object has been updated package_extent = Session.query(PackageExtent).filter( PackageExtent.package_id == package.id).first() assert package_extent assert package_extent.package_id == package.id assert Session.scalar( package_extent.the_geom.geometry_type) == 'ST_Polygon' assert Session.scalar(package_extent.the_geom.srid) == self.db_srid
def test_spatial_extra_edit(self): ''' ''' app = self._get_test_app() user = factories.User() env = {u'REMOTE_USER': user[u'name'].encode(u'ascii')} dataset = factories.Dataset(user=user) offset = toolkit.url_for(controller=u'package', action=u'edit', id=dataset[u'id']) res = app.get(offset, extra_environ=env) form = res.forms[1] form[u'extras__0__key'] = u'spatial' form[u'extras__0__value'] = self.geojson_examples[u'point'] res = helpers.submit_and_follow(app, form, env, u'save') assert u'Error' not in res, res res = app.get(offset, extra_environ=env) form = res.forms[1] form[u'extras__0__key'] = u'spatial' form[u'extras__0__value'] = self.geojson_examples[u'polygon'] res = helpers.submit_and_follow(app, form, env, u'save') assert u'Error' not in res, res package_extent = Session.query(PackageExtent) \ .filter(PackageExtent.package_id == dataset[u'id']).first() assert_equals(package_extent.package_id, dataset[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: from sqlalchemy import func 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 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. ''' db_srid = int(config.get('ckan.spatial.srid', '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=WKTSpatialElement(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('Deleted extent for package %s' % package_id) else: # Check if extent changed if Session.scalar(package_extent.the_geom.wkt) <> Session.scalar(existing_package_extent.the_geom.wkt): # Update extent existing_package_extent.the_geom = package_extent.the_geom existing_package_extent.save() log.debug('Updated extent for package %s' % package_id) else: log.debug('Extent for package %s unchanged' % package_id) elif geometry: # Insert extent Session.add(package_extent) log.debug('Created new extent for package %s' % package_id)
def test_spatial_extra_edit(self): app = self._get_test_app() user = factories.User() env = {'REMOTE_USER': user['name'].encode('ascii')} dataset = factories.Dataset(user=user) offset = url_for(controller='package', action='edit', id=dataset['id']) res = app.get(offset, extra_environ=env) form = res.forms[1] form['extras__0__key'] = u'spatial' form['extras__0__value'] = self.geojson_examples['point'] res = helpers.submit_and_follow(app, form, env, 'save') assert 'Error' not in res, res res = app.get(offset, extra_environ=env) form = res.forms[1] form['extras__0__key'] = u'spatial' form['extras__0__value'] = self.geojson_examples['polygon'] res = helpers.submit_and_follow(app, form, env, 'save') assert 'Error' not in res, res package_extent = Session.query(PackageExtent) \ .filter(PackageExtent.package_id == dataset['id']).first() assert_equals(package_extent.package_id, dataset['id']) if legacy_geoalchemy: assert_equals( Session.scalar(package_extent.the_geom.geometry_type), 'ST_Polygon') assert_equals( Session.scalar(package_extent.the_geom.srid), self.db_srid) else: from sqlalchemy import func assert_equals( Session.query( func.ST_GeometryType(package_extent.the_geom)).first()[0], 'ST_Polygon') assert_equals(package_extent.the_geom.srid, self.db_srid)
def test_edit(self): name = "annakarenina" offset = url_for(controller="package", action="edit", id=name) res = self.app.get(offset, extra_environ=self.extra_environ) assert "Edit - Datasets" in res fv = res.forms["dataset-edit"] prefix = "" fv[prefix + "extras__1__key"] = u"spatial" fv[prefix + "extras__1__value"] = self.geojson_examples["point"] res = fv.submit("save", extra_environ=self.extra_environ) assert not "Error" in res, res package = Package.get(name) # Check that a PackageExtent object has been created package_extent = Session.query(PackageExtent).filter(PackageExtent.package_id == package.id).first() geojson = json.loads(self.geojson_examples["point"]) assert package_extent assert package_extent.package_id == package.id 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 # Update the spatial extra offset = url_for(controller="package", action="edit", id=name) res = self.app.get(offset, extra_environ=self.extra_environ) assert "Edit - Datasets" in res fv = res.forms["dataset-edit"] prefix = "" fv[prefix + "extras__1__value"] = self.geojson_examples["polygon"] res = fv.submit("save", extra_environ=self.extra_environ) assert not "Error" in res, res # Check that the PackageExtent object has been updated package_extent = Session.query(PackageExtent).filter(PackageExtent.package_id == package.id).first() assert package_extent assert package_extent.package_id == package.id assert Session.scalar(package_extent.the_geom.geometry_type) == "ST_Polygon" assert Session.scalar(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 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_equals( Session.scalar(package_extent.the_geom.geometry_type), 'ST_Point') else: from sqlalchemy import func assert_equals( 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_equals(package_extent.package_id, package['id']) if legacy_geoalchemy: assert_equals( Session.scalar(package_extent.the_geom.geometry_type), '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], 'ST_Polygon') assert_equals(package_extent.the_geom.srid, self.db_srid)
def test_update_extent(self): package = Package.get('annakarenina') geojson = json.loads(self.geojson_examples['point']) shape = asShape(geojson) package_extent = PackageExtent(package_id=package.id,the_geom=WKTSpatialElement(shape.wkt, self.db_srid)) package_extent.save() assert Session.scalar(package_extent.the_geom.geometry_type) == 'ST_Point' # Update the geometry (Point -> Polygon) geojson = json.loads(self.geojson_examples['polygon']) shape = asShape(geojson) package_extent.the_geom=WKTSpatialElement(shape.wkt, self.db_srid) package_extent.save() assert package_extent.package_id == package.id assert Session.scalar(package_extent.the_geom.geometry_type) == 'ST_Polygon' assert Session.scalar(package_extent.the_geom.srid) == self.db_srid
def test_spatial_extra(self): app = self._get_test_app() user = factories.User() env = {'REMOTE_USER': user['name'].encode('ascii')} dataset = factories.Dataset(user=user) offset = url_for(controller='package', action='edit', id=dataset['id']) res = app.get(offset, extra_environ=env) form = res.forms[1] form['extras__0__key'] = u'spatial' form['extras__0__value'] = self.geojson_examples['point'] res = helpers.submit_and_follow(app, form, env, 'save') assert 'Error' not in res, res package_extent = Session.query(PackageExtent) \ .filter(PackageExtent.package_id == dataset['id']).first() geojson = json.loads(self.geojson_examples['point']) assert_equals(package_extent.package_id, dataset['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 compare_geometry_fields(geom_field1, geom_field2): return Session.scalar(ST_Equals(geom_field1, geom_field2))