Как я могу сделать карту, используя данные GeoJSON в Altair? - PullRequest
1 голос
/ 30 апреля 2019

Я очень плохо знаком с картографией и с Альтаиром / Вегой. В документации Altair есть пример того, как сделать карту, начинающуюся с контура штатов США , который в основном создается с:

states = alt.topo_feature(data.us_10m.url, feature='states')

# US states background
background = alt.Chart(states).mark_geoshape(
    fill='lightgray',
    stroke='white'
)

но вместо этого я хочу построить точки на Британских островах. Поскольку в коллекциях данных vega есть только карты США и Мира, мне придется создать свой собственный GeoJSON, нет?

Итак, я попытался получить GeoJSON для Британских островов с карты мира, выполнив некоторые команды командной строки из этого сообщения в блоге , а именно

ogr2ogr -f GeoJSON -where "adm0_a3 IN ('GBR','IRL','IMN','GGY','JEY','GBA')" subunits.json ne_10m_admin_0_map_subunits/ne_10m_admin_0_map_subunits.shp

Кажется, это создало файл GeoJSON, subunits.json, который, вероятно, представляет Британские острова. Но как я могу получить это в Альтаир? Или есть другой способ сделать карту Британских островов, используя Альтаир?

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

В качестве примера вы используете 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}
)

chart

Для получения более подробной информации читайте


Объясняя различия между geojsonи topojson структурированные json файлы и их использование в Altair

import geojson
import topojson
import pprint
import altair as alt

Мы начнем с создания коллекции, содержащей два элемента, а именно два соседних полигона.

Пример двух полигонов, которыемы создадим в формате данных GeoJSON .:

FeatureCollection with two Features

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

chart

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

chart

Существует также сокращение для извлечения объектов из файла 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}
)

chart

Но для 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}
)

chart

0 голосов
/ 30 апреля 2019

В этом примере data.us_10m.url является строковой переменной, где строка указывает URL-адрес файла геоджона , содержащего границы штатов США в функции state. Если у вас есть другой файл geojson, который вы хотели бы использовать, вы можете заменить его URL в этом примере.

...