Rの空間ポイントデータをポリゴンに結合する


21

ポイントデータとポリゴンデータ間の空間結合を実行しようとしています。

CSVファイルAにイベントの空間座標を示すデータがあり、ポリゴンとして領域の境界を含む別のファイル、シェープファイルBがあります。

head(A)
  month   longitude latitude lsoa_code                   crime_type
1 2014-09 -1.550626 53.59740 E01007359        Anti-social behaviour
2 2014-09 -1.550626 53.59740 E01007359                 Public order
3 2014-09 -1.865236 53.93678 E01010646        Anti-social behaviour

head(B@data)
  code      name                                  altname
0 E05004934 Longfield, New Barn and Southfleet    <NA>
1 E05000448                   Lewisham Central    <NA>
2 E05003149                            Hawcoat    <NA>

犯罪データAをシェイプファイルBに結合して、自分のエリアAで発生する犯罪イベントをマッピングします。残念ながらcode、AのコードはBのコードとは異なるユニットを参照するため、属性結合を実行できません。

多数のチュートリアルと投稿を読みましたが、答えが見つかりませんでした。私は試した:

joined = over(A, B)

そしてoverlay、しかし、私が望んだことを達成しませんでした。

この結合を直接行う方法はありますか、またはAから別の形式への中間変換が必要ですか?

概念的にcodeは、B のエリアに含まれるAのポイントを選択します(「ArcGISの空間的位置に基づいて結合」に似ています)。

誰かがこの問題を抱えて解決しましたか?


point.in.polygon()パッケージをご覧になりましたspか?

@ arvi1000私はこれをもう一度試します。私の考えpoint.in.polygonはこれが変数monthとを保存するかどうかcrime_typeでした。それについて知っていますか?
ben_aaron

私はもう少し試してみて、point.in.poly最終的に関連するポリゴンに該当するポイントを選択しました。ありがとう。
ben_aaron

その後、おそらくあなたはあなたのソリューションであなた自身の質問に答えるべきです。良い答えがこのサイトのすべてであることを忘れないでください。
SlowLearner

回答:


8

spatialEcoパッケージのpoint.in.poly関数は、spポリゴンオブジェクトと交差するポイントのSpatialPointsDataFrameオブジェクトを返し、オプションでポリゴン属性を追加します。

まず、必要なパッケージを追加して、サンプルデータを作成します。

require(spatialEco)
require(sp)
data(meuse)
coordinates(meuse) = ~x+y
sr1=Polygons(list(Polygon(cbind(c(180114, 180553, 181127, 181477, 181294, 181007, 180409,
  180162, 180114), c(332349, 332057, 332342, 333250, 333558, 333676,
  332618, 332413, 332349)))),'1')
sr2=Polygons(list(Polygon(cbind(c(180042, 180545, 180553, 180314, 179955, 179142, 179437,
  179524, 179979, 180042), c(332373, 332026, 331426, 330889, 330683,
  331133, 331623, 332152, 332357, 332373)))),'2')
sr3=Polygons(list(Polygon(cbind(c(179110, 179907, 180433, 180712, 180752, 180329, 179875,
  179668, 179572, 179269, 178879, 178600, 178544, 179046, 179110),
  c(331086, 330620, 330494, 330265, 330075, 330233, 330336, 330004,
  329783, 329665, 329720, 329933, 330478, 331062, 331086)))),'3')
sr4=Polygons(list(Polygon(cbind(c(180304, 180403,179632,179420,180304),
  c(332791, 333204, 333635, 333058, 332791)))),'4')
sr=SpatialPolygons(list(sr1,sr2,sr3,sr4))
srdf=SpatialPolygonsDataFrame(sr, data.frame(row.names=c('1','2','3','4'), PIDS=1:4, y=runif(4)))

ここで、データを簡単に見てプロットします。

head(srdf@data)  # polygons
head(meuse@data) # points
plot(srdf)
points(meuse, pch=20)

最後に、ポイントをポリゴンと交差させることができます。結果は、SpatialPointsDataFrameオブジェクトになります。この場合、srdfポリゴンデータに含まれていた2つの追加属性(PIDS、y)が含まれます。

  pts.poly <- point.in.poly(meuse, srdf)
    head(pts.poly@data)

ポリゴンデータに一意の識別列がない場合は、簡単に追加できます。

srdf@data$poly.ids <- 1:nrow(srdf) 

ポイントとポリゴンを交差させたら、ポリゴンデータの属性である一意のポリゴンIDを使用してポイントを集約できます。

# Number of points in each polygon
tapply(pts.poly@data$lead, pts.poly@data$PIDS, FUN=length)

# Mean lead in each polygon
tapply(pts.poly@data$lead, pts.poly@data$PIDS, FUN=mean)

@ arvi1000、はい。ただしsp :: point.in.polygonは論理を生成します。spatialEco:point.in.polyはoverのラッパーですが、sp SpatialPointsDataFrameを返し、raster:intersectがrgeos :: gIntersectに対して行うのと同様に、ポリゴン属性を関連付ける際のいくつかのステップをショートカットします。
ジェフリーエヴァンス

sp::point.in.polygon実際に数値を返します(0 =ポイントは外側、1 =内側、2 =エッジ、3 =頂点)。状況によっては正しいことかもしれません。これは関連する用語のgoogleの上位の結果であるため、ここに注意しておくと役に立ちましたが、
arvi1000

27

over()パッケージからspは少しわかりにくいかもしれませんが、うまく機能します。私はあなたがすでに「A」空間を作成したと仮定していますcoordinates(A) <- ~longitude+latitude

# Overlay points and extract just the code column: 
a.data <- over(A, B[,"code"])

これは、ポイント空間オブジェクトの代わりに、同じnoを持つデータフレームを提供します。Aとしての行、およびBからの交差する各ポリゴンからの単一の変数「コード」

# Add that data back to A:
A$bcode <- a.data$code

私が見つけたover()私は、これは私がこれまでに発見した最も簡単な解決策だと思いますが、ポリゴンの頂点にポイントの問題を持っています。
JMT2080AD

どのような問題がありましたか?
シンバマング

除外。さらに調査する必要があります。今日はいくつかのデータを午後にご紹介します。ご興味があれば一緒にご覧になれます。私は間違っているかもしれませんが、少なくとも私のデータに関しては、世話をする必要があるアルゴリズムにいくつかの縮退があると確信しています。
JMT2080AD

気にしないで。それは私のデータの何かでなければなりません。この実験セットは正常に機能します。r-fiddle.org/#/fiddle?id=m5sTjE4N&version=1
JMT2080AD

1
これは受け入れられている答えよりもはるかに簡単なアプローチであり、rgdal以外の追加パッケージをインストールする必要はありません。
ブライスフランク

0

dplyrのようなソリューションを次に示します。

library(spdplyr)

ukcounties <- geojsonio::geojson_read("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson",
                                      what = "sp")
pop <- read_excel("data/SAPE20DT7-mid-2017-parlicon-syoa-estimates-unformatted.xls",sheet = "data")
pop <- janitor::clean_names(pop)

ukcounties_pop <- ukcounties %>% inner_join(pop, by = c("pcon18nm" = "pcon11nm"))

人口データは、https//www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates/datasets/parliamentaryconstituencymidyearpopulationestimatesから取得されます

ダウンロードしたシェープファイルをgeoJsonに変換する必要がありました:https ://geoportal.statistics.gov.uk/datasets/westminster-parliamentary-constituencies-december-2018-uk-bgc/data?page =1

あなたはそうすることができます:

uk_constituencies <- readOGR("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC.shp")
uk_constituencies # this is in tmerc format. we need to convert it to WGS84 required by geoJson format.

# First Convert to Longitude / Latitude with WGS84 Coordinate System
wgs84 = '+proj=longlat +datum=WGS84'
uk_constituencies_trans <- spTransform(uk_constituencies, CRS(wgs84))

# Convert from Spatial Dataframe to GeoJSON
uk_constituencies_json <- geojson_json(uk_constituencies_trans)

# Save as GeoJSON file on the file system.
geojson_write(uk_constituencies_json, file = "data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson")

#read back in:
ukcounties <- geojsonio::geojson_read("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson",
                                      what = "sp")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.