summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2022-09-18 12:35:53 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2022-09-18 12:35:53 +0200
commitbe5cb3e7679732fc4d93583c18af3a1df87e52d9 (patch)
tree40adf06eacda3d74c1120ad75e01d937aec180a7
parent2485e5e42df1e260d6d44788bddd7bf04122d953 (diff)
downloadIshtar-be5cb3e7679732fc4d93583c18af3a1df87e52d9.tar.bz2
Ishtar-be5cb3e7679732fc4d93583c18af3a1df87e52d9.zip
Utils - `create_osm_town` create town from OSM relation
-rw-r--r--CHANGES.md9
-rw-r--r--ishtar_common/utils.py64
-rw-r--r--ishtar_common/version.py4
3 files changed, 74 insertions, 3 deletions
diff --git a/CHANGES.md b/CHANGES.md
index 2e0e814da..a9a1f52b1 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,11 +1,18 @@
---
title: Ishtar changelog
-date: 2022-07-10
+date: 2022-09-18
---
Ishtar changelog
================
+v3.2.5 - 2022-09-18
+--------------------
+
+### Features ###
+
+- utils - `create_osm_town` create town from OSM relation
+
v3.2.4 - 2022-09-18
--------------------
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index bfb5d0e32..137f89469 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -2162,3 +2162,67 @@ def generate_pdf_preview(item, save=True, tempdir=None, page_number=None):
django_file = File(preview)
getattr(item, "image").save("page.jpg", django_file, save=True)
shutil.rmtree(tempdir)
+
+
+def get_create_merge_town(insee, default):
+ from ishtar_common.model_merging import merge_model_objects
+ Town = apps.get_model("ishtar_common", "Town")
+ q = Town.objects.filter(numero_insee=insee)
+ if q.count() > 1:
+ town = None
+ for t in q.all():
+ if not town:
+ town = t
+ else:
+ merge_model_objects(town, t)
+ else:
+ town, __ = Town.objects.get_or_create(
+ numero_insee=insee, defaults=default
+ )
+ return town
+
+
+OSM_URL = "http://polygons.openstreetmap.fr/get_geojson.py?id={}"
+OSM_REFRESH_URL = "http://polygons.openstreetmap.fr/?id={}"
+OSM_SIMPLIFY = "&params=0.000800-0.000200-0.000200"
+
+
+def create_osm_town(rel_id, name, numero_insee=None):
+ """
+ Create town from OSM relation
+
+ :param rel_id: OSM relation IS
+ :param name: "town" name
+ :param numero_insee: town reference by default OSM[rel_id]
+ :return: town
+ """
+ geojson, retry = None, 0
+ while not geojson and retry < 5:
+ response = requests.get(OSM_URL.format(rel_id))
+ retry += 1
+ try:
+ geojson = response.json()
+ except:
+ requests.get(OSM_REFRESH_URL.format(rel_id))
+ time.sleep(3)
+ if not geojson:
+ print("\nError on: " + OSM_URL.format(rel_id))
+ return
+ if len(geojson) > 50000:
+ response = requests.get(OSM_URL.format(rel_id) + OSM_SIMPLIFY)
+ try:
+ geojson_simplify = response.json()
+ geojson = geojson_simplify
+ except:
+ pass
+ default = {"name": name}
+ if not numero_insee:
+ numero_insee = f"OSM{rel_id}"
+ town = get_create_merge_town(numero_insee, default)
+ geom = GEOSGeometry(str(geojson))
+ if geom.geom_type == "GeometryCollection":
+ geom = geom[0]
+ town.limit = geom
+ town.center = town.limit.centroid
+ town.save()
+ return town
diff --git a/ishtar_common/version.py b/ishtar_common/version.py
index 59dda6a51..adde2c7e9 100644
--- a/ishtar_common/version.py
+++ b/ishtar_common/version.py
@@ -1,5 +1,5 @@
-# 3.2.4
-VERSION = (3, 2, 4)
+# 3.2.5
+VERSION = (3, 2, 5)
def get_version():