ตกลงดังนั้นความพยายามครั้งที่สองที่จะตอบคำถามของคุณด้วยโซลูชัน GDAL บริสุทธิ์
ประการแรก GDAL (Geospatial Data Abstraction Library) เดิมเป็นเพียงห้องสมุดสำหรับการทำงานกับข้อมูลเชิงพื้นที่เชิงภาพแรสเตอร์ในขณะที่ห้องสมุด OGR แยกต่างหากตั้งใจที่จะทำงานกับข้อมูลเวกเตอร์ อย่างไรก็ตามในตอนนี้ทั้งสองไลบรารีนั้นถูกรวมเข้าด้วยกันบางส่วนและโดยทั่วไปจะดาวน์โหลดและติดตั้งพร้อมกันภายใต้ชื่อที่รวมกันของ GDAL ดังนั้นวิธีการแก้ปัญหาตกอยู่ภายใต้ OGR คุณมีสิ่งนี้ในรหัสเริ่มต้นของคุณดังนั้นฉันเดาว่าคุณรู้เรื่องนี้ แต่มันเป็นความแตกต่างที่สำคัญที่ต้องจำเมื่อค้นหาเคล็ดลับและคำแนะนำ
หากต้องการอ่านข้อมูลจากเลเยอร์เวกเตอร์คุณสามารถใช้รหัสเริ่มต้นได้:
from osgeo import ogr
shapefile = ogr.Open(shapefile)
layer = shapefile.GetLayer(0)
for i in range(layer.GetFeatureCount()):
feature = layer.GetFeature(i)
name = feature.GetField("NAME")
geometry = feature.GetGeometryRef()
print i, name, geometry.GetGeometryName()
เราจำเป็นต้องสร้างคุณสมบัติใหม่ก่อนที่เราจะสามารถเขียนลงใน Shapefile (หรือชุดข้อมูลเวกเตอร์อื่น ๆ ) ในการสร้างคุณสมบัติใหม่อันดับแรกเราต้อง: - รูปทรงเรขาคณิต - คำจำกัดความของคุณลักษณะซึ่งอาจรวมถึงคำจำกัดความของเขตข้อมูลใช้ตัวสร้างรูปทรงเรขาคณิต ogr.Geometry () เพื่อสร้างวัตถุรูปทรงเรขาคณิตที่ว่างเปล่า กำหนดสิ่งที่รูปทรงเรขาคณิตในวิธีที่แตกต่างกันสำหรับแต่ละประเภท (จุดเส้นรูปหลายเหลี่ยม ฯลฯ ) ตัวอย่างเช่น:
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(10,20)
หรือ
line = ogr.Geometry(ogr.wkbLineString)
line.AddPoint(10,10)
line.AddPoint(20,20)
line.SetPoint(0,30,30) #(10,10) -> (30,30)
สำหรับคำจำกัดความของฟิลด์
fieldDefn = ogr.FieldDefn('id', ogr.OFTInteger)
ตอนนี้คุณสามารถสร้างเลเยอร์เวกเตอร์ของคุณ ในตัวอย่างนี้รูปหลายเหลี่ยมแบบสี่เหลี่ยม:
#create simple square polygon shapefile:
from osgeo import ogr
driver = ogr.GetDriverByName('ESRI Shapefile')
datasource = driver.CreateDataSource('YOUR_PATH')
layer = datasource.CreateLayer('layerName',geom_type=ogr.wkbPolygon)
#create polygon object:
myRing = ogr.Geometry(type=ogr.wkbLinearRing)
myRing.AddPoint(0.0, 0.0) #LowerLeft
myRing.AddPoint(0.0, 10.0) #UpperLeft
myRing.AddPoint(10.0, 10.0) #UpperRight
myRing.AddPoint(10.0, 0.0) #Lower Right
myRing.AddPoint(0.0, 0.0) #close ring
myPoly = ogr.Geometry(type=ogr.wkbPolygon)
myPoly.AddGeometry(myRing)
print ('Polygon area =',myPoly.GetArea()) #returns correct area of 100.0
#create feature object with point geometry type from layer object:
feature = ogr.Feature( layer.GetLayerDefn())
feature.SetGeometry(myPoly)
layer.CreateFeature(feature)
#flush memory - very important
feature.Destroy()
datasource.Destroy()