Fronteres i límits administratius. GeoJSON. Mapes coroplètics

De wikijoan
Salta a la navegació Salta a la cerca

Introducció

Densitat catalunya.png

Una de les tècniques que s'ha de dominar és el poder pintar fronteres i contorns dins de OSM, i omplir-los amb color.

Des de l'API d'Overpass es poden consultar relations, i obtenir valors de frontera. I es poden exportar les dades a GeoJSON. Això no vol dir que les dades obtingudes estiguin llestes per fer la visualització dels mapes. Concretament, si volem pintar dins dels límits (països, municipis, comarques, etc) necessitem uns polígons ben definits, amb el punt final el mateix que el punt inicial. Per sort, a Internet es troben bastantes fonts de dades ja preparades amb els polígons GeoJON. Per exemple:

GeoJSON de les comarques de Catalunya:

(però compte, que concretament aquest exemple no conté el Moianès).

Descàrrega dels fitxers: (TBD)

Objectiu

El que volem és poder programar mapes amb contorn de fronteres, i pintar el seu interior amb un color que sigui funció d'un paràmetre (mapes coroplètics).

Exemples

Pàgina web on podem generar de forma dinàmica el GeoJSON dels països:

  • Exemple: europa.html (europe.geo.json)

Nominatim és un cercador per a les dades de OSM. Si ho fem bé, podem veure que amb Nominàtim podem extreure les dades en format GeoJSON i la geometria de Polygon o MultiPolygon, que és el que necessitem:

var nominatim_results = [
    {
        "osm_type": "R",
        "osm_id": 349053,
        "class": "boundary",
        "type": "administrative",
        "admin_level": 4,
        "rank_search": 8,
        "rank_address": 8,
        "place_id": 235436499,
        "parent_place_id": 0,
        "housenumber": -1,
        "country_code": "es",
        "langaddress": "Catalu\u00f1a, Espa\u00f1a",
        "placename": "Catalu\u00f1a",
        "ref": "CT",
        "lon": "1.5745043",
        "lat": "41.8523094",
        "importance": 0.7201737377462073,
        "addressimportance": null,
        "extra_place": "state",
        "addresstype": "boundary",
        "asgeojson": "{\"type\":\"MultiPolygon\",\"coordinates\":[[[[0.1594133,40.750486],[0.1594307,40.7501662],[0.1595397,40.7498562],[0.1596504,40.7493935],[0.1600096,40.748391],[0.1601895,40.7480565],[0.1607582,40.7474847],[0.1619748,40.7466418]
...

https://www.openstreetmap.org/api/0.6/relation/148838/full

Parteixo d'un exemple que funciona, i que de fet s'acosta molt al que jo vull:

  • Exemple: USA.html (us-states.js)

I aprenc un concepte nou, que són els mapes choropleth (mapa coroplètic en català), que són aquests tipus de mapes amb diferents colors:

Tercer exemple que funciona:

Es tracta de fer una consulta a la Overpass API per extreure els límits d'un municipi. Adapto el codi als límits de Bagà:

  • Exemple: baga.html (limits_baga.js i baga.js)

A http://overpass-turbo.eu/ podem posar la consulta:

relation
  ["name"="Bagà"]
  ["boundary"="administrative"]
  ["admin_level"="8"];
>;
out;

i exportar a geojson.

Si ens fixem en les dades que retorna, no és un poligon (o multipolígon), sinó que són LineString. És a dir, és el concepte de way a OSM, no són relations. Si vull posar un color a l'interior del límit municipal de Bagà, hauré de fer-ne un polígon. Per tal de què funcioni l'ombrejat no em val el fitxer limits_baga.js, perquè són LineString.

  • Exemple: baga.html (baga_limits.js i baga.js)

El que necessito són Polygons (tancats):

(fixar-se bé que els polígons tenen un claudàtor extra entre les coordenades.) A més a més, el polígon, per tal de què funcioni bé, ha de ser tancat (la última coordenada la mateixa que la primera). Aleshores, quan treballo amb polígons tancats, aleshores sí que té sentit el fillcolor del codi.

  • Exemple: baga_poligon_prova.html (baga_limits_poligon_prova.js i baga.js)

Per sort, tenim una eina online (script python) que, donada una relació OSM, genera el polígon correctament (veure més avall):

Fent una cerca ràpida a OSM puc saber que la relació del municipi de Bagà és: 347951

I com que ara ja tinc un polígon tancat, podem dibuixar el contorn de Bagà amb un color de fons.

  • Exemple: baga_poligon.html (baga_limits_poligon.js i baga.js)

Mapes coroplètics

En el primer exemple que havíem provat tenim els estats d'Estats Units. Partim d'aquest exemple per fer les comarques de Catalunya. GeoJSON de les comarques de Catalunya:

  • Exemple: comarques.html (comarques.js)

comarques.js (fitxer GeoJSON): aquest fitxer no és un polígon, sinó un multi-polígon (conjunt de polígons)

Recordar que el que he de fer és les dades geojson posar-les com un objecte de Javascript. N'hi ha prou en fer

var limits_comarques = {...} (amb el contingut del fitxer geoJSON).

De moment tinc totes les comarques amb un sol color, però els contorns ja funcionen correctament.

Ara la única cosa que falta és mostrar les features (nom i capital de la comarca). I un color diferent per cada comarca.

Basant-me en USA.html(Estats Units), faig el mapa coroplètic de la densitat de les comarques.

Cercquem la informació de la densitat de les comarques:

Modifiquem comarques.js per generar comarques_densitat.js, i ara ja puc fer:

  • Exemple: comarques_densitat.html (comarques_densitat.js)

Descàrrega dels arxius necessaris

Eina per generar polígons a partir de la relació OSM

Tenim una eina online

Per saber el id d'una relació (per exemple Bagà), fem una petita cerca a OpenStreetMap, i veiem que el id és 347951.

I aleshores amb el script python (online) cerco amb aquest id, i obtinc les dades en diferent format: WKT, GeoJSON, poly. També puc veure directament la imatge (image)

Cas pràctic: en l'exemple que feia de les comarques no tenia el Moianès. Sabent que id=4791885, ara ja tinc les coordenades. També he de corregir les comarques que limiten amb el Moianès: Vallès Oriental, Vallès Occidental, Bages i Osona. Quan genero el geojson, és important agafar el paràmetre X=0 per tal de què el contorn sigui el més correcte possible (tot i que hi pot haver simplificació. Hi ha tres paràmetres per controlar la sortida: X, Y, Z).

TODO

Fer una consulta AJAX a Nominatim per obtenir el contorn d'un municipi, per exemple.


creat per Joan Quintana Compte, març 2020