Найти максимальную точку с в каждом многоугольнике для набора многоугольников R

Я уверен, что на этот вопрос ответили в другом месте, но я не смог придумать его с помощью поиска.

У меня есть точки, представляющие города в стране, а также население для каждого города. У меня также есть полигональный файл округов. Я хочу найти местоположение самого большого города в каждом графстве.

Как это может быть сделано?

Вот некоторые данные

структура (список (Страна = c ("нас", "нас", "нас", "нас", "нас", "нас", "нас", "нас", "нас", "нас", "нас") ",
"нас", "нас", "нас", "нас", "нас", "нас", "нас", "нас", "нас", "нас", "нас", "нас", "нас" "," us "), City = c(" cabarrus", "cox store", "cal-vel", "briarwood townhouses", "barker heights", "davie "
Перекресток "," Деревня Краб-Пойнт "," Азалия "," Честерфилд "," Чарльзмонт "," Коннор "," Клевер Гарден "," Корриер Хайтс "," Каллисонс "," Крест-Вью-акрс "," Клегг "," Ханаан 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", "Corriher Heights", "Callisons", "Crestview Acres", "Clegg", "Canaan Park", "Chantilly", "Belgrade", "Brices Crossroads", "Bluff", "Butner", "Bottom", "Bandy", "Bostian Heights"), Region = 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_), широта = (35,2369444, 35,275, 351, 351), 36,429), 36,429 (29), 35, 351, 8, 35, 8, 35, 8, 35, 8, 8, 35, 8, 8, 35, 8, 8, 35, 8, 8, 8, 35, 8, 8, 35, 8, 8, 35, 8, 8, 29, 8, 8, 35, 8, 29, 28, 8, 35, 28, 8, 35, 28, 8, 12, 12, 12, 12, 35, 5, 35, 35, 8, 12, 35, 8, 12, 13, 35, 8, 12, 13, 35, 8, 12, 35, 28, 35, 28, 8, 12, 12, 12, 25, 35, 37, 351, 351, ПБ 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.6419442, 35.75.588, 284, 282, 684, 2882, 2882, 2882, 2882, 284, 2882, 2882, 2882, 2882, 2882, 2882, 2882, 2882, 2882, 2882, 541, США, 35.744444, 381, 288, 2818, 2818, США, 35.7419444. -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,17,178,87,87,88,88, 87,88,88,88 и 681,87,87,87,88,1755,3681,85,85,1641,35,1641,3641,05,1755,35,1645,05,15,160% составляют -77678771, 87771, 8677, -7, 858, -76, -7, 8700, -76, -77, -77, -77, -77, -77, -77, -77,., -80.7741667, -81.09, -80.9294444)),.Names = c ("Страна", "Город", "AccentCity", "Регион", "Население", "Широта", "Долгота"), row.names = с (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)

Я хочу найти город с максимальным населением в каждом округе. извините, у меня нет воспроизводимого примера. Если бы я это сделал, у меня был бы ответ!

1 ответ

Короткий ответ: вы должны использовать gContains(...) в упаковке rgeos,

Вот длинный ответ.

В приведенном ниже коде мы берем шейп-файл с высоким разрешением для округов Северной Каролины из базы данных GADM и геокодированный набор данных для городов Северной Каролины из базы данных геологической службы США. Последний уже имеет информацию округа, но мы игнорируем это. Затем мы сопоставляем города с соответствующими округами, используя 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 NC.Cities для каждого полигона в SpatialPolygonsDataFrame NC.counties и возвращает логическую матрицу, в которой строки представляют города, а столбцы представляют округа, а [i,j] элемент TRUE если город i в округе j, FALSE иначе. Мы обрабатываем матрицу построчно в следующем выражении:

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

используя каждую строку подряд для индексации таблицы атрибутов для NC.counties чтобы извлечь название округа.

Данные, которые вы указали в своем вопросе, имеют некоторые проблемы, которые тем не менее поучительны. Во-первых, шейп-файл NC в maptools Пакет имеет относительно низкое разрешение. В частности, это означает, что некоторые из прибрежных островов полностью отсутствуют, поэтому любой город на одном из этих островов не будет привязан к графству. У вас могут быть те же проблемы с вашими реальными данными, так что следите за ними.

Во-вторых, сравнивая COUNTY столбец в исходном наборе данных USGS с county В колонке, которую мы добавили, есть 3 (из 865) округов, которые не согласны. Оказывается, в этих случаях база данных USGS была неправильной (или устаревшей). У вас может быть та же проблема, так что следите за этим тоже.

В-третьих, еще три города не отображались ни в одном графстве. Все они были прибрежными городами и, вероятно, отражали небольшие неточности в шейп-файле Северной Каролины. У тебя ночью тоже есть эта проблема.

Другие вопросы по тегам