日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

python使用gdal對shp讀取,新建和更新的實例

瀏覽:26日期:2022-08-02 17:52:00

昨天要處理一個shp文件,讀取里面的信息,做個計算然后寫到后面新建的field里面。先寫個外面網上都能找到的新建和讀取吧。

1.讀取shp文件

#-*- coding: cp936 -*-try: from osgeo import gdal from osgeo import ogrexceptImportError: import gdal import ogr defReadVectorFile(): # 為了支持中文路徑,請添加下面這句代碼 gdal.SetConfigOption('GDAL_FILENAME_IS_UTF8','NO') # 為了使屬性表字段支持中文,請添加下面這句 gdal.SetConfigOption('SHAPE_ENCODING','') strVectorFile ='E:DatumGDALCsTestDebugbeijing.shp' # 注冊所有的驅動 ogr.RegisterAll() #打開數據 ds = ogr.Open(strVectorFile, 0) if ds == None: print('打開文件【%s】失敗!', strVectorFile) return print('打開文件【%s】成功!', strVectorFile) # 獲取該數據源中的圖層個數,一般shp數據圖層只有一個,如果是mdb、dxf等圖層就會有多個 iLayerCount = ds.GetLayerCount() # 獲取第一個圖層 oLayer = ds.GetLayerByIndex(0) if oLayer == None: print('獲取第%d個圖層失敗!n', 0) return # 對圖層進行初始化,如果對圖層進行了過濾操作,執行這句后,之前的過濾全部清空 oLayer.ResetReading() # 通過屬性表的SQL語句對圖層中的要素進行篩選,這部分詳細參考SQL查詢章節內容 oLayer.SetAttributeFilter(''NAME99'LIKE '北京市市轄區'') # 通過指定的幾何對象對圖層中的要素進行篩選 #oLayer.SetSpatialFilter() # 通過指定的四至范圍對圖層中的要素進行篩選 #oLayer.SetSpatialFilterRect() # 獲取圖層中的屬性表表頭并輸出 print('屬性表結構信息:') oDefn = oLayer.GetLayerDefn() iFieldCount = oDefn.GetFieldCount() for iAttr in range(iFieldCount): oField =oDefn.GetFieldDefn(iAttr) print( '%s: %s(%d.%d)' % ( oField.GetNameRef(), oField.GetFieldTypeName(oField.GetType() ), oField.GetWidth(), oField.GetPrecision())) # 輸出圖層中的要素個數 print('要素個數 = %d', oLayer.GetFeatureCount(0)) oFeature = oLayer.GetNextFeature() # 下面開始遍歷圖層中的要素 while oFeature is not None: print('當前處理第%d個: n屬性值:', oFeature.GetFID()) # 獲取要素中的屬性表內容 for iField inrange(iFieldCount): oFieldDefn =oDefn.GetFieldDefn(iField) line = ' %s (%s) = ' % ( oFieldDefn.GetNameRef(), ogr.GetFieldTypeName(oFieldDefn.GetType()))ifoFeature.IsFieldSet( iField ): line = line+ '%s' % (oFeature.GetFieldAsString( iField ) ) else: line = line+ '(null)'print(line) # 獲取要素中的幾何體 oGeometry =oFeature.GetGeometryRef() # 為了演示,只輸出一個要素信息 break print('數據集關閉!')

2.新建shp文件

#-*- coding: cp936 -*-try: from osgeo import gdal from osgeo import ogrexceptImportError: import gdal import ogr defWriteVectorFile(): # 為了支持中文路徑,請添加下面這句代碼 gdal.SetConfigOption('GDAL_FILENAME_IS_UTF8','NO') # 為了使屬性表字段支持中文,請添加下面這句 gdal.SetConfigOption('SHAPE_ENCODING','') strVectorFile ='E:TestPolygon.shp' # 注冊所有的驅動 ogr.RegisterAll() # 創建數據,這里以創建ESRI的shp文件為例 strDriverName = 'ESRIShapefile' oDriver =ogr.GetDriverByName(strDriverName) if oDriver == None: print('%s 驅動不可用!n', strDriverName) return # 創建數據源 oDS =oDriver.CreateDataSource(strVectorFile) if oDS == None: print('創建文件【%s】失敗!', strVectorFile) return # 創建圖層,創建一個多邊形圖層,這里沒有指定空間參考,如果需要的話,需要在這里進行指定 papszLCO = [] oLayer =oDS.CreateLayer('TestPolygon', None, ogr.wkbPolygon, papszLCO) if oLayer == None: print('圖層創建失敗!n') return # 下面創建屬性表 # 先創建一個叫FieldID的整型屬性 oFieldID =ogr.FieldDefn('FieldID', ogr.OFTInteger) oLayer.CreateField(oFieldID, 1) # 再創建一個叫FeatureName的字符型屬性,字符長度為50 oFieldName =ogr.FieldDefn('FieldName', ogr.OFTString) oFieldName.SetWidth(100) oLayer.CreateField(oFieldName, 1) oDefn = oLayer.GetLayerDefn() # 創建三角形要素 oFeatureTriangle = ogr.Feature(oDefn) oFeatureTriangle.SetField(0, 0) oFeatureTriangle.SetField(1, '三角形') geomTriangle =ogr.CreateGeometryFromWkt('POLYGON ((0 0,20 0,10 15,0 0))') oFeatureTriangle.SetGeometry(geomTriangle) oLayer.CreateFeature(oFeatureTriangle) # 創建矩形要素 oFeatureRectangle = ogr.Feature(oDefn) oFeatureRectangle.SetField(0, 1) oFeatureRectangle.SetField(1, '矩形') geomRectangle =ogr.CreateGeometryFromWkt('POLYGON ((30 0,60 0,60 30,30 30,30 0))') oFeatureRectangle.SetGeometry(geomRectangle) oLayer.CreateFeature(oFeatureRectangle) # 創建五角形要素 oFeaturePentagon = ogr.Feature(oDefn) oFeaturePentagon.SetField(0, 2) oFeaturePentagon.SetField(1, '五角形') geomPentagon =ogr.CreateGeometryFromWkt('POLYGON ((70 0,85 0,90 15,80 30,65 15,700))') oFeaturePentagon.SetGeometry(geomPentagon) oLayer.CreateFeature(oFeaturePentagon) oDS.Destroy() print('數據集創建完成!n')

3.更新

其實更新無非就是獲取到field然后設置新值就可以了

其實用SetField()方法就行

import os,sysfrom osgeo import gdalfrom osgeo import ogrfrom osgeo import osrimport numpyimport transformer# 為了支持中文路徑,請添加下面這句代碼 pathname = sys.argv[1]choose = sys.argv[2]gdal.SetConfigOption('GDAL_FILENAME_IS_UTF8', 'NO')# 為了使屬性表字段支持中文,請添加下面這句gdal.SetConfigOption('SHAPE_ENCODING', '')# 注冊所有的驅動ogr.RegisterAll()# 數據格式的驅動driver = ogr.GetDriverByName(’ESRI Shapefile’)ds = driver.Open(pathname, update=1)if ds is None: print ’Could not open %s’%pathname sys.exit(1)# 獲取第0個圖層layer0 = ds.GetLayerByIndex(0);# 投影spatialRef = layer0.GetSpatialRef();# 輸出圖層中的要素個數print ’要素個數=%d’%(layer0.GetFeatureCount(0))print ’屬性表結構信息’defn = layer0.GetLayerDefn()fieldindex = defn.GetFieldIndex(’x’)xfield = defn.GetFieldDefn(fieldindex)#新建fieldfieldDefn = ogr.FieldDefn(’newx’, xfield.GetType())fieldDefn.SetWidth(32)fieldDefn.SetPrecision(6)layer0.CreateField(fieldDefn,1)fieldDefn = ogr.FieldDefn(’newy’, xfield.GetType())fieldDefn.SetWidth(32)fieldDefn.SetPrecision(6)layer0.CreateField(fieldDefn,1)feature = layer0.GetNextFeature()# 下面開始遍歷圖層中的要素while feature is not None: # 獲取要素中的屬性表內容 x = feature.GetFieldAsDouble(’x’) y = feature.GetFieldAsDouble(’y’) newx, newy = transformer.begintrans(choose, x, y) feature.SetField(’newx’, newx) feature.SetField(’newy’, newy) layer0.SetFeature(feature) feature = layer0.GetNextFeature()feature.Destroy()ds.Destroy()

這里我其實想說最重要的是這個SetFeature(),就是你更新好了field的feature一定要重新set一下,不然是根本起不到任何改變的。新建的時候有createfeature,已經設置了,所以不需要set。

網上的教程都是新建和讀取,都沒有提到這個,結果自己蠢到試了好久都沒有發現問題在哪,以為是什么數據類型與設置字段屬性不匹配,一頭霧水哈哈哈。

補充知識:python使用GDAL生成shp文件

GDAL是一個開源的地理工具包,其支持基本所有的地理操作,其有python、java、c等語言包,是地理信息C端開發不可越過的工具,鑒于python語言的簡單性,這里使用python中GDAL包來進行shp文件的生成,這里本質是利用ogc地理標準的坐標字符串來生成shp。

第一步:安裝GDAL環境,建議下載后,本地安裝,注意與python版本號要對應,可參考網上教程。

第二部:代碼分析

引入GDAL工具包

import osgeo.ogr as ogrimport osgeo.osr as osr

注冊驅動,這里是ESRI Shapefile類型,并設置shp文件名稱

driver = ogr.GetDriverByName('ESRI Shapefile')data_source = driver.CreateDataSource('ceshi.shp')

注入投影信息,這里使用的4326,表示經緯度坐標,根據情況可以自行更改

srs = osr.SpatialReference()srs.ImportFromEPSG(4326)

這里定義的是,生成的要素類型,包括點、線、面

#ogr.wkbPoint 點#ogr.wkbLineString 線#ogr.wkbMultiPolygon 面

這里的圖層名稱要與上面注冊驅動的shp名稱一致

layer = data_source.CreateLayer('ceshi', srs, ogr.wkbLineString)

這里設置要素的屬性字段,其中設置了兩個字段,分別是Name、data,其中ogr.OFTString表示字符串類型,其長度都是14字節,可自行設置寬度

python使用gdal對shp讀取,新建和更新的實例

field_name = ogr.FieldDefn('Name', ogr.OFTString)field_name.SetWidth(14)layer.CreateField(field_name)

field_name = ogr.FieldDefn('data', ogr.OFTString)field_name.SetWidth(14)layer.CreateField(field_name)

在生成的字段名中插入要素值,即屬性表中每行的值

feature = ogr.Feature(layer.GetLayerDefn())feature.SetField('Name', 'ceshi')feature.SetField('data', '1.2')

核心部分,生成line數據

其中各要素格式如下:

POINT(6 10)LINESTRING(3 4,10 50,20 25)POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))MULTIPOINT(3.5 5.6, 4.8 10.5)MULTILINESTRING((3 4,10 50,20 25),(-5 -8,-10 -8,-15 -4))MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),((6 3,9 2,9 4,6 3)))GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))POINT ZM (1 1 5 60)POINT M (1 1 80)

需要注意的是,這里應該與上面定義的生成要素的類型保持一致,最后是清空緩存,這里多說一句,字符串語法與postgis等開源gis一致,都遵循ogc國際標準

wkt = ’LINESTRING(3 4,10 50,20 25)’line = ogr.CreateGeometryFromWkt(wkt)feature.SetGeometry(line)layer.CreateFeature(feature)feature = Nonedata_source = None

結果如下:

python使用gdal對shp讀取,新建和更新的實例

用arcgis打開

python使用gdal對shp讀取,新建和更新的實例

可以使用該方法,下載在線shp數據,只需要知道所需要素的geojson格式數據中坐標串即可。或者圖像識別中獲取的矢量邊界賦予經緯度。

以上這篇python使用gdal對shp讀取,新建和更新的實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美成人aaa| 都市激情国产精品| 亚洲无线一线二线三线区别av| 少妇精品在线| 亚洲免费毛片| 91p九色成人| 国产欧美日本| 免费在线成人| 韩国一区二区三区视频| 成人国产精品一区二区免费麻豆| 精品久久久中文字幕| 日韩1区在线| 久久人人88| 国产精品美女久久久浪潮软件| 国产婷婷精品| 亚洲综合激情在线| 国产欧美久久一区二区三区| 久久gogo国模啪啪裸体| 国产精品久久久免费| 麻豆国产一区| 中文字幕在线高清| 日本精品影院| 亚洲综合精品四区| 日韩毛片网站| 国产第一亚洲| 久久中文亚洲字幕| 中文视频一区| 国产精品白丝一区二区三区| 成人欧美一区二区三区的电影| 香蕉久久99| 亚洲图片久久| 欧美国产另类| 久久蜜桃精品| 欧美日韩国产在线观看网站 | 亚洲精品一二三**| 亚州欧美在线| 日本久久黄色| 99riav1国产精品视频| 亚洲精品乱码| 日韩av有码| 国产毛片一区| 91精品福利观看| 中文字幕高清在线播放| 免费日韩av片| 国产精品视频一区二区三区综合| 日韩1区在线| 久久xxxx| 另类小说一区二区三区| 欧美高清一区| 国产精品久久久久久妇女 | 免费看欧美美女黄的网站| 91精品啪在线观看国产爱臀| 国产+成+人+亚洲欧洲在线| 在线综合视频| 久久99蜜桃| 欧美日韩免费观看一区=区三区 | 国产中文一区| 日韩福利视频一区| 性感美女一区二区在线观看| 综合日韩在线| 国产亚洲一区二区手机在线观看 | 欧美黑人巨大videos精品| 日韩欧美一区免费| 亚洲日产av中文字幕| 在线人成日本视频| 日本亚洲三级在线| av在线资源| 日本国产一区| 伊人久久婷婷| 激情综合五月| 偷拍亚洲精品| 久久中文字幕av一区二区不卡| 日韩精品一区二区三区免费视频| 亚洲成人av观看| 国产精品一线天粉嫩av| 好吊一区二区三区| 精品三级在线观看视频| 亚洲一区二区三区四区五区午夜| 美女视频黄久久| 玖玖精品视频| 免费污视频在线一区| 国产日韩亚洲| 亚洲免费一区二区| 欧美不卡高清一区二区三区| 国产日韩高清一区二区三区在线 | 国产亚洲精品久久久久婷婷瑜伽| 国产专区精品| 久久精品99久久久| 香蕉视频成人在线观看| 久久久国产精品一区二区中文| 日韩欧美中文字幕电影| 图片区亚洲欧美小说区| 91精品韩国| 国产中文欧美日韩在线| 日韩国产精品久久久久久亚洲| 日韩一区二区久久| 欧美日韩中文字幕一区二区三区| 精品国产精品久久一区免费式| 日韩高清电影免费| 美国欧美日韩国产在线播放| 蜜桃国内精品久久久久软件9| 伊伊综合在线| 国产+成+人+亚洲欧洲在线| 国产精品主播| 国产欧美日韩精品一区二区免费 | 日韩av网站在线免费观看| 99综合视频| 国内亚洲精品| 色综合www| а√天堂8资源在线| 国语对白精品一区二区| 国产精品久久久久久久久久久久久久久 | 在线看片福利| 精品久久久中文字幕| 国产精品欧美在线观看| 亚洲精品自拍| 亚洲专区视频| 手机精品视频在线观看| 欧美日韩国产高清电影| 国产韩日影视精品| 激情五月综合| 伊人久久大香线蕉av超碰演员| 美女少妇全过程你懂的久久| 日韩在线观看| 日韩在线观看不卡| 日韩免费视频| 久久精品免费一区二区三区 | 欧美一区二区三区高清视频| 欧美日韩视频免费观看| 999国产精品视频| 久久美女性网| 欧美中文一区二区| 黑丝美女一区二区| 影视先锋久久| 亚洲主播在线| 日韩黄色av| 国产精品毛片视频| 国产精品99一区二区三| 亚洲最新无码中文字幕久久 | 国产精品伦理久久久久久| 97精品一区| se01亚洲视频| 日韩视频一区| 亚洲一级大片| 国产精品资源| 中文字幕在线官网| 久久在线电影| 天堂va蜜桃一区二区三区| 免费观看日韩电影| 欧美伊人久久| 国产在线观看91一区二区三区| 久久电影tv| 国产亚洲网站| 欧美亚洲专区| 日韩av片子| 亚洲精品成人| 日韩和欧美的一区| 国产中文欧美日韩在线| 亚洲国产专区校园欧美| 亚洲精选91| 精品五月天堂| 国产99久久| 日韩**一区毛片| 97精品国产福利一区二区三区| 午夜久久久久| 日韩精品视频在线看| 精品视频在线观看网站| 宅男在线一区| 日本久久一区| 国产高潮在线| 日韩在线一区二区| 精品国产亚洲日本| 狠狠久久婷婷| 国产精品亚洲综合久久| 亚洲四虎影院| 青草久久视频| 久久精品在线| 婷婷成人av| 日韩欧美精品一区| 日本va欧美va瓶| 久久亚洲精品中文字幕蜜潮电影| 亚洲精品乱码久久久久久蜜桃麻豆| 麻豆精品在线| 香蕉久久夜色精品国产| 精品72久久久久中文字幕| 亚洲欧美视频一区二区三区| 久久国产三级| 亚洲性视频h| 国产精品三级| 国产精品毛片| 日韩av专区| 日本中文字幕一区二区| 国产福利片在线观看| 婷婷视频一区二区三区| 日韩黄色大片| 国产精品玖玖玖在线资源| 亚洲一卡久久| 色黄视频在线观看| 欧美一区激情| 欧美专区在线|