feat: support all types of geometry types
This commit is contained in:
		@@ -68,6 +68,50 @@ def https(value):
 | 
				
			|||||||
        return None
 | 
					        return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_center_coordinates(geometry):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    Given a GeoJSON geometry dict, return (longitude, latitude)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    If a shape, calculate the center, else reurn the point
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    geom_type = geometry["type"]
 | 
				
			||||||
 | 
					    coordinates = geometry["coordinates"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if geom_type == "Point":
 | 
				
			||||||
 | 
					        return coordinates[0], coordinates[1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    elif geom_type == "LineString":
 | 
				
			||||||
 | 
					        return calc_coordinate_center(coordinates)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    elif geom_type == "Polygon":
 | 
				
			||||||
 | 
					        outer_ring = coordinates[0]
 | 
				
			||||||
 | 
					        return calc_coordinate_center(outer_ring)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        raise ValueError(f"Unsupported geometry type: {geom_type}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def calc_coordinate_center(coordinates):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    Calculates the center as the arithmetic mean of the list of coordinates.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Not perfect because earth is a sphere (citation needed) but good enough.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    if not coordinates:
 | 
				
			||||||
 | 
					        return None, None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    lon_sum = 0.0
 | 
				
			||||||
 | 
					    lat_sum = 0.0
 | 
				
			||||||
 | 
					    count = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for lon, lat in coordinates:
 | 
				
			||||||
 | 
					        lon_sum += lon
 | 
				
			||||||
 | 
					        lat_sum += lat
 | 
				
			||||||
 | 
					        count += 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return lon_sum / count, lat_sum / count
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def main():
 | 
					def main():
 | 
				
			||||||
    api_token, instance, data_file = get_config()
 | 
					    api_token, instance, data_file = get_config()
 | 
				
			||||||
    # Set headers and endpoint
 | 
					    # Set headers and endpoint
 | 
				
			||||||
@@ -77,23 +121,28 @@ def main():
 | 
				
			|||||||
    with open(data_file, encoding="utf8") as f:
 | 
					    with open(data_file, encoding="utf8") as f:
 | 
				
			||||||
        d = json.load(f)
 | 
					        d = json.load(f)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for idx, tierheim in tqdm(enumerate(d["features"])):
 | 
					    skipped_low_quality = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    tierheime = d["features"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for idx, tierheim in enumerate(tierheime):
 | 
				
			||||||
        # Check if data is low quality
 | 
					        # Check if data is low quality
 | 
				
			||||||
        if "name" not in tierheim["properties"].keys() or "addr:city" not in tierheim["properties"].keys():
 | 
					        if "name" not in tierheim["properties"].keys() or "addr:city" not in tierheim["properties"].keys():
 | 
				
			||||||
 | 
					            skipped_low_quality = skipped_low_quality + 1
 | 
				
			||||||
            continue
 | 
					            continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Check if rescue organization exits
 | 
					        # Check if rescue organization exits
 | 
				
			||||||
        search_data = {"external_source_identifier": "OSM",
 | 
					        search_data = {"external_source_identifier": "OSM",
 | 
				
			||||||
                       "external_object_identifier": f"{tierheim["id"]}"}
 | 
					                       "external_object_identifier": f"{tierheim["id"]}"}
 | 
				
			||||||
        search_result = requests.get(f"{instance}/api/organizations", json=search_data, headers=h)
 | 
					        search_result = requests.get(f"{instance}/api/organizations", params=search_data, headers=h)
 | 
				
			||||||
        if search_result.status_code == 200:
 | 
					        if search_result.status_code == 200:
 | 
				
			||||||
            print(f"{tierheim["properties"]["name"]} already exists.")
 | 
					            print(f"{tierheim["properties"]["name"]} already exists.")
 | 
				
			||||||
            continue
 | 
					            continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        location_data = {
 | 
					        location_data = {
 | 
				
			||||||
            "place_id": tierheim["id"],
 | 
					            "place_id": tierheim["id"],
 | 
				
			||||||
            "latitude": tierheim["geometry"]["coordinates"][0][0][0],
 | 
					            "longitude": get_center_coordinates(tierheim["geometry"])[0],
 | 
				
			||||||
            "longitude": tierheim["geometry"]["coordinates"][0][0][1],
 | 
					            "latitude": get_center_coordinates(tierheim["geometry"])[1],
 | 
				
			||||||
            "name": tierheim["properties"]["name"],
 | 
					            "name": tierheim["properties"]["name"],
 | 
				
			||||||
            "city": tierheim["properties"]["addr:city"],
 | 
					            "city": tierheim["properties"]["addr:city"],
 | 
				
			||||||
            "housenumber": get_or_none(tierheim, "addr:housenumber"),
 | 
					            "housenumber": get_or_none(tierheim, "addr:housenumber"),
 | 
				
			||||||
@@ -125,7 +174,12 @@ def main():
 | 
				
			|||||||
        result = requests.post(endpoint, json=data, headers=h)
 | 
					        result = requests.post(endpoint, json=data, headers=h)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if result.status_code != 201:
 | 
					        if result.status_code != 201:
 | 
				
			||||||
            print(f"{idx} {tierheim["properties"]["name"]}:{result.status_code} {result.json()}")
 | 
					            print(f"{idx} {tierheim["properties"]["name"]} failed:{result.status_code} {result.json()}")
 | 
				
			||||||
 | 
					            exit(1)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            print(f"{idx} - {json.loads(result.content)["id"]} {tierheim["properties"]["name"]} created")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    print(f"{skipped_low_quality} datapoints skipped for low quality ({skipped_low_quality / len(tierheime):.2}%)")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == "__main__":
 | 
					if __name__ == "__main__":
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user