使用r向GeoJSON添加属性

时间:2014-11-25 20:24:25

标签: json r geojson

我正在尝试准备一些GeoJSON数据,这些数据用于在传单地图上显示为一个等值线。我遇到的问题是我无法解决如何在我的GeoJSON文件中添加属性的问题。我可以使用fromJSON()包中的rjson将其放入R中,但它最终会成为一个列表列表,我会挣扎以了解如何将某些内容添加到列表中,更不用说了深入到递归列表中以附加数据。

我创建的GeoJSON文件可以找到here

我用于导入数据的代码是:

library(rjson)
Myjson <- fromJSON(paste(readLines("states.json"), collapse=""))

我还有一个数据集,我希望将其添加为json文件中每个几何的属性。 结构是:

structure(list(State = structure(1:8, .Label = c("ACT", "NSW", "NT", "QLD", "SA", "TAS", "VIC", "WA"), 
                                 class = "factor"), stateincome = c(28959299.93, 392185791.54, 8559477.92, 169039212.3, 61092752.9878, 23695740.28, 298860548.9008, 114231960.463),
               avgstategift = c(48.8204253852119, 64.8584888549168, 45.0472757892964, 53.9720822484215, 50.7162153310643, 53.0923216942408, 62.4033469022953, 50.7348320924839)), 
          row.names = c(NA, -8L), 
          class = c("data.table", "data.frame"), 
          .Names = c("State", "stateincome", "avgstategift"))

看起来像:

   State stateincome avgstategift
1:   ACT    28959300     48.82043
2:   NSW   392185792     64.85849
3:    NT     8559478     45.04728
4:   QLD   169039212     53.97208
5:    SA    61092753     50.71622
6:   TAS    23695740     53.09232
7:   VIC   298860549     62.40335
8:    WA   114231960     50.73483

我想将我的stateincome添加为avgstategift列作为我的GeoJSON文件的属性。 My State列将与GeoJSON文件中的STATE_CODE属性匹配。对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

如果您可以使用rgdal&gt; = 1.11,那么这是非常快速的工作。我已将State列重命名为STATE_CODE以匹配GeoJSON文件中的&#34;更简单&#34;合并:

library(rgdal)

states <- readOGR("states.json", "OGRGeoJSON")

dat <- structure(list(STATE_CODE = structure(1:8, .Label = c("ACT", "NSW", "NT", "QLD", "SA", "TAS", "VIC", "WA"), 
                                 class = "factor"), stateincome = c(28959299.93, 392185791.54, 8559477.92, 169039212.3, 61092752.9878, 23695740.28, 298860548.9008, 114231960.463),
               avgstategift = c(48.8204253852119, 64.8584888549168, 45.0472757892964, 53.9720822484215, 50.7162153310643, 53.0923216942408, 62.4033469022953, 50.7348320924839)), 
          row.names = c(NA, -8L), 
          class = c("data.table", "data.frame"), 
          .Names = c("STATE_CODE", "stateincome", "avgstategift"))

states@data <- merge(states@data, dat)
str(states@data)

## 'data.frame': 8 obs. of  6 variables:
##  $ STATE_CODE  : Factor w/ 9 levels "ACT","NSW","NT",..: 1 2 3 5 6 7 8 9
##  $ STE_CODE11  : Factor w/ 9 levels "1","2","3","4",..: 8 1 7 3 4 6 2 5
##  $ STE_NAME11  : Factor w/ 9 levels "Australian Capital Territory",..: 1 2 3 5 6 7 8 9
##  $ ALBERS_SQM  : num  2.36e+09 8.01e+11 1.35e+12 1.73e+12 9.84e+11 ...
##  $ stateincome : num  2.90e+07 3.92e+08 8.56e+06 1.69e+08 6.11e+07 ...
##  $ avgstategift: num  48.8 64.9 45 54 50.7 ...

我使用this post中的GeoJSON文件覆盖了一些额外的R映射,但我不知道还需要什么才能将数据转换成传单。如果您只需要合并数据,那么此示例中的states@data可以为您提供所需的信息。