使用tmap保存有关从点到点移动的路径的信息

问题描述

如果您能帮助我解决以下问题,我将不胜感激。我有一张美国县的地图,每个县都有自己的特征,比如土壤电导率。然后我有源和信号接收器的坐标。我需要做的是测量从我的源到接收器的距离,并保存有关距离和我的信号在每个县通过的信息。例如,我的源在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'))

县地图的导电性

enter image description here

我的来源和我的接收者在地图上

enter image description here

根据我在地图上的边界,我应该使用什么函数来计算我的信号在每个县移动的距离?

解决方法

这是一个 sf 问题,而不是一个 tmap 问题。

这是我推荐的方法:

  1. 使用 sf 创建从起点(源)到终点(接收方)的空间线。确保使用能够很好地近似距离的地图投影 (crs)(因此不要使用 mercator/wgs84)。
  2. 使用带有两个参数的 sf::st_intersection:您刚刚创建的线和空间多边形。
  3. 结果已经告诉您信号经过了哪些县。
  4. 使用 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 代码很重要)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...