В качестве примера вы используете topojson
структурированные данные, в то время как у вас есть geojson
структурированные данные.Так что вам, вероятно, понадобится:
# 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}
)
Для получения более подробной информации читайте
Объясняя различия между geojson
и topojson
структурированные json
файлы и их использование в Altair
import geojson
import topojson
import pprint
import altair as alt
Мы начнем с создания коллекции, содержащей два элемента, а именно два соседних полигона.
Пример двух полигонов, которыемы создадим в формате данных 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])
Проверьте созданный GeoJSON, просто напечатав переменную 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'}
Как видно, два Polygon
Features
вложены в объект features
, а geometry
является частью каждого feature
.
Altair имеет возможность анализировать вложенные json
объекты с помощью клавиши property
в format
.Ниже приведен пример такого:
# 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 является расширением GeoJSON, где geometry
из features
ссылается на объект верхнего уровня с именем arcs
.Это позволяет применить к геометрии хеш-функцию, поэтому каждый общий arc
должен храниться только один раз.
Мы можем преобразовать переменную var_geojson
в структуру формата файла topojson
:
var_topojson = topojson.topology(var_geojson)
pprint.pprint(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'}
Теперь вложенные geometry
объекты заменяются на arcs
и ссылаютсяпо индексу к объекту верхнего уровня arcs
.Вместо одного FeatureCollection
теперь мы можем иметь несколько objects
, где наш преобразованный FeatureCollection
хранится в ключе data
как GeometryCollection
.
ПРИМЕЧАНИЕ: имя ключа data
является произвольным и отличается в каждом наборе данных.
Altair имеет возможность анализировать вложенный data
объект в отформатированной структуре topojson
с помощью клавиши feature
в format
, при этом декларируя этоtopojson
type
.Ниже приведен пример такого:
# 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
, если этот файлдоступно по URL:
alt.topo_feature(url, feature)
Пример Altair, где файл topojson
ссылается по 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
файлов, доступных по URL, такой краткости нет, и их следует связать следующим образом:
alt.Data(url, format)
Пример Altair, где файл geojson
ссылается по 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}
)