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的实现原理(可能很大一部分会直接照 ...
随机推荐
- 关于vue3简单状态管理约定引发的思考
官方文档的代码是这样的 export const store = { debug: true, state: reactive({ message: 'Hello!' }), setMessageAc ...
- IDEA使用Tomcat时控制台乱码的解决方案>从零开始学JAVA系列
IDEA使用Tomcat时控制台乱码的解决方案 解决方案1,修改启动时虚拟机参数 解决方案2,修改idea的设置 解决方案3,修改idea配置文件 在最后添加一行 '-Dfile.encoding=U ...
- 自学linux——11.shell入门
shell 基础 1.shell介绍(内置脚本) 程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理) 语法简单,代码写起来比较轻松,简单易学 (1)什么是shell shell ...
- PXE高效装机
目录 一.PXE概述 二.PXE的优点 三.搭建PXE的前提 四.部署PXE远程安装服务 1.安装TFTP服务 2.修改TFTP服务的配置文件,并开启服务 关闭防火墙 3.安装DHCP服务 4.修改D ...
- badboy如何录制jmetet脚本
网盘下载: https://pan.baidu.com/s/1mTOEeE47tmk29_wndID3iw 傻瓜式安装即可, 内附教程 1. 打开Badboy, 新建一个文件 2. 输入要录制的网址 ...
- 干了快3年Android了,感觉自己的职业生涯已经快凉了
背景 首先我是个菜鸡,工资也低的一笔. 刚毕业时候在一家国企上班干 app 开发,干了快两年的时候,跳槽到了一家伪大厂干安全.投了不少简历都没有回音,只有这加伪大厂要我就来了.当时说好了会接触一些底层 ...
- 还有更惨的吗?字节面经,美团,网易,招银,360全部在HR前一面挂了
最近一朋友向我吐槽去年的秋招,字节面经,美团,网易,招银,360全部在HR前一面挂了,实在是有点惨.我把他语无伦次的话做了一个整理: 最近真的很暴躁,控制不住自己陷入情绪低落胡思乱想,每天都是在希望失 ...
- Spring Boot 与 R2DBC 整合
R2DBC 是 "Reactive Relational Database Connectivity"的简称.R2DBC 是一个 API 规范的倡议,声明对于访问关系型数据库驱动实 ...
- docker-01
Docker介绍 1 什么是容器? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移 ...
- SpringBoot开发十四-过滤敏感词
项目需求-过滤敏感词 利用 Tire 树实现过滤敏感词 定义前缀树,根据敏感词初始化前缀树,编写过滤敏感词的方法 代码实现 我们首先把敏感词存到一个文件 sensitive.txt: 赌博 嫖娼 吸毒 ...