【问题标题】:Join SpatialPointsDataFrame and SpatialLinesDataFrame using over(), R使用 over(), R 加入 SpatialPointsDataFrame 和 SpatialLinesDataFrame
【发布时间】:2019-05-02 21:29:21
【问题描述】:

我被一些看起来应该很简单的东西所困扰。抱歉,我是在 R 中使用空间数据的新手。

我正在尝试将城市数据映射到世界海岸线的地图上。我从自然地球数据集 (https://www.naturalearthdata.com/downloads/) 1:110m 数据中获取了海岸线并生成了空间线数据框:

coast_rough_sldf
class       : SpatialLinesDataFrame 
features    : 134 
extent      : -180, 180, -85.60904, 83.64513  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
variables   : 3
names       : scalerank, featurecla, min_zoom 
min values  :         0,  Coastline,      0.0 
max values  :         1,    Country,      1.5 

我还有一个城市数据集,其中的一个样本如下所示:

city_coast <- data.frame(Latitude = c(-34.60842, -34.47083, -34.55848, -34.76200, -34.79658, -34.66850), 
              Longitude = c(-58.37316, -58.52861, -58.73540, -58.21130, -58.27601, -58.72825), 
              Name1 = c("Buenos Aires", "San Isidro", "San Miguel", "Berazategui", "Florencio Varela", "Merlo"), 
              distance = c(7970.091,  5313.518, 26156.700, 11670.274, 18409.738, 33880.259))
city_coast

Latitude Longitude            Name1  distance
1 -34.60842 -58.37316     Buenos Aires  7970.091
2 -34.47083 -58.52861       San Isidro  5313.518
3 -34.55848 -58.73540       San Miguel 26156.700
4 -34.76200 -58.21130      Berazategui 11670.274
5 -34.79658 -58.27601 Florencio Varela 18409.738
6 -34.66850 -58.72825            Merlo 33880.259

然后我成功创建了空间点数据框:

city_spdf <- SpatialPointsDataFrame(coords = select(city_coast, c("Longitude", "Latitude")),
                                    proj4string = CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84"),
                                    data = select(city_coast, c("Name1", "distance")))

city_spdf

class       : SpatialPointsDataFrame 
features    : 6 
extent      : -58.7354, -58.2113, -34.79658, -34.47083  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
variables   : 2
names       :       Name1,  distance 
min values  : Berazategui,  5313.518 
max values  :  San Miguel, 33880.259 

现在我想加入 city_spdf 和 Coast_sldf,这样我就可以使用 tmap 绘制它们。看教程似乎我应该使用 over():

city_coast_shp <- over(coast_rough_sldf, city_spdf)

city_coast_shp

Name1 distance
1  <NA>       NA

这显然是错误的。切换对象的顺序会改变一些事情,但仍然没有给我我需要的东西。

谁能告诉我这个 over 函数我有什么不对劲的地方吗?我看到的每个示例都只是让人们加入两个空间对象。抱歉,如果我遗漏了一些非常简单的东西。

【问题讨论】:

  • 使用library(sf) 的类似解决方案对您有价值吗?
  • 你的点和线真的重叠了吗?虽然布宜诺斯艾利斯是一个沿海城市,但这并不意味着该点会与您的线要素相交。你能得到城市边界的多边形并尝试一下吗?或者也许做一些类似最近邻居的事情来分配一个海岸
  • @elmuertefurioso 对不起,也许我误解了一些东西。我不需要它们相交。我只是想根据我从距离测量中生成的分类变量来绘制它们并为它们着色。我的理解是我需要它们在同一个空间对象中才能在 tmap 中使用。我有这个问题吗?
  • 我只是不知道spatial 以及我知道sf 但是如果今晚没有人回来,我明天会帮助sf 解决方案
  • @Nate 我尝试使用 sf() 将空间线数据帧转换为空间多边形数据帧。我按照此处的说明进行操作:stackoverflow.com/questions/47147242/…,但产生了错误:SpatialPolygonsDataFrame(x, y, match.ID = match.ID, ...) 中的错误:对象长度不匹配。因为我不太确定什么是 sf 对象,所以我正在努力解决这个问题。

标签: r spatial


【解决方案1】:

就像@elmuertefurioso 在 cmets 中指出的那样,我认为这不能按您的预期工作的一个原因是几何类型的混淆。

由于coastline 数据是线,而不是像tmap 中的data(World) 这样的多边形,因此您在使用cities(即点)进行的计算和比较时会受到一些限制。

sf方式读入数据:

library(sf)

# downloaded from https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/physical/ne_110m_coastline.zip
coastline <- read_sf("~/Downloads/ne_110m_coastline/ne_110m_coastline.shp")

cities <- data.frame(
  Latitude = c(-34.60842, -34.47083, -34.55848, -34.76200, -34.79658, -34.66850), 
  Longitude = c(-58.37316, -58.52861, -58.73540, -58.21130, -58.27601, -58.72825), 
  Name1 = c("Buenos Aires", "San Isidro", "San Miguel", "Berazategui", "Florencio Varela", "Merlo"), 
  distance = c(7970.091,  5313.518, 26156.700, 11670.274, 18409.738, 33880.259)
  )

为了在sf 对象之间进行任何比较,它们必须具有相同的坐标参考系。因此,当我们在cities 中阅读时,我们会将 CRS 设置为 coastline 的 CRS。

cities <- st_as_sf(
  cities,
  coords = c("Longitude", "Latitude"), # must be x, y order
  crs = st_crs(coastline) # must be equivilant between objects
  )

现在您可以使用st_{comparison}() 系列函数进行比较。

函数over() 及其对应的sf st_intersects() 可以在一组点和多边形上工作,但我们这里没有。我们可以使用距离函数,如 st_nearest_feature() 与点和线,从 coastline 获取每个城市的最接近几何形状。

st_nearest_feature(cities, coastline)

它返回coastlines 中最近几何图形的行索引,这对于这里的所有城市来说都是相同的,因为它们都在阿根廷。函数中的顺序很重要,因为它定义了要问的问题如果我们将其翻转为 st_nearest_feature(coastline, cities),它将返回 coastline 中每个几何图形的最近城市,因此返回将有 134 个元素。

也就是说,您实际上不需要进行任何连接或比较即可将您的观点集中在同一个 tmap 上。

library(tmap)

tmap_mode("view")

tm_shape(coastline) +
  tm_lines() +
tm_shape(cities) +
  tm_bubbles("distance")

我不是tmap 用户,但我只是放大了这个屏幕截图以显示它的工作原理。

【讨论】:

  • 非常感谢。这是一个非常彻底的答案。我误解了over() 的操作,也感谢sf() 的语法。线和点空间对象的解释是有道理的。对于tmap(),我做错了。我在尝试:tm_shape(coastline) + tm_lines() + tm_bubbles(data = cities, size = "distance")。遵循 ggplot() 语法。为这个简单的错误道歉 - 很高兴现在一切正常。将对sf()进行更多探索。
猜你喜欢
  • 2014-08-19
  • 2015-09-12
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 2017-10-04
  • 2014-07-07
  • 2021-02-08
相关资源
最近更新 更多