summaryrefslogtreecommitdiff
path: root/chimere/utils.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2012-09-17 11:06:56 +0200
committerÉtienne Loks <etienne.loks@peacefrogs.net>2012-09-17 11:06:56 +0200
commit432e3ee5db3745502e47091199d9677f00d69339 (patch)
treed0204ee4f4a328d9bb5589be6fbc548047ba4a32 /chimere/utils.py
parent36a48459497807c9299ef953f6fb8f6f8aa13f3d (diff)
downloadChimère-432e3ee5db3745502e47091199d9677f00d69339.tar.bz2
Chimère-432e3ee5db3745502e47091199d9677f00d69339.zip
Fixes for OSM export
Diffstat (limited to 'chimere/utils.py')
-rw-r--r--chimere/utils.py67
1 files changed, 50 insertions, 17 deletions
diff --git a/chimere/utils.py b/chimere/utils.py
index d61ad19..60b2dac 100644
--- a/chimere/utils.py
+++ b/chimere/utils.py
@@ -429,7 +429,8 @@ class ShapefileManager(ImportManager):
buff.close()
return filename, zip_stream
-RE_NODE = re.compile('node\[([^\]]*)\]')
+RE_HOOK = re.compile('\[([^\]]*)\]')
+
# manage deleted item from OSM
@@ -554,26 +555,58 @@ class OSMManager(ImportManager):
password=settings.CHIMERE_OSM_PASSWORD)
api.ChangesetCreate({u"comment": u"Import from Chimère %s" % \
get_version()})
- tag = RE_NODE.finddall(self.importer_instance.filtr)
- if not tag:
+ hooks = RE_HOOK.findall(self.importer_instance.filtr)
+ if not hooks:
return 0, _(u"Bad param")
- tag = tag[0].split('=')
- default_dct = {'tag':{tag[0]:tag[1]},
+ tags = {}
+ bbox = []
+ for hook in hooks:
+ key, value = hook.split('=')
+ if '*' in value or '|' in key or '|' in value:
+ continue
+ if key == 'bbox':
+ x1, y1, x2, y2 = [float(val) for val in value.split(',')]
+ bbox = GEOSGeometry(
+ 'POLYGON((%f %f,%f %f,%f %f,%f %f,%f %f))' % (
+ x1, y1, x2, y1, x2, y2, x1, y2, x1, y1), srid=4326)
+ continue
+ tags[key] = value
+ if not tags:
+ return 0, _(u"No non ambigious tag is defined in the XAPI request")
+ if not bbox:
+ return 0, _(u"No bounding box is defined in the XAPI request."\
+ u"If you are sure to manage the entire planet set the bounding box"\
+ u" to -180,-90,180,90")
+ default_dct = {'tag':tags,
'import_source':self.importer_instance.source}
- for idx, item in Marker.objects.filter(status='A',
- categories=self.importer_instance.categories.all()):
- dct = default_dct.update({
- 'name':item.name,
- 'lon':item.point.lon,
- 'lat':item.point.lat})
+ idx = -1
+ for idx, item in enumerate(Marker.objects.filter(status='A',
+ point__contained=bbox,
+ categories=self.importer_instance.categories.all(),
+ not_for_osm=False, modified_since_import=True).all()):
+ dct = default_dct.copy()
+ dct.update({'lon':item.point.x,
+ 'lat':item.point.y})
+ dct['tag']['name'] = item.name
node = None
- import_key = marker.get_key('OSM')
- if not import_key:
- node = OsmApi.NodeCreate(dct)
+ import_key = item.get_key('OSM')
+ updated = False
+ if import_key:
+ try:
+ dct['id'] = import_key
+ dct['version'] = item.import_version
+ node = api.NodeUpdate(dct)
+ updated = True
+ except OsmApi.ApiError, error:
+ if error.status == 404:
+ dct.pop('id')
+ dct.pop('version')
+ pass # if the node doesn't exist it is created
+ else:
+ raise
+ if not updated:
+ node = api.NodeCreate(dct)
item.set_key('OSM', node['id'])
- else:
- dct['id'] = import_key
- node = OsmApi.NodeUpdate(dct)
item.import_version = node['version']
item.save()
api.ChangesetClose()