def _validate_geometry(geom): if geom is not None: simple = models.DBSession.query(func.ST_IsSimple(geom)).scalar() if not simple: raise TopologicalError("Not simple") valid = models.DBSession.query(func.ST_IsValid(geom)).scalar() if not valid: reason = models.DBSession.query(func.ST_IsValidReason(geom)).scalar() raise TopologicalError(reason)
def _validate_geometry(self, geom): validate = self.settings.get("geometry_validation", False) if validate and geom is not None: simple = DBSession.query(func.ST_IsSimple(geom)).scalar() if not simple: raise TopologicalError("Not simple") valid = DBSession.query(func.ST_IsValid(geom)).scalar() if not valid: reason = DBSession.query(func.ST_IsValidReason(geom)).scalar() raise TopologicalError(reason)
def add_airspace(self, country_code, airspace_class, name, base, top, geom_str): try: geom = loads(geom_str) except ReadingError: print name + "(" + airspace_class + ") is not a polygon (maybe not enough points?)" return False # orient polygon clockwise geom = polygon.orient(geom, sign=-1) if not airspace_class: print name + " has no airspace class" return False base = self.normalise_height(base, name) top = self.normalise_height(top, name) flightlevel_re = re.compile(r'^FL (\d+)$') match = flightlevel_re.match(base) if match and int(match.group(1)) >= 200: print name + " has it's base above FL 200 and is therefore disregarded" return False airspace = Airspace() airspace.country_code = country_code airspace.airspace_class = airspace_class airspace.name = name airspace.base = base airspace.top = top # Check geometry type, disregard everything except POLYGON if geom.geom_type != 'Polygon': print name + " is not a polygon (it's a " + geom.geom_type + ")" return False wkb = from_shape(geom, srid=4326) # Try to fix invalid (self-intersecting) geometries valid_dump = (func.ST_Dump(func.ST_MakeValid(wkb))).geom valid_query = db.session.query(func.ST_SetSRID(valid_dump, 4326)).order_by(func.ST_Area(valid_dump).desc()).first() if not valid_query: print 'Error importing ' + name print 'Could not validate geometry' return False else: wkb = valid_query[0] geom_type = db.session.query(func.ST_GeometryType(wkb)).first()[0] if geom_type != 'ST_Polygon': print name + " got some errors makeing it valid..." return False tolerance = 0.0000001 simplify = lambda x: func.ST_SimplifyPreserveTopology(x, tolerance) airspace.the_geom = case( [ (func.ST_IsValid(wkb), wkb), (func.ST_IsValid(simplify(wkb)), simplify(wkb)), ], else_=None) db.session.add(airspace) return True