Python >> Tutoriel Python >  >> Python Tag >> JSON

Comment puis-je créer une carte en utilisant les données GeoJSON dans Altair ?

L'exemple auquel vous faites référence utilise topojson données structurées, alors que vous avez geojson données structurées. Donc, vous avez probablement besoin :

# remote geojson data object
url_geojson = 'https://raw.githubusercontent.com/mattijn/datasets/master/two_polygons.geo.json'
data_geojson_remote = alt.Data(url=url_geojson, format=alt.DataFormat(property='features',type='json'))

# chart object
alt.Chart(data_geojson_remote).mark_geoshape(
).encode(
    color="properties.name:N"
).properties(
    projection={'type': 'identity', 'reflectY': True}
)

Mettre à jour :Les GeoDataFrames (geopandas) sont directement supportés depuis Altair version 3.3.0. Il en va de même pour tous les objets qui prennent en charge le __geo_interface__ .

Pour plus d'informations continuez à lire !

Ici ci-dessous est discuté les variantes :

  1. GéoJSON en ligne
  2. TopoJSON en ligne
  3. TopoJSON à partir de l'URL
  4. GéoJSON à partir de l'URL

Expliquer les différences entre geojson et topojson json structuré fichiers et leur utilisation dans Altair

import geojson
import topojson
import pprint
import altair as alt

GéoJSON en ligne

Nous commençons par créer une collection contenant deux entités, à savoir deux polygones adjacents.

Exemple des deux polygones que nous allons créer au format de données GeoJSON. :

feature_1 = geojson.Feature(
    geometry=geojson.Polygon([[[0, 0], [1, 0], [1, 1], [0, 1], [0, 0]]]),
    properties={"name":"abc"}
)
feature_2 = geojson.Feature(
    geometry=geojson.Polygon([[[1, 0], [2, 0], [2, 1], [1, 1], [1, 0]]]),
    properties={"name":"def"}
)
var_geojson = geojson.FeatureCollection([feature_1, feature_2])

Inspectez le GeoJSON créé en imprimant joliment la variable var_geojson

pprint.pprint(var_geojson)
{'features': [{'geometry': {'coordinates': [[[0, 0],
                                             [1, 0],
                                             [1, 1],
                                             [0, 1],
                                             [0, 0]]],
                            'type': 'Polygon'},
               'properties': {'name': 'abc'},
               'type': 'Feature'},
              {'geometry': {'coordinates': [[[1, 0],
                                             [2, 0],
                                             [2, 1],
                                             [1, 1],
                                             [1, 0]]],
                            'type': 'Polygon'},
               'properties': {'name': 'def'},
               'type': 'Feature'}],
 'type': 'FeatureCollection'}

Comme on peut le voir, les deux Polygon Features sont imbriqués dans le features objet et le geometry fait partie de chaque feature .

Altair a la capacité d'analyser les json imbriqués objets utilisant le property clé entre format . Voici un exemple :

# inline geojson data object
data_geojson = alt.InlineData(values=var_geojson, format=alt.DataFormat(property='features',type='json')) 

# chart object
alt.Chart(data_geojson).mark_geoshape(
).encode(
    color="properties.name:N"
).properties(
    projection={'type': 'identity', 'reflectY': True}
)

TopoJSON en ligne

TopoJSON est une extension de GeoJSON, où le geometry du features sont référencés à partir d'un objet de niveau supérieur nommé arcs . Cela permet d'appliquer une fonction de hachage sur la géométrie, ainsi chaque arc partagé ne doit être stocké qu'une seule fois.

Nous pouvons convertir le var_geojson variable dans un topojson structure du format de fichier :

var_topojson = topojson.Topology(var_geojson, prequantize=False).to_json()
var_topojson
{'arcs': [[[1.0, 1.0], [0.0, 1.0], [0.0, 0.0], [1.0, 0.0]],
          [[1.0, 0.0], [2.0, 0.0], [2.0, 1.0], [1.0, 1.0]],
          [[1.0, 1.0], [1.0, 0.0]]],
 'objects': {'data': {'geometries': [{'arcs': [[-3, 0]],
                                      'properties': {'name': 'abc'},
                                      'type': 'Polygon'},
                                     {'arcs': [[1, 2]],
                                      'properties': {'name': 'def'},
                                      'type': 'Polygon'}],
                      'type': 'GeometryCollection'}},
 'type': 'Topology'}

Maintenant le geometry imbriqué les objets sont remplacés par arcs et faites référence par index au niveau supérieur arcs objet. Au lieu d'avoir un seul FeatureCollection nous pouvons maintenant avoir plusieurs objects , où notre FeatureCollection converti est stocké dans la clé data en tant que GeometryCollection .

REMARQUE :le nom de la clé data est arbitraire et diffère dans chaque jeu de données.

Altair a la capacité d'analyser le data imbriqué objet dans le topojson structure formatée en utilisant le feature clé dans format , tout en déclarant qu'il s'agit d'un topojson type . Voici un exemple :

# inline topojson data object
data_topojson = alt.InlineData(values=var_topojson, format=alt.DataFormat(feature='data',type='topojson')) 

# chart object
alt.Chart(data_topojson).mark_geoshape(
).encode(
    color="properties.name:N"
).properties(
    projection={'type': 'identity', 'reflectY': True}
)

TopoJSON à partir de l'URL

Il existe aussi un raccourci pour extraire les objets d'un topojson fichier si ce fichier est accessible par URL :

alt.topo_feature(url, feature)

Exemple Altair où un topojson le fichier est référencé par URL

# remote topojson data object
url_topojson = 'https://raw.githubusercontent.com/mattijn/datasets/master/two_polygons.topo.json'
data_topojson_remote = alt.topo_feature(url=url_topojson, feature='data')

# chart object
alt.Chart(data_topojson_remote).mark_geoshape(
).encode(
    color="properties.name:N"
).properties(
    projection={'type': 'identity', 'reflectY': True}
)

GeoJSON à partir de l'URL

Mais pour geojson les fichiers accessibles par URL, il n'y a pas de raccourci de ce type et doivent être liés comme suit :

alt.Data(url, format)

Exemple Altair où un geojson le fichier est référencé par URL

# remote geojson data object
url_geojson = 'https://raw.githubusercontent.com/mattijn/datasets/master/two_polygons.geo.json'
data_geojson_remote = alt.Data(url=url_geojson, format=alt.DataFormat(property='features',type='json'))

# chart object
alt.Chart(data_geojson_remote).mark_geoshape(
).encode(
    color="properties.name:N"
).properties(
    projection={'type': 'identity', 'reflectY': True}
)