|  | import requests
import sys
import urllib.parse
import json
import subprocess
import os
def get_polygon(name):
    if not os.path.isfile(name + ".json"):
        url = "https://nominatim.openstreetmap.org/search.php?q={0}&polygon_geojson=1&format=jsonv2".format(
            urllib.parse.quote(name)
        )
        r = requests.get(url)
        data = json.loads(r.text)
        if data is None:
            raise ValueError("Bogus results")
        osm_id = None
        for entry in data:
            if "boundary" in entry["category"] and entry["osm_type"] == "relation":
                osm_id = entry["osm_id"]
                break
        if not osm_id:
            raise ValueError("No id")
        
        url = "http://polygons.openstreetmap.fr/get_geojson.py?id={0}¶ms=0".format(osm_id)
        with open(name + ".json", "w") as file:
            file.write(requests.get(url).text)
    else:
        data = json.load(open(name + ".json"))
    info = subprocess.check_output(
        [
            "mapshaper",
            "-i",
            "{0}.json".format(name),
            "-each",
            "console.log(this.centroidX, this.centroidY, this.area)"],
        shell=True,
        stderr=subprocess.STDOUT,
    ).decode("utf-8")
    lon, lat, area = list(map(float, info.split(" ")))
    if area is not None:
        info = subprocess.check_output(
            [
                "mapshaper",
                "-i",
                "{0}.json".format(name),
                "-proj",
                "+proj=nsper",
                "+h=100000",
                "+lat_0={0}".format(lat),
                "+lon_0={0}".format(lon),
                "-simplify",
                "resolution=500x500",
                "-each",
                "console.log(\"HEIGHT:\" + this.height)",
                "-o",
                "{0}.svg".format(name),
            ],
            shell=True,
            stderr=subprocess.STDOUT,
        ).decode("utf-8")
        height = None
        for line in info.split("\n"):
            if "HEIGHT:" in line:
                height = float(line.split(":")[1].strip())
        print("[\"{0}\", {1}, {2}],".format(name, area, height))
if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: {0} list-of-cities".format(sys.argv[0]))
    else:
        city = None
        try:
            for city in open(sys.argv[1]).readlines():
                try:
                    get_polygon(city.strip())
                except ValueError as e:
                    print(city + " failed")
                    print(e)
        except Exception as e:
            print(city + " failed")
            print(e)
 |