我对制图和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制作不列颠群岛的地图?
答案 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
有关更多信息,请继续阅读
# 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数据格式创建的两个多边形的示例。
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])
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
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
如果可以通过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
但是对于可通过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