Created
July 11, 2012 11:09
-
-
Save gka/3089720 to your computer and use it in GitHub Desktop.
Joins OSM road segments that share the same name
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from psycopg2 import connect | |
from shapely.wkb import loads, dumps | |
from shapely.ops import linemerge | |
from osgeo import ogr | |
from osgeo.osr import SpatialReference | |
import os | |
db = connect('dbname=osm') | |
cur = db.cursor() | |
cur.execute('SELECT way, name, ST_SRID(way) FROM planet_osm_roads WHERE "highway" = \'secondary\'') | |
streetLines = {} | |
maxLen = 0 | |
srid = None | |
for way, name, _srid in cur: | |
if name is None: | |
name = 'n/a' | |
if name not in streetLines: | |
streetLines[name] = [] | |
maxLen = max(maxLen, len(name)) | |
streetLines[name].append(loads(way.decode('hex'))) | |
if srid is None: | |
srid = _srid | |
elif srid != _srid: | |
raise Exception('mulitple spatial references found in table') | |
for name in streetLines: | |
geometry = linemerge(streetLines[name]) | |
geoms = hasattr(geometry, 'geoms') and geometry.geoms or [geometry] | |
streetLines[name] = geoms | |
if os.path.exists('secondary-streets.shp'): | |
os.remove('secondary-streets.shp') | |
# store as shapefile | |
driver = ogr.GetDriverByName('ESRI Shapefile') | |
source = driver.CreateDataSource('secondary-streets.shp') | |
srs = SpatialReference() | |
srs.ImportFromEPSG(srid) | |
layer = source.CreateLayer('default', srs, ogr.wkbLineString) | |
# add field definition for street names | |
nameField = ogr.FieldDefn('NAME', ogr.OFTString) | |
nameField.SetWidth(maxLen) | |
layer.CreateField(nameField) | |
feat = ogr.Feature(layer.GetLayerDefn()) | |
for name in streetLines: | |
for line in streetLines[name]: | |
feat = ogr.Feature(layer.GetLayerDefn()) | |
feat.SetField(nameField.name, name) | |
geom = ogr.CreateGeometryFromWkb(dumps(line)) | |
feat.SetGeometry(geom) | |
layer.CreateFeature(feat) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment