在地图上连接HF电台发射与接收站点的技术实现求助
火腿电台发射机与接收机站点连接地图实现
问题背景
开展火腿电台(ham radio)项目时,需在地图上建立发射机与接收机站点间的配对连接,但原有代码无法实现预期的点对点连线效果。
原始数据
rx_sign <- c("2E0ILY/KIWI","ND7M","KP4MD","N2HQI","WA2N","WA2ZKD","OE9TAV","2E0PYB","OE9TAV","2E0ILY/KIWI") rx_lat <- c(52.896,36.229,38.688,43.021,35.813,43.146,47.438,51.771,47.438,52.896) rx_lon <- c(-2.625,-116.042,-121.292,-76.458,-82.542,-77.625,9.625,0.708,9.625,-2.625) tx_sign <- c("2E0JCC","AA5GI","AC9YY","AC9YY","AC9YY","AC9YY","DC6EB","DG8GAD","DG8GAD","DK9MS") tx_lat <- c(51.479,35.479,41.813,41.813,41.813,41.813,49.479,48.438,48.438,50.479) tx_lon <- c(-2.708,-95.042,-88.042,-88.042,-88.042,-88.042,6.958,9.875,9.875,8.958) map_data <- data.frame(rx_sign,rx_lat,rx_lon,tx_sign,tx_lat,tx_lon)
原有代码问题
原有代码中geom_line直接调用rx_lon/rx_lat和tx_lon/tx_lat,会把所有接收机点、所有发射机点分别连在一起,而非按配对关系绘制发射机到接收机的独立连线。
修正后的实现方案
核心是将宽格式的配对数据转换为长格式,让ggplot识别每条连线的起点与终点:
library(ggplot2) library(tidyr) # 处理数据:添加连接ID并转换为长格式 map_data_long <- map_data %>% mutate(link_id = row_number()) %>% pivot_longer( cols = c(rx_lon, tx_lon, rx_lat, tx_lat), names_to = c("type", ".value"), names_pattern = "(rx|tx)_(lon|lat)" ) # 绘制地图 base_world <- map_data("world") ggplot() + # 绘制世界地图底图 geom_polygon(data=base_world, aes(x=long, y=lat, group=group), fill="lightgray", color="white") + # 按连接ID绘制发射机-接收机连线 geom_line(data=map_data_long, aes(x=lon, y=lat, group=link_id), color="red", size=0.8) + # 绘制接收机点位 geom_point(data=map_data, aes(x=rx_lon, y=rx_lat), colour = "yellow", size=1.5, alpha=0.7) + # 绘制发射机点位 geom_point(data=map_data, aes(x=tx_lon, y=tx_lat), colour = "blue", size=1.5, alpha=0.7) + # 调整主题与投影 theme_minimal() + theme(text = element_text(size=12), legend.position="none") + coord_quickmap()
代码说明
mutate(link_id = row_number()):为每一组配对生成唯一ID,确保每条连线独立pivot_longer:将宽格式数据转换为长格式,把同一配对的发射机、接收机坐标归到同一ID下geom_line(aes(group=link_id)):按连接ID分组,实现点对点连线coord_quickmap():优化地图投影,避免经纬度变形
内容的提问来源于stack exchange,提问作者Kyle Hamilton
相关产品推荐
相关产品推荐

