导出的空间线指向不正确的多边形

时间:2017-09-10 19:18:09

标签: r leaflet geospatial lines polygons

我目前正试图在传单中为R制作流图,以便将某物从一个区域(多边形)移动到另一个区域。

library(sp)
library(rgdal)
library(tidyverse)
library(leaflet)

我在英格兰使用this shapefile地方当局(LAs)作为多边形,并且我从这些地方获得了线坐标。

Map <- readOGR(dsn = "Map", layer = "LEA_Boundaries")
Map <- Map[!is.na(Map$lad16cd),]

我想要从一个多边形的中心到另一个多边形的中心创建线条,所以我使用原点和目标多边形纬度和经度来推导我的线的起点和终点。 我通过从Map的数据槽中采样LA名称,然后再次采样以创建我的起始和结束LA,然后合并起始LA的坐标,接着是结束LA的坐标,来做到这一点。如下:

StartingLA <- sample(Map@data$lad16nm, 100000, replace = TRUE)
NextLA <- sample(StartingLA, 100000, replace = TRUE)
Movement <- data.frame(StartingLA, NextLA)
LD <- merge(Movement, Map@data[,c("lad16nm", "long", "lat")], by.x = "StartingLA", by.y = "lad16nm") %>%
      merge(Map@data[,c("lad16nm", "long", "lat")], by.x = "NextLA", by.y = "lad16nm", suffixes = c("",".y"))

在此之后,我尝试了两种不同的方法来创建空间线,一种是添加贝塞尔线的自定义函数,另一种是gcIntermediate(),我将在这里使用它[&#39}。更容易访问并排除函数中的编程错误。

flow <- gcIntermediate(LD[,c("long", "lat")], LD[,c("long.y", "lat.y")], sp = TRUE, addStartEnd = TRUE)

现在是地图本身;我们会在多边形中添加弹出标签,以便我们可以看到哪些是哪个。

leaflet() %>%
  addProviderTiles(providers$CartoDB.PositronNoLabels) %>%
  addPolygons(data = Map, weight = 1, col = "#000000", fillOpacity = 0, popup = Map@data$lad16nm) %>%
  addPolylines(data = flow)

我们将查看用于创建该行的数据。

LD

在我的地图上,我现在有一条蓝线连接一个多边形到下一个。但是对于StartingLA中的LD,我有东萨塞克斯&#39;和 NextLA是&#39; Hillingdon&#39;,但该线路指向/来自伯明翰和Wandsworth。

使用我的自定义函数来拟合贝塞尔线也是如此,这让我觉得它可能是以前发生的事情,但所有数据都是正确的,直到线条被制作成SpatialLines,之后全部乱七八糟。

有没有人对我在哪里出错有任何见解?

谢谢。

1 个答案:

答案 0 :(得分:1)

Map @ Data对象中的坐标不适合您的用例。

例如,格林威治有坐标-1.108940, 53.52697,它位于唐卡斯特。也许在早期的处理步骤中,坐标和ID在某种程度上无法比拟?

在任何情况下,现在使用Map对象上的rgeos::gCentroid重新计算坐标,然后替换数据文件中的违规列可能是最快/最简单的:

rgeos::gCentroid(Map,byid = T)