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的实现原理(可能很大一部分会直接照 ...
随机推荐
- ASP.NET Core下FreeSql的仓储事务
ASP.NET Core下FreeSql的仓储事务 第一步:配置 Startup.cs 注入 引入包 dotnet add package FreeSql dotnet add package Fre ...
- 手写Pascal解释器(二)
目录 一.part4 补充理论知识 二.part5 设计生成式 三.part6 一.part4 承接上次的内容,我们继续编写part4,这个部分我们的任务是完成输入一个仅带乘除运算符的表达式,然后返回 ...
- mout -t -cifs 解析
mount -t cifs //<azurefile_url> <linux_mountpoint(folder)> df 查看挂载 umount取消挂载 umount -l ...
- NDIS LWF:NdisFSendNetBufferLists蓝屏(DRIVER_IRQL_NOT_EQUAL_OR_LESS)
调用NdisFSendNetBufferLists发送自定义数据包后蓝屏,蓝屏代码为DRIVER_IRQL_NOT_EQUAL_OR_LESS,如果创建的NBL都没问题,一定要确保该自定义的NBL要在 ...
- 蓝凌OA前台任意文件读取漏洞利用
近期CNVD爆出漏洞编号:CNVD-2021-28277,首次公开日期为2021-04-15,蓝凌oa存在多个漏洞,攻击者可利用该漏洞获取服务器控制权.今天挑选一个蓝凌OA前台任意文件读取漏洞进行分析 ...
- HDFS总结
hadoop分布式文件存储系统,用来解决海量数据的存储问题 HDFS的组成------核心配置文件:hdfs-site.xml.core-site.xml NameNode:负责整个HDFS集群的管理 ...
- Spring Cloud Alibaba - Spring Cloud Stream 整合 RocketMQ
Spring Cloud Stream 简介 在微服务的开发过程中,可能会经常用到消息中间件,通过消息中间件在服务与服务之间传递消息,不管你使用的是哪款消息中间件,比如RabbitMQ.Kafka和R ...
- Install Fabric 1.8.3 Manually on Ubuntu 12.04
When you install Fabric with apt-get install fabric, you get a fabric with version 1.3.x, which is t ...
- SpringMVC学习03(控制器Controller)
3.控制器Controller 3.1 控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现. 控制器负责解析用户的请求并将其转换为一个模型. 在Spr ...
- Python语言系列-01-入门
python的出生与应用 #!/usr/bin/env python3 # author:Alnk(李成果) """ 1,python的出生与应用 python的创始人为 ...