Mercurial > dive4elements > river
diff flys-backend/contrib/shpimporter/utils.py @ 5379:61bf64b102bc mapgenfix
Merge with default branch
author | Christian Lins <christian.lins@intevation.de> |
---|---|
date | Fri, 22 Mar 2013 11:25:54 +0100 |
parents | 3f35d9db48c1 |
children |
line wrap: on
line diff
--- a/flys-backend/contrib/shpimporter/utils.py Wed Mar 06 14:14:15 2013 +0100 +++ b/flys-backend/contrib/shpimporter/utils.py Fri Mar 22 11:25:54 2013 +0100 @@ -1,8 +1,17 @@ import os import sys -from shpimporter import DEBUG, INFO, ERROR +import logging + +try: + from osgeo import ogr +except ImportError: + import ogr + +logger = logging.getLogger("utils") SHP='.shp' +SQL_SELECT_RIVER_ID="SELECT id FROM rivers WHERE name = %s" +SQL_SELECT_RIVER_ID_ORA="SELECT id FROM rivers WHERE name = :s" def findShapefiles(path): shapes = [] @@ -11,7 +20,7 @@ if len(files) == 0: continue - DEBUG("Processing directory '%s' with %i files " % (root, len(files))) + logger.debug("Processing directory '%s' with %i files " % (root, len(files))) for f in files: idx = f.find(SHP) @@ -20,6 +29,36 @@ return shapes +def getRiverId(dbconn, name, oracle): + """ + Returns the id of the river "name" + Dbconn must be a python database connection api compliant object + """ + cur = dbconn.cursor() + if oracle: + # This is stupid and shoudl not be neccessary. But I don't + # know how to make it work both ways. aheinecke - 02/2013 + stmt = SQL_SELECT_RIVER_ID_ORA + else: + stmt = SQL_SELECT_RIVER_ID + cur.execute(stmt, (getUTF8(name),)) + row = cur.fetchone() + if row: + return row[0] + else: + return 0 + +def getUTF8(string): + """ + Tries to convert the string to a UTF-8 encoding by first checking if it + is UTF-8 and then trying cp1252 + """ + try: + return unicode.encode(unicode(string, "UTF-8"), "UTF-8") + except UnicodeDecodeError: + # Probably European Windows names so lets try again + return unicode.encode(unicode(string, "cp1252"), "UTF-8") + def getUTF8Path(path): """ Tries to convert path to utf-8 by first checking the filesystemencoding @@ -31,3 +70,53 @@ except UnicodeDecodeError: # Probably European Windows names so lets try again return unicode.encode(unicode(path, "cp1252"), "UTF-8") + +WKB_MAP = { + ogr.wkb25Bit : 'wkb25Bit', + ogr.wkbGeometryCollection : 'wkbGeometryCollection', + ogr.wkbGeometryCollection25D :'wkbGeometryCollection25D', + ogr.wkbLineString : 'wkbLineString', + ogr.wkbLineString25D : 'wkbLineString25D', + ogr.wkbLinearRing : 'wkbLinearRing', + ogr.wkbMultiLineString : 'wkbMultiLineString', + ogr.wkbMultiLineString25D : 'wkbMultiLineString25D', + ogr.wkbMultiPoint : 'wkbMultiPoint', + ogr.wkbMultiPoint25D : 'wkbMultiPoint25D', + ogr.wkbMultiPolygon : 'wkbMultiPolygon', + ogr.wkbMultiPolygon25D : 'wkbMultiPolygon25D', + ogr.wkbNDR : 'wkbNDR', + ogr.wkbNone : 'wkbNone', + ogr.wkbPoint : 'wkbPoint', + ogr.wkbPoint25D : 'wkbPoint25D', + ogr.wkbPolygon : 'wkbPolygon', + ogr.wkbPolygon25D : 'wkbPolygon25D', + ogr.wkbUnknown : 'wkbUnknown', + ogr.wkbXDR : 'wkbXDR' +} + +def getWkbString(type): + return WKB_MAP.get(type) or "Unknown" + +def convertToMultiLine(feature): + """ + Converts a feature to a multiline feature. + """ + geometry = feature.GetGeometryRef() + # SRS information is lost while forcing to multiline + srs = geometry.GetSpatialReference() + geometry = ogr.ForceToMultiLineString(geometry) + geometry.AssignSpatialReference(srs) + feature.SetGeometry(geometry) + return feature + +def convertToMultiPolygon(feature): + """ + Converts a feature to a multiline feature. + """ + geometry = feature.GetGeometryRef() + # SRS information is lost while forcing to multiline + srs = geometry.GetSpatialReference() + geometry = ogr.ForceToMultiPolygon(geometry) + geometry.AssignSpatialReference(srs) + feature.SetGeometry(geometry) + return feature