能否通过地理坐标获取folium地图背景色,判断点的水陆属性?
关于用folium判断坐标是陆地还是水域的问题
直接通过folium获取地图背景色的思路不可行,原因有两点:
- folium依赖第三方地图瓦片(如OpenStreetMap),不同瓦片的配色规则不统一,同一坐标在不同瓦片、不同缩放级别下的像素颜色可能不同;
- 从瓦片图片中提取对应坐标的像素颜色需要额外处理瓦片定位、像素映射,技术复杂度高且准确率无法保证。
推荐以下几种可靠的替代方案:
1. 使用地理空间数据集(最稳定)
下载公开的陆地/水域边界数据(如Natural Earth的全球陆地数据集),用geopandas进行空间判断:
import geopandas as gpd from shapely.geometry import Point # 加载预先下载的陆地边界Shapefile land_data = gpd.read_file("natural_earth_land.shp") # 待判断的坐标(注意是 经度, 纬度 顺序) target_point = Point(116.4074, 39.9042) # 判断点是否在陆地区域内 is_land = land_data.contains(target_point).any() print("该坐标位于陆地" if is_land else "该坐标位于水域")
2. 调用地理查询API
利用OpenStreetMap的Nominatim API反向查询坐标的地理属性:
import requests lat, lon = 39.9042, 116.4074 api_url = f"https://nominatim.openstreetmap.org/reverse?lat={lat}&lon={lon}&format=json" response = requests.get(api_url).json() # 解析返回的地址信息判断类型 address = response.get("address", {}) if address.get("natural") == "water": print("该坐标位于水域") else: print("该坐标位于陆地")
3. 使用osmnx库查询土地利用
osmnx可以直接从OpenStreetMap获取坐标周边的地理要素:
import osmnx as ox lat, lon = 39.9042, 116.4074 # 查询坐标周边10米范围内的自然要素 water_tags = {"natural": ["water", "lake", "river"]} gdf = ox.geometries.geometries_from_point((lat, lon), water_tags, dist=10) if not gdf.empty: print("该坐标位于水域") else: print("该坐标位于陆地")
folium的核心定位是地图可视化,不适合做这类空间分析操作,以上方案的准确率和稳定性都远高于获取瓦片颜色的思路。
内容的提问来源于stack exchange,提问作者Birosc
相关产品推荐
相关产品推荐

