Saltar al contenido

¿Cómo puedo hacer un mapa usando datos GeoJSON en Altair?

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
)

gráfico

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:

  1. GeoJSON en línea
  2. TopoJSON en línea
  3. TopoJSON de URL
  4. 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 .:

FeatureCollection con dos características

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 PolygonFeatures 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
)

gráfico

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 topojsontype. 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
)

gráfico

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
)

gráfico

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
)

gráfico

Si te animas, puedes dejar una sección acerca de qué le añadirías a esta reseña.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *