问题描述
如果您能帮助我解决以下问题,我将不胜感激。我有一张美国县的地图,每个县都有自己的特征,比如土壤电导率。然后我有源和信号接收器的坐标。我需要做的是测量从我的源到接收器的距离,并保存有关距离和我的信号在每个县通过的信息。例如,我的源在A县,我的接收器在B县,所以我需要保存它经过A县的距离和经过B县的距离。它经过的县数可能超过2个。我已经构建了地图并将我的源和接收器的坐标放在上面。
library(sf)
library(tmap)
county_map <- st_read("cty_1930_gis.shp")
qtm(county_map,fill = "cndctmn")
tm_shape(county_map) + tm_polygons(alpha = 0.2,legend.show = FALSE) + tm_shape(stations1) + tm_bubbles(col = "red",size=0.02) + tm_basemap(server = c('OpenStreetMap'))
县地图的导电性
我的来源和我的接收者在地图上
根据我在地图上的边界,我应该使用什么函数来计算我的信号在每个县移动的距离?
解决方法
这是一个 sf
问题,而不是一个 tmap
问题。
这是我推荐的方法:
- 使用 sf 创建从起点(源)到终点(接收方)的空间线。确保使用能够很好地近似距离的地图投影 (crs)(因此不要使用 mercator/wgs84)。
- 使用带有两个参数的
sf::st_intersection
:您刚刚创建的线和空间多边形。 - 结果已经告诉您信号经过了哪些县。
- 使用
st::st_distance
测量每个相交部分的距离。
不确定您是否已经熟悉 sf
。如果不是,则有很多 SO 主题涵盖了这些步骤之一的详细信息。
这是用 Python 回答我的问题的代码,以防有人想使用它
import geopandas
from geopandas import GeoSeries
from shapely.geometry import LineString
data = geopandas.read_file('cty_1930_gis.shp')
data = data.to_crs(epsg=4326)
line = LineString([(lon_x,lat_x),(lon_y,lat_y)])
intersections = map_data.intersection(line)
intersections = intersections[~intersections.is_empty]
intersections = intersections.to_crs(epsg=3815)
lengths = intersections.length
然后在所有感兴趣的点上编写一个向量函数循环。 (当然,选择正确的 epsg 代码很重要)