有没有一个R函数可以检查指定的GeoJSON对象(多边形或多重多边形)是否包含指定的点?

3

我有一个点数组

{
  "Sheet1": [
    {
      "CoM ID": "1040614",
      "Genus": "Washingtonia",
      "Year Planted": "1998",
      "Latitude": "-37.81387927",
      "Longitude": "144.9817733"
    },
    {
      "CoM ID": "1663526",
      "Genus": "Banksia",
      "Year Planted": "2017",
      "Latitude": "-37.79582801",
      "Longitude": "144.9160598"
    },
    {
      "CoM ID": "1031170",
      "Genus": "Melaleuca",
      "Year Planted": "1997",
      "Latitude": "-37.82326441",
      "Longitude": "144.9305296"
    }
  ]
}

还有一组与下面展示相同形式的Geojson多边形数组:

{"type":"FeatureCollection","features":[
{"type":"Feature","id":"01","properties":{"name":"Alabama","density":94.65},"geometry":{"type":"Polygon","coordinates":[[[-87.359296,35.00118],[-85.606675,34.984749],[-85.431413,34.124869],[-85.184951,32.859696],[-85.069935,32.580372],[-84.960397,32.421541],[-85.004212,32.322956],[-84.889196,32.262709],[-85.058981,32.13674],[-85.053504,32.01077],[-85.141136,31.840985],[-85.042551,31.539753],[-85.113751,31.27686],[-85.004212,31.003013],[-85.497137,30.997536],[-87.600282,30.997536],[-87.633143,30.86609],[-87.408589,30.674397],[-87.446927,30.510088],[-87.37025,30.427934],[-87.518128,30.280057],[-87.655051,30.247195],[-87.90699,30.411504],[-87.934375,30.657966],[-88.011052,30.685351],[-88.10416,30.499135],[-88.137022,30.318396],[-88.394438,30.367688],[-88.471115,31.895754],[-88.241084,33.796253],[-88.098683,34.891641],[-88.202745,34.995703],[-87.359296,35.00118]]]}}

我正在尝试使用R找到具有点内部的Geojson多边形。例如,如何知道上面添加的三个点是否在多边形内部?

我发现的有用的函数是point.in.polygon函数,但它不支持Geojson格式。

有没有R函数或任何有用的方法来解决这个问题?如果函数返回多边形的ID,那将非常有帮助。


你能否使用 jsonlite 解析这些结构体,提取坐标,然后调用 point.in.polygon 函数?顺便说一句:你的标题是“如果一个多边形包含一个点”,但是你的最后一句话是“返回ID”...这是否意味着你有多个多边形需要测试? - r2evans
1
谢谢您的帮助,是的,这就是我在这里的意思。 - Y.Wang
1个回答

3
您可以使用lawn包,例如:
x <- '{
"Sheet1": [
  {
    "CoM ID": "1040614",
    "Genus": "Washingtonia",
    "Year Planted": "1998",
    "Latitude": "-37.81387927",
    "Longitude": "144.9817733"
  },
  {
    "CoM ID": "1663526",
    "Genus": "Banksia",
    "Year Planted": "2017",
    "Latitude": "-37.79582801",
    "Longitude": "144.9160598"
  },
  {
    "CoM ID": "1031170",
    "Genus": "Melaleuca",
    "Year Planted": "1997",
    "Latitude": "-37.82326441",
    "Longitude": "144.9305296"
  }
]
}'

feature1 <- '{"type":"Feature","id":"01","properties":{"name":"Alabama","density":94.65},"geometry":{"type":"Polygon","coordinates":[[[-87.359296,35.00118],[-85.606675,34.984749],[-85.431413,34.124869],[-85.184951,32.859696],[-85.069935,32.580372],[-84.960397,32.421541],[-85.004212,32.322956],[-84.889196,32.262709],[-85.058981,32.13674],[-85.053504,32.01077],[-85.141136,31.840985],[-85.042551,31.539753],[-85.113751,31.27686],[-85.004212,31.003013],[-85.497137,30.997536],[-87.600282,30.997536],[-87.633143,30.86609],[-87.408589,30.674397],[-87.446927,30.510088],[-87.37025,30.427934],[-87.518128,30.280057],[-87.655051,30.247195],[-87.90699,30.411504],[-87.934375,30.657966],[-88.011052,30.685351],[-88.10416,30.499135],[-88.137022,30.318396],[-88.394438,30.367688],[-88.471115,31.895754],[-88.241084,33.796253],[-88.098683,34.891641],[-88.202745,34.995703],[-87.359296,35.00118]]]}}'

执行一项测试:

lawn_boolean_contains(as.feature(feature1), lawn_point('[144.9817733,-37.81387927]'))
#> FALSE

一次全部完成:

apply(jsonlite::fromJSON(x)$Sheet1, 1, function(z) {
  lawn_boolean_contains(
    as.feature(feature1), 
    lawn_point(sprintf("[%s,%s]", z['Longitude'], z['Latitude']))
)
})
#>     1     2     3
#> FALSE FALSE FALSE

谢谢。这真的很有帮助! - Y.Wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接