使用ogr裁剪向量資料

2022-07-11 10:36:10 字數 2801 閱讀 7419

使用ogr裁剪向量資料

由來:​ 近期有個需求,內容是這樣的:我們有兩個向量資料,現在要求以乙個向量檔案為底板,按字段對另乙個向量檔案進行分割,生成若干小的shpfile檔案

分析:​ 經過分析之後,將步驟拆解如下:

首先確保兩個shpfile投影座標系統一

​ 如果出現不統一的情況,那麼用arcgis的工具project進行投影轉換。(data management tools--projections and transformations--project),鏈結如下

其次編寫按屬性字段分割shpfile,生成若干小shpfile的**

接著編寫根據layer建立shpfile的**(>使用ogr中拷貝方法建立新的shpfile

最後進行迴圈,對每次生成的shpfile和原先的shpfile進行空間查詢,得到layer後生成需要的shpfile

核心**:

from osgeo import ogr, osr

import os

def createshpbylayer(shp, layer, filetype):

'''根據layer建立shpfile

'''driver = ogr.getdriverbyname("esri shapefile")

ds = driver.createdatasource(shp)

pt_layer = ds.copylayer(layer, 'layername')

ds.destroy()

def splitshp(shpfile, outpath, splitfield):

'''按屬性字段分割shpfile

'''ds = ogr.open(shpfile)

lyr = ds.getlayer(0)

for feat in lyr:

cityname = feat.getfield(splitfield) # 以欄位名為檔名稱

outshp = os.path.join(outpath, str(cityname)+'.shp')

geom = feat.getgeometryref()

driver = ogr.getdriverbyname("esri shapefile")

outds = driver.createdatasource(outshp)

outlyr = outds.createlayer("layername", lyr.getspatialref(), ogr.wkbmultipolygon)

outlyr.createfields(lyr.schema) # 建立字段屬性

outfeat = ogr.feature(lyr.getlayerdefn())

for i in range(feat.getfieldcount()):

val = feat.getfield(i)

outfeat.setfield(i, val)

outfeat.setgeometry(geom)

outlyr.createfeature(outfeat)

outds = none

def splitshpbyshp(covershp, splitshp, outpath):

'''@desc: 將乙個shp按屬性分割後,再用來分割另乙個shp(空間查詢)

'''ds = ogr.open(covershp)

lyr = ds.getlayer(0)

splitds = ogr.open(splitshp)

splitlyr = splitds.getlayer(0)

for feat in lyr:

cityname = feat.getfield("name") # 以欄位名為檔名稱

outshp = os.path.join(outpath, str(cityname)+'.shp')

geom = feat.getgeometryref()

driver = ogr.getdriverbyname("memory")

outds = driver.createdatasource("temp")

outlyr = outds.createlayer("layername", lyr.getspatialref(), ogr.wkbmultipolygon)

outlyr.createfields(lyr.schema) # 建立字段屬性

outfeat = ogr.feature(lyr.getlayerdefn())

for i in range(feat.getfieldcount()):

val = feat.getfield(i)

# val = val.encode('utf8') # 將unicode編碼轉化為中文,還有點問題

outfeat.setfield(i, val)

outfeat.setgeometry(geom)

outlyr.createfeature(outfeat)

outds = none

splitlyr.setspatialfilter(geom) # 按空間查詢

createshpbylayer(outshp, splitlyr, "esri shapefile")

print("按空間查詢的要素數量:"+ str(splitlyr.getfeaturecount()))

不足之處

轉出來的shpfile屬性欄位中,中文部分亂碼,目前未能解決。

向量裁剪向量

也不知道為啥,向量裁剪向量這麼普通的東西這麼難找,趕緊放出來讓大家用用 import os import numpy as np import geopandas as gpd import warnings warnings.filterwarnings ignore geoseries.notn...

使用向量面裁剪柵格資料的對齊問題

最近湊巧有幾個比較多的柵格裁剪問題,整理如下 我們只有由於柵格與向量資料的儲存模型不相同,這就導致柵格資料的像元無法與向量資料的點等同,從而導致裁切後的對齊問題,放大資料我們就能發現,如下圖可以說明 其中黑白色為柵格資料,每個正方形代表乙個像元,紅色區域為向量面資料。我們按照預設設定執行 raste...

狸貓的面試 專案描述 向量裁剪

專案描述 要求 在4s內,用單執行緒,完成對百萬級的向量圖形的裁剪 輸入 1.乙個多邊形 儲存在xml檔案中,順序儲存多邊形所有的端點 2.乙個向量圖形 line或者circle line儲存其兩個端點ab,circle儲存其圓心o和半徑r。實際有一百萬條直線和一百萬個圓 輸出 輸出裁剪後的圖形。例...