diff options
Diffstat (limited to 'ishtar_common/models_common.py')
| -rw-r--r-- | ishtar_common/models_common.py | 46 | 
1 files changed, 46 insertions, 0 deletions
| diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index 9d71ae0dc..b72251f02 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -2359,6 +2359,52 @@ class GeoVectorData(Imported, OwnPerms):          profile = get_current_profile()          return profile.srs +    @classmethod +    def _get_geo_item_list(cls, q, current_geodata, url, precision, rounded): +        collection_id = [] +        items_id = [] +        q = q.values("main_geodata", "id") +        for item in q.distinct().all(): +            geodata_id = item["main_geodata"] +            if geodata_id not in current_geodata: +                collection_id.append(geodata_id) +                items_id.append(item["id"]) +                current_geodata.append(geodata_id) + +        collection = [] +        for idx in range(len(collection_id)): +            geo = json.loads(GeoVectorData.objects.get(pk=collection_id[idx]).geojson) +            geo_type = geo.get("type", None) +            url_geo = url.format(items_id[idx]) +            if geo_type == "FeatureCollection": +                for feat in geo["features"]: +                    if "properties" in feat: +                        feat["properties"]["url"] = url_geo +                collection += geo["features"] +            elif geo_type: +                if "properties" in geo: +                    geo["properties"]["url"] = url_geo +                collection.append(geo) + +        if not precision and rounded: +            precision = 6 +        r = re.compile(r"(\d+)\.(\d{6})(\d*)") +        new_collection = [] +        for feat in collection: +            geom_type = feat["geometry"].get("type", None) +            if geom_type == "Point": +                if precision is not None: +                    feat["geometry"]["coordinates"] = [ +                        round(feat["geometry"]["coordinates"][0], precision), +                        round(feat["geometry"]["coordinates"][1], precision), +                    ] +                if not (-90 <= feat["geometry"]["coordinates"][1] <= 90) or not ( +                        -180 <= feat["geometry"]["coordinates"][0] <= 180): +                    # probably a bad projection +                    continue +            new_collection.append(feat) +        return new_collection +      def get_geo_items(self, rounded=5):          dct = {"type": "Feature", "geometry": {},                 "properties": {"label": str(self)}} | 
