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 :
- GéoJSON en ligne
- TopoJSON en ligne
- TopoJSON à partir de l'URL
- 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}
)