从 R 中的 geojson FeatureCollection 读取单个特征的一般方法
A general way to read single features from geojson FeatureCollection in R
我正在尝试读取包含 FeatureCollection 的 geojson 文件。我正在寻找一种将单个要素转换为空间对象的通用方法。
具体来说,该文件是Overpass查询生成的公交路线:http://overpass-turbo.eu/s/BdB。我尝试了 geojsonio 库中的各种命令组合,例如
x<-geojson_atomize(file_to_geojson(name))
但它们给出了各种错误(在这种情况下,“'x' 无效 JSON”,即使 file_to_geojson 转换声称是成功的)。
这个问题的答案给出了一种方法,但它只适用于一个特定的情况,并且需要了解特定geojson的结构。此外,答案是 3 年前的,我假设软件包是从那以后开发的。
如果使用 sf
包就很容易了:
#install.packages("sf)
library(sf)
# I have downloaded the Overpass query as a GeoJSON file
route <- st_read("export.geojson")
结果是一个数据框,每个特征都表示为一行,因此您可以对其进行子集化(即路由 [1:3,])以仅提取您感兴趣的特征。
要素属性存储为列,因此您也可以轻松 select 其中的一个子集。
就是这样!
让我们看看您的具体情况。
有 89 个特征:
nrow(route)
[1] 89
具有 12 个属性(最后一列,编号 13,出现在所有 sf
个对象中并保存几何数据)
names(route)
[1] "id" "X.id" "from"
[4] "name" "network" "public_transport.version"
[7] "ref" "route" "source"
[10] "to" "type" "X.relations"
[13] "geometry"
看起来像这样:
plot(route)
(除非使用max.plot = 10
,否则只有前十个属性显示为plot()
)
检查数据框,您可以看到有两条折线特征和 87 个点特征 - 我假设是运输路线和运输站。
summary(route$geometry)
MULTILINESTRING POINT epsg:4326 +proj=long...
2 87 0 0
前两行是线,其余的是点。
head(route)
Simple feature collection with 6 features and 12 fields
geometry type: GEOMETRY
dimension: XY
bbox: xmin: 20.89744 ymin: 52.21596 xmax: 21.10796 ymax: 52.25929
epsg (SRID): 4326
proj4string: +proj=longlat +datum=WGS84 +no_defs
id X.id from
1 relation/4254149 relation/4254149 PKP Olszynka Grochowska
2 relation/4254150 relation/4254150 Stare Bemowo
3 node/32920674 node/32920674 <NA>
4 node/209094035 node/209094035 <NA>
5 node/251880529 node/251880529 <NA>
6 node/302874515 node/302874515 <NA>
name network public_transport.version ref route
1 Bus 523: PKP Olszynka Grochowska => Stare Bemowo ZTM Warszawa 2 523 bus
2 Bus 523: Stare Bemowo => PKP Olszynka Grochowska ZTM Warszawa 2 523 bus
3 <NA> <NA> <NA> <NA> <NA>
4 <NA> <NA> <NA> <NA> <NA>
5 <NA> <NA> <NA> <NA> <NA>
6 <NA> <NA> <NA> <NA> <NA>
source to type
1 Rozkład jazdy ZTM Warszawa, trasa wygenerowana przez bot Stare Bemowo route
2 Rozkład jazdy ZTM Warszawa, trasa wygenerowana przez bot PKP Olszynka Grochowska route
3 <NA> <NA> <NA>
4 <NA> <NA> <NA>
5 <NA> <NA> <NA>
6 <NA> <NA> <NA>
X.relations
1 <NA>
2 <NA>
3 [ { "role": "stop", "rel": 4254149, "reltags": { "from": "PKP Olszynka Grochowska", "name": "Bus 523: PKP Olszynka Grochowska => Stare Bemowo", "network": "ZTM Warszawa", "public_transport:version": "2", "ref": "523", "route": "bus", "source": "Rozkład jazdy ZTM Warszawa, trasa wygenerowana przez bot", "to": "Stare Bemowo", "type": "route" } } ]
4 [ { "role": "stop", "rel": 4254150, "reltags": { "from": "Stare Bemowo", "name": "Bus 523: Stare Bemowo => PKP Olszynka Grochowska", "network": "ZTM Warszawa", "public_transport:version": "2", "ref": "523", "route": "bus", "source": "Rozkład jazdy ZTM Warszawa, trasa wygenerowana przez bot", "to": "PKP Olszynka Grochowska", "type": "route" } } ]
5 [ { "role": "stop", "rel": 4254150, "reltags": { "from": "Stare Bemowo", "name": "Bus 523: Stare Bemowo => PKP Olszynka Grochowska", "network": "ZTM Warszawa", "public_transport:version": "2", "ref": "523", "route": "bus", "source": "Rozkład jazdy ZTM Warszawa, trasa wygenerowana przez bot", "to": "PKP Olszynka Grochowska", "type": "route" } } ]
6 [ { "role": "stop", "rel": 4254150, "reltags": { "from": "Stare Bemowo", "name": "Bus 523: Stare Bemowo => PKP Olszynka Grochowska", "network": "ZTM Warszawa", "public_transport:version": "2", "ref": "523", "route": "bus", "source": "Rozkład jazdy ZTM Warszawa, trasa wygenerowana przez bot", "to": "PKP Olszynka Grochowska", "type": "route" } } ]
geometry
1 MULTILINESTRING ((21.10695 ...
2 MULTILINESTRING ((20.89804 ...
3 POINT (21.07858 52.23575)
4 POINT (21.08457 52.24583)
5 POINT (21.07847 52.23509)
6 POINT (21.08454 52.24331)
如果您只想要第一个特征,您可以相应地简单地对数据帧进行子集化:
myfeature <- route[1,]
你可能还想要一组功能,比如所有的台词。这里很容易 select 它们,因为我们知道它们在前两行:
route_lines <- route[1:2,]
plot(route_lines)
或积分:
route_stations <- route[3:89,]
plot(route_stations)
最后,如果您想保存提取的特征,只需执行以下操作:
st_write(route_stations, "route_stations.geojson")
请参阅 https://cran.r-project.org/web/packages/sf/vignettes/sf1.html 以了解有关 sf
提供的非常酷的功能的更多信息。
我正在尝试读取包含 FeatureCollection 的 geojson 文件。我正在寻找一种将单个要素转换为空间对象的通用方法。
具体来说,该文件是Overpass查询生成的公交路线:http://overpass-turbo.eu/s/BdB。我尝试了 geojsonio 库中的各种命令组合,例如
x<-geojson_atomize(file_to_geojson(name))
但它们给出了各种错误(在这种情况下,“'x' 无效 JSON”,即使 file_to_geojson 转换声称是成功的)。
这个问题的答案
如果使用 sf
包就很容易了:
#install.packages("sf)
library(sf)
# I have downloaded the Overpass query as a GeoJSON file
route <- st_read("export.geojson")
结果是一个数据框,每个特征都表示为一行,因此您可以对其进行子集化(即路由 [1:3,])以仅提取您感兴趣的特征。 要素属性存储为列,因此您也可以轻松 select 其中的一个子集。
就是这样!
让我们看看您的具体情况。
有 89 个特征:
nrow(route)
[1] 89
具有 12 个属性(最后一列,编号 13,出现在所有 sf
个对象中并保存几何数据)
names(route)
[1] "id" "X.id" "from"
[4] "name" "network" "public_transport.version"
[7] "ref" "route" "source"
[10] "to" "type" "X.relations"
[13] "geometry"
看起来像这样:
plot(route)
(除非使用max.plot = 10
,否则只有前十个属性显示为plot()
)
检查数据框,您可以看到有两条折线特征和 87 个点特征 - 我假设是运输路线和运输站。
summary(route$geometry)
MULTILINESTRING POINT epsg:4326 +proj=long...
2 87 0 0
前两行是线,其余的是点。
head(route)
Simple feature collection with 6 features and 12 fields
geometry type: GEOMETRY
dimension: XY
bbox: xmin: 20.89744 ymin: 52.21596 xmax: 21.10796 ymax: 52.25929
epsg (SRID): 4326
proj4string: +proj=longlat +datum=WGS84 +no_defs
id X.id from
1 relation/4254149 relation/4254149 PKP Olszynka Grochowska
2 relation/4254150 relation/4254150 Stare Bemowo
3 node/32920674 node/32920674 <NA>
4 node/209094035 node/209094035 <NA>
5 node/251880529 node/251880529 <NA>
6 node/302874515 node/302874515 <NA>
name network public_transport.version ref route
1 Bus 523: PKP Olszynka Grochowska => Stare Bemowo ZTM Warszawa 2 523 bus
2 Bus 523: Stare Bemowo => PKP Olszynka Grochowska ZTM Warszawa 2 523 bus
3 <NA> <NA> <NA> <NA> <NA>
4 <NA> <NA> <NA> <NA> <NA>
5 <NA> <NA> <NA> <NA> <NA>
6 <NA> <NA> <NA> <NA> <NA>
source to type
1 Rozkład jazdy ZTM Warszawa, trasa wygenerowana przez bot Stare Bemowo route
2 Rozkład jazdy ZTM Warszawa, trasa wygenerowana przez bot PKP Olszynka Grochowska route
3 <NA> <NA> <NA>
4 <NA> <NA> <NA>
5 <NA> <NA> <NA>
6 <NA> <NA> <NA>
X.relations
1 <NA>
2 <NA>
3 [ { "role": "stop", "rel": 4254149, "reltags": { "from": "PKP Olszynka Grochowska", "name": "Bus 523: PKP Olszynka Grochowska => Stare Bemowo", "network": "ZTM Warszawa", "public_transport:version": "2", "ref": "523", "route": "bus", "source": "Rozkład jazdy ZTM Warszawa, trasa wygenerowana przez bot", "to": "Stare Bemowo", "type": "route" } } ]
4 [ { "role": "stop", "rel": 4254150, "reltags": { "from": "Stare Bemowo", "name": "Bus 523: Stare Bemowo => PKP Olszynka Grochowska", "network": "ZTM Warszawa", "public_transport:version": "2", "ref": "523", "route": "bus", "source": "Rozkład jazdy ZTM Warszawa, trasa wygenerowana przez bot", "to": "PKP Olszynka Grochowska", "type": "route" } } ]
5 [ { "role": "stop", "rel": 4254150, "reltags": { "from": "Stare Bemowo", "name": "Bus 523: Stare Bemowo => PKP Olszynka Grochowska", "network": "ZTM Warszawa", "public_transport:version": "2", "ref": "523", "route": "bus", "source": "Rozkład jazdy ZTM Warszawa, trasa wygenerowana przez bot", "to": "PKP Olszynka Grochowska", "type": "route" } } ]
6 [ { "role": "stop", "rel": 4254150, "reltags": { "from": "Stare Bemowo", "name": "Bus 523: Stare Bemowo => PKP Olszynka Grochowska", "network": "ZTM Warszawa", "public_transport:version": "2", "ref": "523", "route": "bus", "source": "Rozkład jazdy ZTM Warszawa, trasa wygenerowana przez bot", "to": "PKP Olszynka Grochowska", "type": "route" } } ]
geometry
1 MULTILINESTRING ((21.10695 ...
2 MULTILINESTRING ((20.89804 ...
3 POINT (21.07858 52.23575)
4 POINT (21.08457 52.24583)
5 POINT (21.07847 52.23509)
6 POINT (21.08454 52.24331)
如果您只想要第一个特征,您可以相应地简单地对数据帧进行子集化:
myfeature <- route[1,]
你可能还想要一组功能,比如所有的台词。这里很容易 select 它们,因为我们知道它们在前两行:
route_lines <- route[1:2,]
plot(route_lines)
或积分:
route_stations <- route[3:89,]
plot(route_stations)
最后,如果您想保存提取的特征,只需执行以下操作:
st_write(route_stations, "route_stations.geojson")
请参阅 https://cran.r-project.org/web/packages/sf/vignettes/sf1.html 以了解有关 sf
提供的非常酷的功能的更多信息。