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  | 
