J'essaie d'effectuer une jointure spatiale entre les données de points et les données de polygones.
J'ai des données qui indiquent les coordonnées spatiales d'un événement dans mon fichier csv A et j'ai un autre fichier, le fichier de formes B, qui contient les limites d'une zone sous forme de polygones.
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>
Je souhaite joindre les données de criminalité A à mon fichier de formes B pour cartographier les événements de criminalité qui se produisent dans ma région A. Malheureusement, je ne peux pas effectuer de jointure d'attribut code
car le code en A fait référence à des unités différentes de celles du code en B.
J'ai lu un certain nombre de didacticiels et d'articles, mais je n'ai pas trouvé de réponse. J'ai essayé:
joined = over(A, B)
et overlay
, mais n'a pas accompli ce que je voulais.
Existe-t-il un moyen de faire cette jointure directement ou une transformation intermédiaire de A vers un autre format serait-elle nécessaire?
Conceptuellement, je veux sélectionner les points de A qui tombent dans le code
zones de B (similaires à «joindre en fonction de l'emplacement spatial dans ArcGIS»).
Quelqu'un a-t-il eu ce problème et l'a-t-il résolu?
la source
point.in.polygon()
dans le paquetsp
?point.in.polygon
était de savoir si cela préserverait les variablesmonth
etcrime_type
. Connaissez-vous cela?point.in.poly
et j'ai finalement sélectionné les points qui tombent dans les polygones pertinents. Merci.Réponses:
La fonction point.in.poly du package spatialEco renvoie un objet SpatialPointsDataFrame des points qui coupent un objet polygone sp et ajoute éventuellement les attributs de polygone.
Ajoutons d'abord les packages requis et créons des exemples de données.
Maintenant, jetons un coup d'œil aux données et traçons-les.
Enfin, nous pouvons intersecter les points avec les polygones. Le résultat sera un objet SpatialPointsDataFrame avec, dans ce cas, deux attributs supplémentaires (PIDS, y) qui étaient contenus dans les données du polygone srdf.
S'il n'y a pas de colonne d'identification unique dans les données du polygone, vous pouvez facilement en ajouter une.
Une fois que nous avons intersecté les points et les polygones, nous pouvons agréger les points en utilisant les ID de polygone uniques qui étaient un attribut dans les données de polygone.
la source
sp::point.in.polygon
renvoie en fait une valeur numérique (0 = le point est à l'extérieur, 1 = à l'intérieur, 2 = sur le bord, 3 = sur le sommet). Cela pourrait être la bonne chose dans certaines circonstances. J'ai pensé qu'il était utile de le noter ici, car il s'agit d'un résultat Google supérieur pour les termes connexesover()
à partir du paquetsp
peut être un peu déroutant mais fonctionne bien. Je suppose que vous avez déjà créé l'espace "A" aveccoordinates(A) <- ~longitude+latitude
:Au lieu d'un objet géographique ponctuel, cela vous donne simplement un bloc de données, avec le même non. lignes comme A, et une seule variable "code" de chaque polygone qui se croisent de B.
la source
over()
qu'il y avait des problèmes avec les points aux sommets des polygones, bien que je pense que c'est la solution la plus simple que j'ai trouvée jusqu'à présent.Voici une solution similaire à dplyr:
Les données démographiques proviennent de: https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates/datasets/parliamentaryconstituencymidyearpopulationestimates
J'ai dû convertir les fichiers de forme téléchargés depuis en geoJson: https://geoportal.statistics.gov.uk/datasets/westminster-parliamentary-constituencies-december-2018-uk-bgc/data?page=1
Vous pouvez le faire en:
la source