OSM scripts:
* forgot to add the script and data before
This commit is contained in:
parent
013fe1835f
commit
41f4f00601
2 changed files with 17232 additions and 0 deletions
126
osm/rostock_import_height_2009/add_height.py
Executable file
126
osm/rostock_import_height_2009/add_height.py
Executable file
|
@ -0,0 +1,126 @@
|
|||
#!/usr/bin/env python
|
||||
#
|
||||
# This script requies OsmApi (http://wiki.openstreetmap.org/wiki/PythonOsmApi)
|
||||
#
|
||||
# download:
|
||||
# wget http://svn.openstreetmap.org/applications/utils/python_lib/OsmApi/OsmApi.py
|
||||
# run this script:
|
||||
# PYTHONPATH=. python THIS_SCRIPT_NAME <LIST_OF_WAY_IDs_AND_HEIGHTS
|
||||
#
|
||||
# The input file should contain the way ids in the first column and the height
|
||||
# in the second column separated by a space or tab.
|
||||
#
|
||||
|
||||
import OsmApi
|
||||
import sys
|
||||
import types
|
||||
|
||||
username = u"lars@systemausfall.org"
|
||||
password = u"testtest"
|
||||
|
||||
value_key = u"building:height"
|
||||
forbidden_tags = [value_key, u"height"]
|
||||
required_tags = [u"building"]
|
||||
bounding_box = {
|
||||
"min_lat": 54.027,
|
||||
"max_lat": 54.197,
|
||||
"min_lon": 11.984,
|
||||
"max_lon": 12.267,
|
||||
}
|
||||
|
||||
|
||||
def remove_trailing_zeros(text):
|
||||
value = text
|
||||
while (value.find(".") >= 0) and (value.endswith("0") or value.endswith(".")):
|
||||
value = value[:-1]
|
||||
return value
|
||||
|
||||
|
||||
def process_input_line(line):
|
||||
try:
|
||||
id, value = line.split()
|
||||
# convert the id string into a number
|
||||
id = int(id)
|
||||
# remove trailing zeros from input number
|
||||
value = remove_trailing_zeros(value)
|
||||
# all values are in meter
|
||||
value += " m"
|
||||
except ValueError:
|
||||
return None
|
||||
return (id, value)
|
||||
|
||||
|
||||
def read_id_value_file(filename):
|
||||
result = []
|
||||
try:
|
||||
if type(filename) is types.FileType:
|
||||
handle = filename
|
||||
else:
|
||||
handle = file(filename)
|
||||
for line in handle.readlines():
|
||||
item = process_input_line(line)
|
||||
if item is None:
|
||||
sys.stderr.write("Ignored invalid input line: %s\n" % str(line))
|
||||
else:
|
||||
result.append(item)
|
||||
handle.close()
|
||||
except IOError, err_msg:
|
||||
sys.stderr.write("Failed to open input file (%s): %s\n" % (filename, err_msg))
|
||||
return result
|
||||
|
||||
def validate_way(way, height, api):
|
||||
"""check if the given way is safe to be updated
|
||||
returns an error description string or an empty string (-> way is ok)
|
||||
"""
|
||||
# check for forbidden tags
|
||||
for forbid_tag in forbidden_tags:
|
||||
if way[u"tag"].has_key(forbid_tag):
|
||||
if forbid_tag == value_key:
|
||||
if height == way[u"tag"][forbid_tag]:
|
||||
return "tag already set correctly"
|
||||
else:
|
||||
return "tag already contains different value"
|
||||
else:
|
||||
return "contains forbidden tag '%s'" % forbid_tag
|
||||
# check for required tags
|
||||
for required_tag in required_tags:
|
||||
if not way[u"tag"].has_key(required_tag):
|
||||
return "missing required tag '%s'" % required_tag
|
||||
# check if all the nodes are within the bounding box
|
||||
for node_id in way[u"nd"]:
|
||||
node = api.NodeGet(node_id)
|
||||
if (node[u"lat"] < bounding_box["min_lat"]) or (node[u"lat"] > bounding_box["max_lat"]):
|
||||
return "latitude of node %d out of range" % node_id
|
||||
if (node[u"lon"] < bounding_box["min_lon"]) or (node[u"lon"] > bounding_box["max_lon"]):
|
||||
return "longitude of node %d out of range" % node_id
|
||||
return ""
|
||||
|
||||
def update_way(way, height):
|
||||
way[u"tag"][value_key] = height
|
||||
return way
|
||||
|
||||
def send_changeset(api, changes):
|
||||
api.ChangesetCreate({u"note": u"Importing heights of houses from KVL Rostock"})
|
||||
for change in changes:
|
||||
api.WayUpdate(change)
|
||||
api.ChangesetClose()
|
||||
|
||||
if __name__ == "__main__":
|
||||
# read the input file content
|
||||
input = read_id_value_file(sys.stdin)
|
||||
|
||||
api = OsmApi.OsmApi(username=username, password=password)
|
||||
|
||||
changes = []
|
||||
for item in input:
|
||||
way = api.WayGet(item[0])
|
||||
warning = validate_way(way, item[1], api)
|
||||
if not warning:
|
||||
changes.append(update_way(way, item[1]))
|
||||
print "Accepting valid way (%d/%s): %s" % (item[0], item[1], str(way))
|
||||
else:
|
||||
print "Ignoring invalid way (%d/%s): %s (%s)" % (item[0], item[1], warning, str(way))
|
||||
|
||||
if len(changes) > 0:
|
||||
send_changeset(api, changes)
|
||||
|
17106
osm/rostock_import_height_2009/list_of_house_heights.list
Normal file
17106
osm/rostock_import_height_2009/list_of_house_heights.list
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue