【问题标题】:A general way to read single features from geojson FeatureCollection in R从 R 中的 geojson FeatureCollection 读取单个特征的一般方法
【发布时间】:2018-08-22 13:05:42
【问题描述】:

我正在尝试读取包含 FeatureCollection 的 geojson 文件。我正在寻找一种将单个要素转换为空间对象的通用方法。

具体来说,该文件是Overpass查询生成的公交路线:http://overpass-turbo.eu/s/BdB。我尝试了geojsonio库中的各种命令组合,例如

x<-geojson_atomize(file_to_geojson(name))

但它们给出了各种错误(在这种情况下“'x' not valid JSON”,即使 file_to_geojson 转换声称成功)。

这个问题的答案How to load *part* of a multifeature geojson file in R? 提供了一种方法,但它适用于特定情况,需要了解特定geojson的结构。此外,答案是 3 岁,我假设从那以后开发包。

【问题讨论】:

  • 请提供重现问题所需的确切代码。此处的链接指向编辑器中的查询,但不是您所说的 file_to_geojson on
  • 对不起。在编辑器中,我运行查询,然后选择 Export->as GeoJSON,然后尝试加载生成的文件。该文件似乎是一个有效的 JSON,因为我可以将它作为列表加载。
  • 也许您可以在此处以文本形式发布 JSON 文件的代表性示例,或者直接从 R 查询 Overpass API 的方式。其中任何一个都比这里下载数据的人更可取
  • 我明白你的意思,但我不知道该怎么做。由于文件的结构,即使是样本也会很长。
  • 嗨@MonikaP,我想我现在更好地理解了你的问题。我已经扩展了我的答案,以准确展示如何从 shapefile 中提取任意数量的特征(仅一个或一些)。

标签: r geojson


【解决方案1】:

如果您使用sf 包,这很容易:

#install.packages("sf)
library(sf)
# I have downloaded the Overpass query as a GeoJSON file
route <- st_read("export.geojson")

结果是一个数据框,其中每个特征都表示为一行,因此您可以对其进行子集化(即 route[1:3,])以仅提取您感兴趣的特征。 特征属性存储为列,因此您也可以轻松选择其中的一个子集。

就是这样!

让我们看看你的具体情况。

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

(只有前十个属性显示为plot(),除非您使用max.plot = 10

检查数据框,您可以看到有两个折线要素和 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,]

您可能还需要一组功能,例如所有线条。在这里很容易选择它们,因为我们知道它们在前两行:

route_lines <- route[1:2,]

plot(route_lines)

或要点:

route_stations <- route[3:89,]

plot(route_stations)

最后,如果您想保存提取的特征,只需执行以下操作:

st_write(route_stations, "route_stations.geojson")

有关sf 提供的真正酷功能的更多信息,请参阅https://cran.r-project.org/web/packages/sf/vignettes/sf1.html

【讨论】:

  • 感谢编辑,这正是重点!我希望能够将线与集合中的点分开,而不必像在我链接的这个旧问题中那样手动完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2016-05-11
相关资源
最近更新 更多