如何从Leaflet/ArcGIS地图下载2013-2015年标记区域数据为KML用于R分析
解决方案:提取、清洗地理数据并转换为KML/GeoJSON
1. 修正JSON解析步骤
你的现有代码错误地将已提取的JSON字符串再次用toJSON()编码,这会导致数据被二次编码无法正常解析。改用jsonlite::fromJSON()将字符串转为可操作的R数据结构:
# 加载所需包 library(jsonlite) library(sf) # 读取并提取JSON片段(保留你原有的提取逻辑) html_in_path <- "C:/Users/username/Downloads/index.html" html_lines <- readLines(html_in_path) GeoData <- html_lines[23] start_string_remove <- '<script type="application/json" data-for="htmlwidget-d7e42020b87f95ae6d45">' GeoData1 <- gsub(start_string_remove, '', GeoData) GeoData1 <- gsub("</script>", "", GeoData1) # 解析JSON为R对象(关键修正:用fromJSON而非toJSON) GeoData_parsed <- fromJSON(GeoData1)
2. 提取地理要素并转为SF对象
网站的地图数据通常存储在x$features节点下(对应GeoJSON标准结构),将其转换为SF对象以便后续分析:
# 提取features地理要素部分 geo_features <- GeoData_parsed$x$features # 转换为sf对象,指定坐标系为WGS84(EPSG:4326,KML默认坐标系) sf_data <- st_as_sf(geo_features, crs = 4326) # 过滤2013-2015年的数据(根据实际字段名调整,示例假设年份字段为year) sf_data_filtered <- sf_data[sf_data$year %in% 2013:2015, ]
如果不确定数据结构,可通过str(GeoData_parsed)查看层级,找到存储地理要素的正确路径。
3. 导出为KML或GeoJSON
SF包支持直接导出为KML和GeoJSON格式,满足后续交叉分析需求:
# 导出为KML格式 st_write(sf_data_filtered, "标记区域_2013-2015.kml", driver = "KML") # 可选:导出为GeoJSON格式 st_write(sf_data_filtered, "标记区域_2013-2015.geojson", driver = "GeoJSON")
验证数据有效性
导出后可读取文件验证数据是否正常:
test_data <- st_read("标记区域_2013-2015.kml") plot(test_data)
内容的提问来源于stack exchange,提问作者Pedro Leo
相关产品推荐
相关产品推荐

