如何在Altair中使用GeoJSON数据制作地图?

时间:2019-04-30 14:38:01

标签: python geojson topojson vega altair

我对制图和Altair / Vega非常陌生。有an example in the Altair documentation for how to make a map starting with an outline of US states,它的创建基本上是:

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,不是吗?

因此,我尝试通过运行一些命令行命令from this blog post(即

)从世界地图上获取不列颠群岛的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,它可能代表了不列颠群岛。但是我怎样才能把它带入Altair?还是有其他方法可以使用Altair制作不列颠群岛的地图?

2 个答案:

答案 0 :(得分:0)

在此示例中,data.us_10m.url是一个字符串变量,其中字符串指定了state功能中包含美国州边界的geojson file的URL。如果您要使用其他geojson文件,则可以在该示例中替换其URL。

答案 1 :(得分:0)

您引用的示例使用if(is_array($l__myVar["node1"]["node1"])){ for ($i = 0; $i < count($l__myVar["node1"]["node1"]); $i++) { $l__myVar["node1"]["node1"][$i]["fname"] = SUBSTR(MD5(RAND()) . MD5(RAND()), 1, 6); $l__myVar["node1"]["node1"][$i]["lname"] = SUBSTR(MD5(RAND()) . MD5(RAND()), 1, 6); } }else{ /*Your Code*/ } 结构化数据,而您拥有topojson结构化数据。因此,您可能需要:

geojson

chart

有关更多信息,请继续阅读


解释# 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文件之间的区别以及它们在Altair中的用法

json

我们首先创建一个包含两个要素的集合,即两个相邻的多边形。

我们将以GeoJSON数据格式创建的两个多边形的示例。

FeatureCollection with two Features

import geojson
import topojson
import pprint
import altair as alt

通过漂亮地打印变量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的一部分。

Altair能够使用feature中的json键来解析嵌套的property对象。以下是此类示例:

format

chart

TopoJSON是GeoJSON的扩展,其中# 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} ) 的{​​{1}}是从名为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是任意的,并且在每个数据集中都不同。

Altair能够使用GeometryCollection中的data键来解析data格式的嵌套topojson对象,同时声明它是{{1} } feature。以下是此类示例:

format

chart

如果可以通过URL访问此文件,那么还可以从topojson文件中提取对象:

type

Altair示例,其中# 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} ) 文件由URL引用

topojson

chart

但是对于可通过URL访问的alt.topo_feature(url, feature) 个文件,没有这样的简写形式,应按以下链接:

topojson

Altair示例,其中# 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} ) 文件由URL引用

geojson

chart