Python地图栅格化实例引言shapefile
是GIS
中的一种非常重要的数据类型,由ESRI
开发的空间数据开放格式,目前该数据格式已经成为了GIS
领域的开放标准 。目前绝大多数开源以及收费的GIS
软件都支持该数据类型 。事实上,shapefile
文件指的一种文件存储的方法,实际上该种文件是由多个文件组成的 。组成一个shapefile
有三种文件必不可少, '.shp','.shx','.dbf'文件 。
geopandas
对shapefile
提供了很好的读取与写出支持 。geopandas
库允许对几何类型进行空间操作,其中DataFrame
结构相当于GIS
数据中的一张属性表,使得可以直接操作矢量数据属性表,使得python中操作地理数据更加方便 。本实例通过geopandas
实现对地理数据的操作 。
开发准备由于geopandas
库的安装需要一些前提库,因此需要先安装一些库
pip install pipwinpipwin install gdalpipwin install fionapip install geopandas
实测以上方法可以成功在windows下安装(注:如果在Anaconda下安装geopandas
更为方便)
数据准备下载地址
该数据是一段GPS扫描数据,包含经纬度 。
代码实例环境引入import geopandas as gpimport matplotlib.pyplot as pltfrom shapely import geometryimport math
GPS数据处理【Python地图栅格化实例】lake_original_path = 'data.txt'lake_original_datahttps://www.huyubaike.com/biancheng/= ''lake_points = []# 读取文件with open(lake_original_path) as f:lake_original_data = https://www.huyubaike.com/biancheng/f.read()# 处理经纬度坐标 并以Point的形式添加到list中for xy in lake_original_data.split(';'):x, _, y = xy.partition(',')x = float(x.strip()) / 100y = float(y.strip()) / 100lake_points.append(geometry.Point(y, x))
创建要素# 创建线状要素lake_line = geometry.LineString(lake_points)# crs指定坐标系lake_ = gp.GeoSeries(lake_line, crs='EPSG:4326')# 保存shp文件lake_.to_file("boundary.shp", driver='ESRI Shapefile', encoding='utf-8')# 记录边界条件 用于构建栅格x_min, y_min, x_max, y_max = lake_line.bounds[:4]# 绘图lake_.plot()plt.show()
文章插图
构建栅格
# 栅格大小GRID_WIDTH = 0.009 * 2 / 100grid_rows_num = int(math.ceil((y_max - y_min) / float(GRID_WIDTH)))grid_columns_num = int(math.ceil((x_max - x_min) / float(GRID_WIDTH)))grids = []for r in range(grid_rows_num):for c in range(grid_columns_num):grid_4coords = []# 左上角x_lt = x_min + c * GRID_WIDTHy_lt = y_max - r * GRID_WIDTH# 右上角x_rt = x_lt + GRID_WIDTHy_rt = y_lt# 左下角x_lb = x_lty_lb = y_lt - GRID_WIDTH# 右下角x_rb = x_rty_rb = y_lb# 两个三角形拼接一个栅格grid_4coords.append(geometry.Point(x_lt,y_lt))grid_4coords.append(geometry.Point(x_rt,y_rt))grid_4coords.append(geometry.Point(x_rb,y_rb))grid_4coords.append(geometry.Point(x_lb,y_lb))grid_4coords.append(geometry.Point(x_lt,y_lt))# 创建一个网格grids.append(geometry.LineString(grid_4coords))grid_ = gp.GeoSeries(grids)grid_.to_file('E:\\just\\海韵湖智能技术实验场\\data\\grids.shp',driver='ESRI Shapefile', encoding='utf-8')grid_.plot()plt.show()
文章插图
要素叠加
# 要素叠加elements = [lake_line]elements += gridselements_ = gp.GeoSeries(elements)elements_.to_file('elements.shp', driver='ESRI Shapefile', encoding='utf-8')elements_.plot()plt.show()
文章插图
参考链接python-geopandas读取、创建shapefile文件、geopandas学习教程
GeoPandas官方文档
基于arcpy实现导出区域内网格中心坐标功能
经验总结扩展阅读
- subprocess Python编程之子进程管理详解
- python基础--简单数据类型预览
- python基础-较复杂数据类型预览
- 1 Python全栈工程师之从网页搭建入门到Flask全栈项目实战 - ES6标准入门和Flex布局
- 堆叠大陆地图怎么获取
- python的基本运用
- python-绘图与可视化
- Python函数-2V2
- Jupyter,Matplotlib,Pandas 【机器学习】利用 Python 进行数据分析的环境配置 Windows
- 利用Pandas处理数据 缺失值的处理 数据库的使用 python-数据描述与分析2