【发布时间】: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 对象,所以我正在努力解决这个问题。