diff options
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 |
commit | 432e3ee5db3745502e47091199d9677f00d69339 (patch) | |
tree | d0204ee4f4a328d9bb5589be6fbc548047ba4a32 /chimere/utils.py | |
parent | 36a48459497807c9299ef953f6fb8f6f8aa13f3d (diff) | |
download | Chimère-432e3ee5db3745502e47091199d9677f00d69339.tar.bz2 Chimère-432e3ee5db3745502e47091199d9677f00d69339.zip |
Fixes for OSM export
Diffstat (limited to 'chimere/utils.py')
-rw-r--r-- | chimere/utils.py | 67 |
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() |