diff options
Diffstat (limited to 'ishtar_common/utils.py')
-rw-r--r-- | ishtar_common/utils.py | 64 |
1 files changed, 64 insertions, 0 deletions
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 = "¶ms=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 |