Python地图栅格化实例

Python地图栅格化实例引言shapefileGIS中的一种非常重要的数据类型,由ESRI开发的空间数据开放格式,目前该数据格式已经成为了GIS领域的开放标准 。目前绝大多数开源以及收费的GIS软件都支持该数据类型 。事实上,shapefile文件指的一种文件存储的方法,实际上该种文件是由多个文件组成的 。组成一个shapefile有三种文件必不可少, '.shp','.shx','.dbf'文件 。
geopandasshapefile提供了很好的读取与写出支持 。geopandas库允许对几何类型进行空间操作,其中DataFrame结构相当于GIS数据中的一张属性表,使得可以直接操作矢量数据属性表,使得python中操作地理数据更加方便 。本实例通过geopandas实现对地理数据的操作 。
开发准备由于geopandas库的安装需要一些前提库,因此需要先安装一些库
pip install pipwinpipwin install gdalpipwin install fionapip install geopandas实测以上方法可以成功在windows下安装(注:如果在Anaconda下安装geopandas更为方便)
数据准备下载地址
该数据是一段GPS扫描数据,包含经纬度 。
代码实例环境引入【Python地图栅格化实例】import geopandas as gpimport matplotlib.pyplot as pltfrom shapely import geometryimport mathGPS数据处理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()

Python地图栅格化实例

文章插图
构建栅格# 栅格大小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()
Python地图栅格化实例

文章插图
要素叠加# 要素叠加elements = [lake_line]elements += gridselements_ = gp.GeoSeries(elements)elements_.to_file('elements.shp', driver='ESRI Shapefile', encoding='utf-8')elements_.plot()plt.show()
Python地图栅格化实例

文章插图
参考链接python-geopandas读取、创建shapefile文件、geopandas学习教程
GeoPandas官方文档
基于arcpy实现导出区域内网格中心坐标功能
gepandas安装问题

    推荐阅读