本节将介绍如何利用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的基本操作的更多相关文章

  1. 使用GeoServer发布shp数据为WMS服务和WFS服务

    使用GeoServer发布shp数据为WMS服务和WFS服务 1安装GeoServer 2使用GeoServer上传数据 3使用GeoServer发布数据为WMS和WFS 看完本教程,你将学会安装Ge ...

  2. GeoJson的生成与解析,JSON解析,Java读写geojson,geotools读取shp文件,Geotools中Geometry对象与GeoJson的相互转换

    GeoJson的生成与解析 一.wkt格式的geometry转成json格式 二.json格式转wkt格式 三.json格式的数据进行解析 四.Java读写geojson 五.geotools读取sh ...

  3. Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作

    一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...

  4. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  5. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  6. 简析服务端通过GT导入SHP至PG的方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要在浏览器端直接上传SHP后服务端进行数据的自动入PG ...

  7. 三、Redis基本操作——List

    小喵的唠叨话:前面我们介绍了Redis的string的数据结构的原理和操作.当时我们提到Redis的键值对不仅仅是字符串.而这次我们就要介绍Redis的第二个数据结构了,List(链表).由于List ...

  8. 二、Redis基本操作——String(实战篇)

    小喵万万没想到,上一篇博客,居然已经被阅读600次了!!!让小喵感觉压力颇大.万一有写错的地方,岂不是会误导很多筒子们.所以,恳请大家,如果看到小喵的博客有什么不对的地方,请尽快指正!谢谢! 小喵的唠 ...

  9. 一、Redis基本操作——String(原理篇)

    小喵的唠叨话:最近京东图书大减价,小喵手痒了就买了本<Redis设计与实现>[1]来看看.这里权当小喵看书的笔记啦.这一系列的模式,主要是先介绍Redis的实现原理(可能很大一部分会直接照 ...

随机推荐

  1. rsync(873)未授权访问

    cd vulhub-master/rsync/common docker -composeup -d 检测 1.列出目标服务器的同步目录 rsync 192.168.244.129:: 2.查看模块文 ...

  2. Spring Cloud分区发布实践(4) FeignClient

    上面看到直接通过网关访问微服务是可以实现按区域调用的, 那么微服务之间调用是否也能按区域划分哪? 下面我们使用FeignClient来调用微服务, 就可以配合LoadBalancer实现按区域调用. ...

  3. Serilog 最佳实践

    Serilog 最佳实践 概述 Serilog是 Microsoft .NET 的结构化日志记录库,并已成为[Checkout.com .NET 的首选日志记录库..它支持各种日志记录目的地(称为接收 ...

  4. 内置函数 strlen

    1 //内置函数 strlen 2 //计算字符串的实际长度,不含字符串结束标准\0 3 4 #include<stdio.h> 5 #include<stdlib.h> 6 ...

  5. Spring对Controller、Service、Dao进行Junit单元测试总结

    测试类注解 @RunWith(SpringRunner.class) @SpringBootTest(classes={DemoApplication.class}) 以Controller层的的单元 ...

  6. 内网探测之SPN服务扫描及相关利用

    在写下一个大块之前,补充一些小知识点,也没啥新东西 0x01简介 如果常规扫描服务,结果不理想,非常GG,可以考虑使用SPN进行服务扫描,这是为了借助Kerberos的正常查询行为(向域控发起LDAP ...

  7. vue3 自己做一个轻量级状态管理,带跟踪功能,知道是谁改的,还能定位代码。

    上一篇 https://www.cnblogs.com/jyk/p/14706005.html 介绍了一个自己做的轻量级的状态管理,好多网友说,状态最重要的是跟踪功能,不能跟踪算啥状态管理? 因为vu ...

  8. 深入解析多态和方法调用在JVM中的实现

    深入解析多态和方法调用在JVM中的实现 1. 什么是多态 多态(polymorphism)是面向对象编程的三大特性之一,它建立在继承的基础之上.在<Java核心技术卷>中这样定义: 一个对 ...

  9. NOIP 模拟 7 寿司

    题解 题目 这道题考试的时候直接打暴力,结果暴力连样例都过不了,最后放上去一个玄学东西,骗了 \(5pts\). 正解: 此题中我们可以看到原序列是一个环,所以我们要把它拆成一条链,那么我们需要暴力枚 ...

  10. [ES6深度解析]14:子类 Subclassing

    我们描述了ES6中添加的新类系统,用于处理创建对象构造函数的琐碎情况.我们展示了如何使用它来编写如下代码: class Circle { constructor(radius) { this.radi ...