Estou tentando executar uma junção espacial entre dados de ponto e dados de polígono.
Eu tenho dados que indicam as coordenadas espaciais de um evento no meu arquivo csv A e outro arquivo, shapefile B, que contém os limites de uma área como polígonos.
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>
Quero associar os dados de crime A ao meu shapefile B para mapear os eventos de crime que ocorrem na minha área A. Infelizmente, não consigo executar uma associação de atributo com base code
no código em A se referir a unidades diferentes do código em B.
Eu li vários tutoriais e postagens, mas não consegui encontrar uma resposta. Eu tentei:
joined = over(A, B)
e overlay
, mas não conseguiu o que eu queria.
Existe uma maneira de fazer essa junção diretamente ou seria necessária uma transformação intermediária de A para outro formato?
Conceitualmente, quero selecionar os pontos de A que se enquadram nas code
áreas de B (semelhante a "unir com base na localização espacial no ArcGIS").
Alguém teve esse problema e resolveu?
fonte
point.in.polygon()
pacotesp
?point.in.polygon
era se isso preservaria as variáveismonth
ecrime_type
. Você sabe sobre aquilo?point.in.poly
e finalmente selecionei os pontos que se enquadram nos polígonos relevantes. Obrigado.Respostas:
A função point.in.poly no pacote spatialEco retorna um objeto SpatialPointsDataFrame dos pontos que cruzam um objeto de polígono sp e, opcionalmente, adiciona os atributos de polígono.
Primeiro vamos adicionar os pacotes requeridos e criar alguns dados de exemplo.
Agora, vamos dar uma olhada rápida nos dados e plotá-los.
Finalmente, podemos cruzar os pontos com os polígonos. Os resultados serão um objeto SpatialPointsDataFrame com, nesse caso, dois atributos extras (PIDS, y) que estavam contidos nos dados do polígono srdf.
Se não houver uma coluna de identificação exclusiva nos dados do polígono, você poderá facilmente adicionar uma.
Depois que os pontos e polígonos estiverem interceptados, podemos agregar os pontos usando os IDs de polígonos exclusivos que eram um atributo nos dados do polígono.
fonte
sp::point.in.polygon
na verdade, retorna um valor numérico (0 = ponto está fora, 1 = dentro, 2 = na aresta, 3 = no vértice). Pode ser a coisa certa para algumas circunstâncias. Pensei que era útil notar aqui, uma vez que este é um resultado de topo no Google por termos relacionadosover()
do pacotesp
pode ser um pouco confuso, mas funciona bem. Suponho que você já tenha feito o "A" espacial comcoordinates(A) <- ~longitude+latitude
:Em vez de um objeto espacial pontual, isso simplesmente fornece um quadro de dados, com o mesmo não. linhas como A e uma única variável "código" de cada polígono que se cruza de B.
fonte
over()
que há problemas com pontos nos vértices dos polígonos, embora eu ache que essa seja a solução mais fácil que encontrei até agora.Aqui está uma solução semelhante ao dplyr:
Os dados da população são provenientes de: https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates/datasets/parl Parliamentaryconstituencymidyearpopulationestimates
Eu tive que converter os arquivos de forma baixados de para geoJson: https://geoportal.statistics.gov.uk/datasets/westminster-parliamentary-constituencies-december-2018-uk-bgc/data?page=1
Você pode fazer isso:
fonte