爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 402|回复: 8

[经验总结] 天地图“带审图号”的行政区划数据

[复制链接]

新浪微博达人勋

发表于 2024-4-30 21:10:03 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 灭火器 于 2024-4-30 21:13 编辑

看到好几个公众号有发带“2024 年最新审图号”的行政区划数据,是 天地图行政区划可视化 页面提供的 GeoJSON 文件,注册天地图账号后即可下载。我看各公众号提供的都是 shapefile 版的而不是 GeoJSON 版的,因此自己打包一份发在论坛上。

Snipaste_2024-04-30_21-09-04.png

这套数据的特点是:
- 含省、市、县三个级别的数据(国界可以手动用省界合成)
- 由 MultiPolygon、LineString 和 MultiLineString 组成,前者对应行政区划的面元,后两者对应九段线、未定国界线、港澳特区线、海上省界等装饰线,有助于让画出来的地图更接近标准地图网的那种。
- 跟 GCJ-02 的数据对比了一下,坐标应该是 WGS84 的。
- 分辨率略低,没几个字段

地理上的正确性我就不太懂了,可以参考这个公众号链接:首次!!带审图号的"行政区划"矢量数据(GeoJSON)

注意,有审图号的是原链接里那张网络墨卡托投影的地图,而用来画图的数据是不存在审图号的概念的。只不过我们用这套官方的数据来画图能更有底气。

下面附带 Cartopy 读取 GeoJSON 画图的例子
  1. import json
  2. import shapely.geometry as sgeom
  3. import matplotlib.pyplot as plt
  4. import cartopy.crs as ccrs

  5. with open('中国_省.geojson') as f:
  6.     features = json.load(f)['features']
  7. geoms = [sgeom.shape(ft['geometry']) for ft in features]

  8. crs = ccrs.PlateCarree()
  9. plt.figure(figsize=(10, 10))
  10. ax = plt.axes(projection=crs)
  11. ax.set_extent([72, 136, 2, 56], crs)
  12. ax.stock_img()
  13. ax.add_geometries(geoms, crs, fc='none', ec='k', lw=0.5)
  14. ax.add_geometries(geom, crs, fc='r', ec='k', lw=0.5)
  15. plt.show()
复制代码
test.png
天地图行政区划可视化.zip (4.2 MB, 下载次数: 45)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2024-5-5 09:41:23 | 显示全部楼层
口蘑战士 发表于 2024-5-4 15:29
国界可以手动用省界合成
lz可以出个教程不
  1. import json

  2. import shapely.geometry as sgeom
  3. import matplotlib.pyplot as plt
  4. import cartopy.crs as ccrs
  5. from shapely.ops import unary_union

  6. with open('中国_省.geojson') as f:
  7.     geoj = json.load(f)

  8. # 提取省界多边形
  9. provinces = []
  10. for feature in geoj['features']:
  11.     geometry = feature['geometry']
  12.     if geometry['type'] in ('Polygon', 'MultiPolygon'):
  13.         provinces.append(sgeom.shape(geometry))

  14. # 省界合成国界
  15. country = unary_union(provinces)

  16. # 构造国界的GeoJSON
  17. new_geoj = {
  18.     'type': 'FeatureCollection',
  19.     'features': [
  20.         {
  21.             'type': 'Feature',
  22.             'geometry': sgeom.mapping(country),
  23.             'properties': {'name': '国界'}
  24.         }
  25.     ]
  26. }

  27. with open('中国_国.geojson', 'w') as f:
  28.     json.dump(new_geoj, f)

  29. # 画个图看看
  30. crs = ccrs.PlateCarree()
  31. ax = plt.axes(projection=crs)
  32. ax.set_extent((70, 140, 0, 60), crs)
  33. ax.add_geometries(country, crs, fc='none', ec='k')
  34. plt.show()
复制代码


用 geopandas 确实会更方便,但我刚把带有 geopandas 的环境搞崩了,所以这里就写个用 shapely 的。

评分

参与人数 1金钱 +3 收起 理由
口蘑战士 + 3 很给力!

查看全部评分

密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2024-5-1 13:37:18 | 显示全部楼层
顺着lz说一下,geopandas可以直接把geojson转成shp
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-5-4 15:29:21 | 显示全部楼层
国界可以手动用省界合成
lz可以出个教程不
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-5-6 10:30:59 | 显示全部楼层
有用的分享,学到啦
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-5-6 17:37:22 | 显示全部楼层
灭火器 发表于 2024-5-5 09:41
用 geopandas 确实会更方便,但我刚把带有 geopandas 的环境搞崩了,所以这里就写个用 shapely 的。

大佬!根据这些文件可以产出九段线的geojson么
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-5-6 18:42:18 | 显示全部楼层
口蘑战士 发表于 2024-5-6 17:37
大佬!根据这些文件可以产出九段线的geojson么

省市县三个文件里都以 MultiLineString 的形式带九段线,不过跟未定国境线、海上省界线等混在一起,名字都被设成了“国境线”。你循环一下把所有线元素提取出来,然后画出来试试,就能从这些线中找出九段线。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-5-7 14:55:51 | 显示全部楼层
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2024-5-7 15:19:47 | 显示全部楼层
灭火器 发表于 2024-5-6 18:42
省市县三个文件里都以 MultiLineString 的形式带九段线,不过跟未定国境线、海上省界线等混在一起,名字 ...

好的好的!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表