shp的基本操作
本节将介绍如何利用python完成对shp的基本操作
1.读取shp四至
import shapefile
sf = shapefile.Reader(r"E:\shp\1.shp")
#读取shp四至
min_x, min_y, max_x, max_y = sf.bbox #读取每个图斑四至
shapes = sf.shapes()
arr = []
for i in range(0, len(shapes)):
arr.append(shapes[i].bbox)
利用GDAL ogr读取shp图版四至,并添加到属性表中。
import os
from osgeo import ogr
# shp中添加四至
def shapes_boundary(shp_path):
driver = ogr.GetDriverByName("ESRI Shapefile")
dataSource = driver.Open(shp_path, 1)
layer = dataSource.GetLayer()
new_field1 = ogr.FieldDefn("minX", ogr.OFTReal)
layer.CreateField(new_field1)
new_field2= ogr.FieldDefn("minY", ogr.OFTReal)
layer.CreateField(new_field2)
new_field2 = ogr.FieldDefn("maxX", ogr.OFTReal)
layer.CreateField(new_field2)
new_field2 = ogr.FieldDefn("maxY", ogr.OFTReal)
layer.CreateField(new_field2)
t = int(layer.GetFeatureCount())
for i in range(0, t):
feat = layer.GetFeature(i)
geom = feat.GetGeometryRef()
minX = geom.GetEnvelope()[0]
minY = geom.GetEnvelope()[2]
maxX = geom.GetEnvelope()[1]
maxY = geom.GetEnvelope()[3]
feat.SetField("minX", minX)
feat.SetField("minY", minY)
feat.SetField("maxX", maxX)
feat.SetField("maxY", maxY)
layer.SetFeature(feat)
if __name__ == '__main__':
shp=r"H:\test\1.shp"
shapes_boundary(shp)
python利用ogr写入shp文件,定义shp文件属性字段(field)的数据格式为:
OFTInteger # 整型
OFTIntegerList # 整型list
OFTReal # 双精度
OFTRealList # 双精度list
OFTString # 字符
OFTStringList # 字符list
OFTWideString # 长字符
OFTWideStringList # 长字符list
OFTBinary
OFTDate
OFTTime
OFTDateTime
OFTInteger64
OFTInteger64List
OFSTNone
OFSTBoolean
OFSTInt16
OFSTFloat32
OJUndefined
2.判断某个点是否在shp中
import shapefile
import shapely.geometry as geometry
import numpy as np
lons, lats = [], []
# lons = np.linspace(123.67, 123.32, 50)
# lats = np.linspace(23.48, 25.73, 25)
grid_lon, grid_lat = np.meshgrid(lons, lats)
flat_lon = grid_lon.flatten()
flat_lat = grid_lat.flatten()
flat_points = np.column_stack((flat_lon, flat_lat))
in_shape_points = []
sf = shapefile.Reader("E:/test/1.shp", encoding='gbk')
shapes = sf.shapes()
for pt in flat_points:
if geometry.Point(pt).within(geometry.shape(shapes[0])):
in_shape_points.append(pt)
print("The point is in shp")
else:
print("The point is not in shp")
print(in_shape_points)
3.gdal生成shp
import osgeo.ogr as ogr
import osgeo.osr as osr def run():
driver = ogr.GetDriverByName("ESRI Shapefile")
data_source = driver.CreateDataSource("Gooise.shp")
srs = osr.SpatialReference()
srs.ImportFromEPSG(32631)
layer = data_source.CreateLayer("Gooise", srs, ogr.wkbPolygon)
feature = ogr.Feature(layer.GetLayerDefn())
#创建wkt文本
wkt = 'polygon((646080 5797460,648640 5797460,648640 5794900,646080 5794900,646080 5797460))'
polygon = ogr.CreateGeometryFromWkt(wkt)
feature.SetGeometry(polygon)
layer.CreateFeature(feature)
feature = None
data_source = None
4.shp拆分成多个shp
import osgeo.ogr as ogr
import osgeo.osr as osr def create_shp(shp_name,wkt):
driver = ogr.GetDriverByName("ESRI Shapefile")
data_source = driver.CreateDataSource(f'E:/cq/tif/shp/{shp_name}.shp')
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)
layer = data_source.CreateLayer(f'{shp_name}', srs, ogr.wkbMultiPolygon)
feature = ogr.Feature(layer.GetLayerDefn())
polygon = ogr.CreateGeometryFromWkt(wkt)
feature.SetGeometry(polygon)
layer.CreateFeature(feature)
feature = None
data_source = None def run():
driver = ogr.GetDriverByName('ESRI Shapefile')
fileName = "E:/cq/中小河流.shp"
dataSource = driver.Open(fileName, 0)
layer = dataSource.GetLayer(0)
print("空间参考 :{0}".format(layer.GetSpatialRef()))
for i in range(0, layer.GetFeatureCount()):
feat = layer.GetFeature(i)
wkt = feat.geometry()
print(wkt)
create_shp(i, str(wkt)) if __name__ == '__main__':
run()
5.基于gdal的面矢量面积计算
import ogr def area(shpPath):
'''计算面积'''
driver = ogr.GetDriverByName("ESRI Shapefile")
dataSource = driver.Open(shpPath, 1)
layer = dataSource.GetLayer()
new_field = ogr.FieldDefn("Area", ogr.OFTReal)
new_field.SetWidth(32)
new_field.SetPrecision(16) # 设置面积精度,小数点后16位
layer.CreateField(new_field)
for feature in layer:
geom = feature.GetGeometryRef()
area = geom.GetArea() # 计算面积
# m_area = (area/(0.0089**2))*1e+6 # 单位由十进制度转为米
# print(m_area)
feature.SetField("Area", area) # 将面积添加到属性表中
layer.SetFeature(feature)
dataSource = None
6.使用面积和Value值过滤矢量图层
import sys
from osgeo import ogr, osr, gdal # 过滤矢量图层
def guolv(shp,mask,out,name):
'''
:param shp:shp路径
:param mask:栅格路径,主要用来取投影信息
:param out:输出路径
:param name:文件名
:return:None
'''
driver = ogr.GetDriverByName('ESRI Shapefile')
dataSource = driver.Open(shp, 0) # 0是只读,1可写
if dataSource is None:
print('could not open')
sys.exit(1)
# 获取图层
layer = dataSource.GetLayer(0)
t = int(layer.GetFeatureCount())
drv = ogr.GetDriverByName('ESRI Shapefile')
Polygon = drv.CreateDataSource(out)
data = gdal.Open(mask, gdal.GA_ReadOnly)
prj = osr.SpatialReference()
prj.ImportFromWkt(data.GetProjection())
# oLayer = Polygon.CreateLayer(name, srs=prj, geom_type=ogr.wkbMultiPolygon)
oLayer = Polygon.CreateLayer(name, srs=prj, geom_type=ogr.wkbPolygon)
oDefn = oLayer.GetLayerDefn() # 定义要素
gardens = ogr.Geometry(ogr.wkbPolygon)
oFieldID = ogr.FieldDefn("ID", ogr.OFTInteger) # 创建一个叫ID的整型属性
oLayer.CreateField(oFieldID, 1)
new_field1 = ogr.FieldDefn("minX", ogr.OFTReal)
oLayer.CreateField(new_field1)
new_field2= ogr.FieldDefn("minY", ogr.OFTReal)
oLayer.CreateField(new_field2)
new_field3 = ogr.FieldDefn("maxX", ogr.OFTReal)
oLayer.CreateField(new_field3)
new_field4 = ogr.FieldDefn("maxY", ogr.OFTReal)
oLayer.CreateField(new_field4)
feature = ogr.Feature(oLayer.GetLayerDefn())
ID=0
for i in range(0, t):
feat = layer.GetFeature(i)
wkt = (feat.geometry())
geom = feat.GetGeometryRef()
area = geom.GetArea()
m_area = (area / (0.0089 ** 2)) * 1e+6
v = feat.GetField('Value')
# 面积过滤
if m_area > 10000 and v==1:
ID = ID+1
polygon = ogr.CreateGeometryFromWkt(str(wkt)) ## 生成面
minX = geom.GetEnvelope()[0]
minY = geom.GetEnvelope()[2]
maxX = geom.GetEnvelope()[1]
maxY = geom.GetEnvelope()[3] feature.SetField("minX", float(minX))
feature.SetField("minY", float(minY))
feature.SetField("maxX", float(maxX))
feature.SetField("maxY", float(maxY)) feature.SetGeometry(polygon) ## 设置面
feature.SetField(0, ID)
oLayer.CreateFeature(feature)
shp的基本操作的更多相关文章
- 使用GeoServer发布shp数据为WMS服务和WFS服务
使用GeoServer发布shp数据为WMS服务和WFS服务 1安装GeoServer 2使用GeoServer上传数据 3使用GeoServer发布数据为WMS和WFS 看完本教程,你将学会安装Ge ...
- GeoJson的生成与解析,JSON解析,Java读写geojson,geotools读取shp文件,Geotools中Geometry对象与GeoJson的相互转换
GeoJson的生成与解析 一.wkt格式的geometry转成json格式 二.json格式转wkt格式 三.json格式的数据进行解析 四.Java读写geojson 五.geotools读取sh ...
- Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- 简析服务端通过GT导入SHP至PG的方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要在浏览器端直接上传SHP后服务端进行数据的自动入PG ...
- 三、Redis基本操作——List
小喵的唠叨话:前面我们介绍了Redis的string的数据结构的原理和操作.当时我们提到Redis的键值对不仅仅是字符串.而这次我们就要介绍Redis的第二个数据结构了,List(链表).由于List ...
- 二、Redis基本操作——String(实战篇)
小喵万万没想到,上一篇博客,居然已经被阅读600次了!!!让小喵感觉压力颇大.万一有写错的地方,岂不是会误导很多筒子们.所以,恳请大家,如果看到小喵的博客有什么不对的地方,请尽快指正!谢谢! 小喵的唠 ...
- 一、Redis基本操作——String(原理篇)
小喵的唠叨话:最近京东图书大减价,小喵手痒了就买了本<Redis设计与实现>[1]来看看.这里权当小喵看书的笔记啦.这一系列的模式,主要是先介绍Redis的实现原理(可能很大一部分会直接照 ...
随机推荐
- 微信JSSDK的使用步骤
步骤一:绑定域名 先登录微信公众平台进入"公众号设置"的"功能设置"里填写"JS接口安全域名".(登录后可在"开发者中心" ...
- 单片机学习(二)开发板LED灯的控制
目录 开发板上LED灯相关的电路图 点灯 LED闪烁 LED流水灯 其他效果 灯光二进制计数器 进阶版流水灯 开发板上LED灯相关的电路图 这是P2相关7个引脚的电路图,在默认情况下它是直接接着VCC ...
- vue的项目初始化
1.创建文件 blog 2.下载安装node mongoose 3.(1)vue创建后端项目文件 vue create admin (2)vue创建前端项目文件 vue create web (3)新 ...
- C++1-100之间 7的倍数 带7 打印 敲桌子
1 // 1-100之间 7的倍数 带7 打印 敲桌子 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 ...
- 面试官:MySQL 有哪些锁??
大家好,我是小林. 这次,来说说 MySQL 的锁,主要是 Q&A 的形式,看起来会比较轻松. 不多 BB 了,发车! 在 MySQL 里,根据加锁的范围,可以分为全局锁.表级锁和行锁三类. ...
- Spring学习04(使用注解开发)
7.使用注解开发 说明:在spring4之后,想要使用注解形式,必须得要引入aop的包. 在配置文件当中,还得要引入一个context约束 <?xml version="1.0&quo ...
- Java HashMap【笔记】
Java HashMap[笔记] HashMap HashMap 基本结构 HashMap 底层的数据结构主要是数组 + 链表 + 红黑树 其中当链表的长度大于等于 8 时,链表会转化成红黑树,当红黑 ...
- 《3D打印与工业制造》—— 读书笔记
<3D打印与工业制造>-- 读书笔记 原创内容,学习不易,转载请注明出处! 一.读后感-- "WOW" 可以这么说,<3D打印与工业制造>这本书是我第一 ...
- NOIP 模拟 $23\; \rm 题$
题解 \(by\;zj\varphi\) 考虑 \(\rm DP\) 设 \(dp_{k}(S)\) 表示前 \(k\) 个人来后 \(S\) 集合中的苹果都存在的概率是否大于 \(0\) 考虑倒着转 ...
- 理解js运行时的一些概念
帧:一个帧是一个连续的工作单元.当一个js函数被调用时,运行时环境就会在栈中创建一个帧.帧里保存了特殊的函数参数和局部变量.当函数返回时,帧就被从栈中推出.例如: function foo(b) { ...