爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 24117|回复: 7

[源代码] 下载地图包,并基于python的pyshp库读取.shp数据来获取中国省界的经纬度数据

[复制链接]

新浪微博达人勋

发表于 2019-6-24 15:59:21 | 显示全部楼层 |阅读模式

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

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

x
https://blog.csdn.net/weixin_43718675/article/details/93410875  这是我在CSDN上写的文章目前画地图的软件都能很方便的调用省界数据,但是如果想要单独对省界做一些个性化设置,如设置宽度、样式、颜色什么的,就需要将省界数据单独拿出来进行设置了。

软件在画地图时,描述的边界都是一些列经纬度格点的集合。目前常用的存储边界信息的文件格式为.shp格式(虽然我也不太明白为什么要用这种稀罕的格式)。
接下来详细介绍如何通过python获取省界数据
1. 下载边界数据
可以参考如下链接:
https://blog.csdn.net/weixin_36677127/article/details/83314583
https://gadm.org/download_country_v3.html  这个链接进去后,
如下:



                               
登录/注册后可看大图


                               
登录/注册后可看大图

下载完成,解压缩,文件信息如下:

                               
登录/注册后可看大图



从这个文件夹中可以看到尾号为0 1 2 3 的文件,应该是分别表示 国界、省界、市界和县(区)界;
虽然相同尾号的文件有5个,但是最为重要的还是.shp文件。该文件包含了重要的地理边界信息。


2.  读取.shp文件

现在读取的.shp文件的库有很多,
https://mp.weixin.qq.com/s/aAucKybX_FE8aImja_M8VQ  可以参考这个链接
这里使用 pyshp库进行处理
可以参考这个链接:https://blog.csdn.net/GISuuser/article/details/81664223

```
import shapefile
import numpy as np
from mpl_toolkits.basemap import Basemap

file=shapefile.Reader('gadm36_CHN_shp/gadm36_CHN_1.shp')  #读取省界.shp文件
shapes=file.shapes()   #获取point
records=file.records() #获取省名称
```
打开shapes文件:



                               
登录/注册后可看大图

打开第一个shapes的第一个Shape文件,可以看到地理信息保存在points里面,每一个点是一个经纬度二元组。


                               
登录/注册后可看大图

打开records文件,可以看到一些具体省名称信息:
records=file.records()
records


                               
登录/注册后可看大图


```
pro_points=[]  #建立省边界列表
pro_names=[] #建立省名称列表

for i in range(len(shapes)):
    points=shapes.points #h获取经纬度数据   
    pro_name=file.records()[3]  #获取省名称
    lon =[]  
    lat  =[]
    #将每个tuple的lon和lat组合起来
    [lon.append(points[0]) for i in range(len(points))]  
    [lat.append(points[1]) for i in range(len(points))]   

    lon=np.array(lon).reshape(-1,1)
    lat=np.array(lat).reshape(-1,1)
    loc=np.concatenate((lon,lat),axis=1)

    pro_points.append(loc)
    pro_names.append(pro_name)
```
形成的pro_names和pro_points如下:


                               
登录/注册后可看大图



现在将

```
lat_min,lat_max=37,55
lon_min,lon_max=115,135

fig = plt.figure(figsize=(18,10))
ax1 = fig.add_axes([0.1,0.1,0.8,0.8])

m=Basemap(projection='cyl',llcrnrlat=lat_min,llcrnrlon=lon_min,
       urcrnrlat=lat_max,urcrnrlon=lon_max,resolution='l',ax=ax1)

m.drawcoastlines()
m.drawcountries()

name_list=['Liaoning','Jilin','Beijing','Hebei','Heilongjiang']  #画出这几个省的边界

for name,point in zip(pro_names,pro_points):

    if name in name_list:

        lon=point[:,0]
        lat=point[:,1]

        plt.scatter(lon,lat,marker='.',c='k',s=0.5)
```


                               
登录/注册后可看大图


3. 将省界数据保存下来
为了方便后面调用,可以考虑所有数据保存为.hdf文件,调用h5py库就好了

```
import h5py

file_name='province_boundary_lon_lat.hdf'  #保存的目标文件名和路径
f=h5py.File(file_name,mode='w')  #创建一个hdf文件

for pro_name,points in zip(pro_names,pro_points):
   #每一个省份创建一个群组
    a=f.create_group(pro_name)
    a['longitude']=points[:,0]
    a['latitude']=points[:,1]

f.close() #写入完成后,记得关掉。
```


                               
登录/注册后可看大图

创建完成以后,由相关hdf软件打开以后,结果如上图

attention !!!
台湾是中国领土不可分割的一部分!
还是在那个网址


                               
登录/注册后可看大图

一样的下载方式。后面获取台湾边界的经纬度格点的方式和上述一样,这里就不详细介绍了。


生成的这个hdf文件,在气象家家园上有,下载链接为 http://bbs.06climate.com/forum.php?mod=viewthread&tid=91308







密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2020-6-9 10:09:25 | 显示全部楼层
18393810639 发表于 2020-6-9 00:16
非常感谢指出这么严重的问题,麻烦问问正确的shp在哪里能下载吗?

http://bbs.06climate.com/forum.php?mod=viewthread&tid=34861
这个萝卜他们在论坛上边分享过
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2020-6-8 20:00:17 | 显示全部楼层
楼主网址给出的shape文件千万不要用!
因为边界存在非常严重的问题!
红线是国家地理信息局的边界,绿线是这个GADM的,除了没有九段线和台湾之外,藏南以及西部区域都少了很多。
chn.png

但是边界线绘图的做法可以借鉴。
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2020-6-4 22:29:05 | 显示全部楼层
学习了学习了 感谢楼主的分享
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-6-9 00:16:49 | 显示全部楼层
Masterpiece 发表于 2020-6-8 20:00
楼主网址给出的shape文件千万不要用!
因为边界存在非常严重的问题!
红线是国家地理信息局的边界,绿线 ...

非常感谢指出这么严重的问题,麻烦问问正确的shp在哪里能下载吗?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2020-6-9 10:12:43 | 显示全部楼层
18393810639 发表于 2020-6-9 00:16
非常感谢指出这么严重的问题,麻烦问问正确的shp在哪里能下载吗?

省及以下级别的2019年最新行政区划:
https://mp.weixin.qq.com/s/0NvL6JPdOQTOWztUJvij2g
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-9-23 21:14:15 | 显示全部楼层
非常好我试试看
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-9-24 09:21:08 | 显示全部楼层
楼主威武,下载感受一下
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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