Si te encuentras con alguna parte que no entiendes puedes dejarlo en los comentarios y haremos todo lo necesario de ayudarte lo más rápido posible.
Solución:
El ejemplo al que se refiere está usando topojson
datos estructurados, mientras tienes geojson
datos estructurados. Entonces probablemente necesites:
# 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
)
Actualizar: Los GeoDataFrames (geopandas) son compatibles directamente desde la versión 3.3.0 de Altair. Lo mismo ocurre con cualquier objeto que admita __geo_interface__
.
Para más información sigue leyendo!
Aquí debajo se discuten las variantes:
- GeoJSON en línea
- TopoJSON en línea
- TopoJSON de URL
- GeoJSON de URL
Explicando las diferencias entre geojson
y topojson
estructurado json
archivos y su uso dentro de Altair
import geojson
import topojson
import pprint
import altair as alt
GeoJSON en línea
Comenzamos creando una colección que contiene dos entidades, a saber, dos polígonos adyacentes.
Ejemplo de los dos polígonos que crearemos en el formato de datos 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])
Inspeccione el GeoJSON creado imprimiendo bastante 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'
Como puede verse, los dos Polygon
Features
están anidados dentro del features
objeto y el geometry
es parte de cada feature
.
Altair tiene la capacidad de analizar anidados json
objetos usando el property
key dentro de format
. El siguiente es un ejemplo de esto:
# 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 línea
TopoJSON es una extensión de GeoJSON, donde el geometry
de El features
se refieren a un objeto de nivel superior llamado arcs
. Esto hace posible aplicar una función hash en la geometría, por lo que cada uno compartido arc
solo debe almacenarse una vez.
Podemos convertir el var_geojson
variable en una topojson
estructura del formato de archivo:
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'
Ahora el anidado geometry
los objetos son reemplazados por arcs
y referirse por índice al nivel superior arcs
objeto. En lugar de tener un solo FeatureCollection
ahora podemos tener múltiples objects
, donde nuestro convertido FeatureCollection
se almacena dentro del key data
como un GeometryCollection
.
Nota la key-nombre data
es arbitrario y difiere en cada conjunto de datos.
Altair tiene la capacidad de analizar el anidado data
objeto en el topojson
estructura formateada usando el feature
key dentro de format
, mientras declara que es un topojson
type
. El siguiente es un ejemplo de esto:
# 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 de URL
También existe un método abreviado para extraer los objetos de un topojson
archivo si este archivo es accesible por URL:
alt.topo_feature(url, feature)
Ejemplo de Altair donde un topojson
el archivo es referido por 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 de URL
Pero para geojson
archivos accesibles por URL no existe tal abreviatura y deben vincularse de la siguiente manera:
alt.Data(url, format)
Ejemplo de Altair donde un geojson
el archivo es referido por 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
)
Si te animas, puedes dejar una sección acerca de qué le añadirías a esta reseña.