0

この質問は他の場所で回答されていると確信していますが、検索しても見つけられませんでした。

各都市の人口とともに、国内の都市を表すポイントがあります。郡のポリゴン ファイルもあります。各郡内で最大の都市の場所を見つけたいです。

これはどのように行うことができますか?

ここにいくつかのデータがあります

structure(list(Country = c("us", "us", "us", "us", "us", "us", "us", "us", "us", "us", "us")) 「、
「私たち」、「私たち」、「私たち」、「私たち」、「私たち」、「私たち」、「私たち」、「私たち」、「私たち」、「私たち」、「私たち」、「私たち」、 "us", "us"), City = c("cabarrus", "cox store", "cal-vel", "briarwood townhouses", "barker heights", "davie"
crossroads」、「crab point village」、「azalea」、「chesterfield」、「charlesmont」、「connor」、「clover garden」、「corriher heights」、「callisons」、「crestview acres」、「clegg」、「canaan」 park", "chantilly", "belgrade", "brices crossroads", "bluff", "butner", "bottom", "bandy", "bostian heights"), AccentCity = c("Cabarrus", "Cox Store" 、「Cal-Vel」、「Briarwood Townhouses」、「Barker Heights」、「Davie Crossroads」、「Crab Point Village」、「Azalea」、「Chesterfield」、「Charlesmont」、「Connor」、「Clover Garden」、「コリハー ハイツ」、「カリソンズ」、"Crestview Acres"、"Clegg"、"Canaan Park"、"Chantilly"、"Belgrade"、"Brices Crossroads"、"Bluff"、"Butner"、"Bottom"、"Bandy"、"Bostian Heights")、地域= c("NC", "NC", "NC", "NC", "NC", "NC", "NC", "NC", "NC", "NC", "NC", "NC" 、"NC"、"NC"、"NC"、"NC"、"NC"、"NC"、"NC"、"NC"、"NC"、"NC"、"NC"、"NC"、" NC")、人口 = c(NA_integer_、NA_integer_、NA_integer_、NA_integer_、NA_integer_、NA_integer_、NA_integer_、NA_integer_、NA_integer_、NA_integer_、NA_integer_、NA_integer_、A_integer_、NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_), Latitude = (35.2369444, 35.275, 36.4291667, 35.295, 35.3111111, 35.8319444, 34.7602778, 35.58, 35.81, 5.9341667, 35.7419444, 36.1883333, 35.5605556, 35.0841667, 35.0213889, 35.8655556, 36.2761111, 36.3016667, 34.88, 34.8186111, 35.8377778, 36.1319444, 36.4747222, 35.6419444, 35.7544444), Longitude = c(-80.5419444, -82.0352778, -78.9694444, -81.5238889, -82.4441667, -80.535 , -76.7305556, -82.4713889, -81.6611111, -81.5127778, -78.1486111, -79.4630556, -80.635, -76.7255556, -80.5427778, -78.8497222, -79.7852778, -76.1711111, -77.2352778, -78.1016667, -82.8580556, -78.7569444, - 80.7741667, -81.09, -80.9294444)), .Names = c("国", "都市", "アクセント都市","地域", "人口", "緯度", "経度"), row.names = c(544L, 889L, 551L, 434L, 190L, 975L, 894L, 147L, 717L, 700L, 831L, 773L, 862L, 559L, 915L、753L、584L、695L、262L、437L、372L、537L、406L、178L、02L)、クラス = "data.frame")

ノースカロライナで読むべきいくつかのコード

xx <- readShapePoly(system.file("shapes/sids.shp", package="maptools")[1],
                IDvar="FIPSNO", proj4string=CRS("+proj=longlat +ellps=clrk66"))

plot(xx)

各郡内で人口が最大の都市を見つけたいと考えています。再現可能な例がなくてすみません。私だったら答えが出ます!

4

1 に答える 1

0

gContains(...)短い答えは、パッケージで使用する必要があるということですrgeos

これが長い答えです。

以下のコードでは、GADM データベースからノースカロライナ州の郡の高解像度シェープファイルを取得し、US Geological Survey データベースからノースカロライナ州の都市のジオコーディングされたデータセットを取得します。後者にはすでに郡情報がありますが、それは無視します。次に、 を使用して都市を適切な郡にマップしgContains(...)、その情報を都市データ フレームに追加し、data.table パッケージを使用して各郡で最大の都市を識別します。ほとんどの作業は、最後の 4 行のコードで行われます。

library(raster)   # for getData(...);   you may not need this
library(foreign)  # for read.dbf(...);  you may not need this
library(rgeos)    # for gContains(...); loads package sp as well

setwd("< directory for downloaded data >")
# get North Carolina Counties shapefile from GADM database
USA         <- getData("GADM",country="USA",level=2)   # level 2 is counties
NC.counties <- USA[USA$NAME_1=="North Carolina",]      # North Carolina Counties
# get North Carolina Cities data from USGS database
url <- "http://dds.cr.usgs.gov/pub/data/nationalatlas/citiesx010g_shp_nt00962.tar.gz"
download.file(url,"cities.tar.gz")
untar("cities.tar.gz")
data      <- read.dbf("citiesx010g.dbf",as.is=TRUE)
NC.data   <- data[data$STATE=="NC",c("NAME","COUNTY","LATITUDE","LONGITUDE","POP_2010")]
## --- evverything up to here is just to set up the example

# convert cities data.frame to SpatialPointsDataFrame
NC.cities <- SpatialPointsDataFrame(NC.data[,c("LONGITUDE","LATITUDE")],
                                    data=NC.data,
                                    proj4string=CRS(proj4string(NC.counties)))
# map cities to counties
city.cnty   <- gContains(NC.counties,NC.cities,byid=TRUE)
# add county information to cities data
NC.data$county <- apply(city.cnty,1,function(cnty)ifelse(any(cnty),NC.counties@data[cnty,]$NAME_2,NA))
# identify largest city in each county
library(data.table)
result <- setDT(NC.data)[,.SD[which.max(POP_2010)],by="county"]
head(result)
#      county             NAME   COUNTY LATITUDE LONGITUDE POP_2010
# 1:  Jackson        Cullowhee  Jackson 35.31371 -83.17653     6228
# 2:   Graham     Robbinsville   Graham 35.32287 -83.80740      620
# 3:   Wilkes North Wilkesboro   Wilkes 36.15847 -81.14758     4245
# 4:    Rowan        Salisbury    Rowan 35.67097 -80.47423    33662
# 5: Buncombe        Asheville Buncombe 35.60095 -82.55402    83393
# 6:    Wayne        Goldsboro    Wayne 35.38488 -77.99277    36437

ここでの主力は次の行です。

city.cnty   <- gContains(NC.counties,NC.cities,byid=TRUE)

これは、SpatialPointsDataFrame のすべてのポイントを SpatialPolygonsDataFrameNC.Citiesのすべての Polygonと比較しNC.counties、論理行列を返します。ここで、行は都市を表し、列は郡を表し、都市が郡に[i,j]ある場合は要素が、それ以外の場合は要素が になります。次のステートメントで行列を行ごとに処理します。TRUEijFALSE

NC.data$county <- apply(city.cnty,1,function(cnty)ifelse(any(cnty),NC.counties@data[cnty,]$NAME_2,NA))

各行を連続して使用して属性テーブルにインデックスを付けNC.counties、郡名を抽出します。

質問で提供したデータにはいくつかの問題がありますが、それでも有益です。まず、maptoolsパッケージ内の NC シェープファイルは比較的低解像度です。特に、これは沿岸の島の一部が完全に欠落していることを意味するため、これらの島のいずれかにある都市は郡にマッピングされません。実際のデータでも同じ問題が発生する可能性があるため、注意してください。

COUNTY次に、元の USGS データセットの列を追加した列と比較すると、county一致しない郡が 3 つ (865 のうち) あります。そのような場合、USGS データベースが間違っていた (または古くなっている) ことが判明しました。あなたも同じ問題を抱えているかもしれませんので、それにも注意してください。

第 3 に、さらに 3 つの都市がどの郡にもマップされていませんでした。これらはすべて沿岸都市であり、ノースカロライナ州のシェープファイルのわずかな不正確さを反映している可能性があります。あなたの夜にもこの問題があります。

于 2014-11-24T01:10:04.250 に答える