如何使用Mapping Toolbox获取全球各国的多边形数据?
全球按区域划分陆地多边形元胞数组获取方案
你安装了Mapping Toolbox的前提下,全程不需要调用worldmap、geoshow这类自带绘图函数,直接读取工具箱内置的标准化行政边界数据集,即可得到按国家、南极洲等特殊陆地区域划分的多边形数据,可直接用于坐标点归属判定场景。
1. 读取内置边界数据
Mapping Toolbox自带3个精度等级的全球陆地区界矢量数据,覆盖所有主权国家、南极洲、争议区域等标注类别,直接用readgeotable读取即可,不需要额外下载外部数据:
- 1:110m精度(适合全球尺度快速计算,文件最小):对应数据名
worldboundaries.shp - 1:50m精度(平衡精度和速度,常规场景推荐):对应数据名
worldboundaries50m.shp - 1:10m精度(最高精度,适合小范围精细判断,文件最大):对应数据名
worldboundaries10m.shp
读取示例代码:
% 这里以常规场景用的50m精度为例 geoTable = readgeotable("worldboundaries50m.shp");
读取得到的地理表中,Shape字段存储每个区域的多边形地理对象,Name字段存储对应区域的名称(如国家名、南极洲等特殊区域标注),其余字段附带ISO编码、所属大洲等辅助属性。
2. 转换为多边形cell array格式
遍历地理表提取每个多边形的经纬度坐标,组装成你需要的元胞数组,同时可以同步生成区域名称元胞数组,方便后续判定结果映射:
regionCount = height(geoTable); % 预分配元胞数组 polyCell = cell(regionCount, 1); regionNameCell = cell(regionCount, 1); for idx = 1:regionCount % 提取单个多边形的经纬度坐标点序列 polyLon = geoTable.Shape(idx).Longitude; polyLat = geoTable.Shape(idx).Latitude; polyCell{idx} = [polyLon, polyLat]; regionNameCell{idx} = geoTable.Name(idx); end
运行完成后polyCell就是按区域划分的全球陆地多边形元胞数组,每个元胞内是N×2的矩阵,第一列为经度、第二列为纬度,对应单个区域的多边形边界顶点序列。
3. 坐标点所属区域判定
拿到元胞数组后,直接用Matlab内置的inpolygon函数即可判断坐标点落在哪个多边形范围内,自带数据集已经完成跨180度经线、南极洲边界的拓扑修正,不需要额外做坐标转换处理:
% 示例:判断经纬度(116.4074, 39.9042)(北京)所属区域 testLon = 116.4074; testLat = 39.9042; matchRegionIdx = 0; for idx = 1:regionCount currentPoly = polyCell{idx}; if inpolygon(testLon, testLat, currentPoly(:,1), currentPoly(:,2)) matchRegionIdx = idx; break; end end if matchRegionIdx > 0 disp("坐标点所属区域:" + regionNameCell{matchRegionIdx}); else disp("坐标点位于海洋或未收录陆地区域"); end
优化提示:如果需要批量判定上万级以上的坐标点,不要逐点逐多边形循环,可使用
geospatialindex构建空间索引加速查询,判定速度能提升1~2个数量级。
内容的提问来源于stack exchange,提问作者Mastiff
相关产品推荐
相关产品推荐

