জিডিএল ব্যবহার করে পাইথনের প্রতিটি বৈশিষ্ট্য বিভক্ত শেফফিল?


15

পাইথনের বৈশিষ্ট্য অনুসারে একটি শেফফিল বিভক্ত করা কি সম্ভব? (সর্বোত্তম সমাধান হ'ল যেখানে আমি অস্থায়ীভাবে ফলস ভেক্টর অবজেক্টগুলিকে ডিস্কের পরিবর্তে মেমরিতে সংরক্ষণ করতে পারি)।

কারণ: আমি শেডফিলের বিভিন্ন উপগ্রহের সাথে জিডাল রাস্টারাইজ লাইয়ার ফাংশনটি ব্যবহার করতে চাই। ফাংশনটির জন্য একটি osgeo.ogr.Layer অবজেক্ট প্রয়োজন।


এমকে, আমি কিছুটা চেষ্টা করেছিলাম এবং এটি নিম্নলিখিত হিসাবে কাজ করতে পারে। আপনি নিম্নলিখিত হিসাবে বৈশিষ্ট্য প্রতি gdal স্তর অবজেক্টের জ্যামিতি পেতে পারেন।

#  Load shape into gdal
shapefile=str(vectorPath)
layer_source = ogr.Open(shapefile)
lyr = layer_source.GetLayer(0)
for i in range(0,lyr.GetFeatureCount()):
     feat = lyr.GetFeature(i)
     ge = feat.geometry()

এখন আমি এই জ্যামিতির উপর ভিত্তি করে কীভাবে একটি osgeo.ogr.layer অবজেক্ট তৈরি করব তা জানতে হবে।


স্পষ্টতার জন্য। আমার প্লেইন ওজিআর / জিডিএল কোডে একটি ফাংশন দরকার! এটি অন্যান্য ব্যক্তির পক্ষেও কিছুটা আগ্রহী বলে মনে হচ্ছে এবং আমি এখনও কোনও গৌণ মডিউল ছাড়াই একটি সমাধান চাই (যদিও এখান থেকে আসা যে কোনও সমাধান একটি বিনামূল্যে উপলব্ধ কিগিস প্লাগইনে ব্যবহৃত হবে)।

উত্তর:


7

ঠিক আছে তাই খাঁটি জিডিএল সমাধান দিয়ে আপনার প্রশ্নের উত্তর দেওয়ার দ্বিতীয় প্রচেষ্টা।

প্রথমত, জিডিএল (জিওপ্যাসিয়াল ডেটা অ্যাবস্ট্রাকশন লাইব্রেরি) মূলত রাস্টার ভূ-স্থানিক ডেটা নিয়ে কাজ করার জন্য কেবল একটি গ্রন্থাগার ছিল, যখন পৃথক ওজিআর লাইব্রেরিটি ভেক্টর ডেটার সাথে কাজ করার উদ্দেশ্যে নির্মিত হয়েছিল। তবে দুটি গ্রন্থাগার এখন আংশিকভাবে একত্রিত হয়েছে এবং সাধারণত জিডিএল এর সম্মিলিত নামে একত্রে ডাউনলোড এবং ইনস্টল করা হয়। সুতরাং সমাধানটি সত্যই ওজিআর এর আওতায় পড়ে। এটি আপনার প্রাথমিক কোডটিতে রয়েছে তাই আমি অনুমান করি আপনি এটি জানতেন তবে টিপস এবং ইঙ্গিতগুলি অনুসন্ধান করার সময় এটি মনে রাখা একটি গুরুত্বপূর্ণ পার্থক্য।

কোনও ভেক্টর স্তর থেকে ডেটা পড়তে, আপনার প্রাথমিক কোডটি ভাল:

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()

শেপফাইলে (বা অন্য কোনও ভেক্টর ডেটা সেট) লিখতে পারার আগে আমাদের একটি নতুন বৈশিষ্ট্য তৈরি করতে হবে। একটি নতুন বৈশিষ্ট্য তৈরি করতে, আমাদের প্রথমে প্রয়োজন: - একটি জ্যামিতি - একটি বৈশিষ্ট্য সংজ্ঞা, সম্ভবত ক্ষেত্রের সংজ্ঞাগুলি অন্তর্ভুক্ত করবে খালি জ্যামিতি অবজেক্ট তৈরি করতে জ্যামিতি কনস্ট্রাক্টর 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()

ধন্যবাদ ড্যান! আমি একটি ভিন্ন পদ্ধতির গ্রহণ করেছি এবং আমার কিউজিআইএস-প্লাগইন ইতিমধ্যে কার্যক্ষম (রাস্টার ডেটার স্পেসিয়াল কোয়েরি সম্পর্কিত)। বিভাজন পরিবর্তে, আমি অন্তর্নিহিত রাস্টারটির একটি উপসেট তৈরি করেছি। আপনি আমার ব্লগে একটি ব্যবহারের সন্ধান করতে পারেন ( tinyurl.com/cy6hs9q )। আপনার উত্তরটি আসল প্রশ্নটি সমাধান করে, যদি আমি ভেক্টর বৈশিষ্ট্যগুলি অস্থায়ীভাবে বিভক্ত করতে এবং সংরক্ষণ করতে চাই।
কার্লিউ

5

আমি কিছু ভাগ্য পড়তে এবং স্তর থেকে লিখতে করেছি। বিশেষত, আমার কাছে এমন কোড রয়েছে যা পোলাইনেসযুক্ত একটি শেপফাইল স্তরটি পড়বে এবং প্রতিটি বৈশিষ্ট্যের জ্যামিতিটিকে পাঠ্য ফাইলগুলিতে আউটপুট করবে (পুরানো মডেলের ইনপুট হিসাবে ব্যবহৃত হবে)।

name     = layer.name()
provider = layer.dataProvider()
feat     = QgsFeature()

# Now we can loop through all the defined features
while provider.nextFeature(feat):

    # Get layer attributes               
    attrs = feat.attributeMap()
    for (k,attr) in attrs.iteritems():
        if k == 0:
            attrOne = attr.toString()
        elif k == 1:
            attrTwo = attr.toString()
        ...

    # Gets the geometry of the feature
    geom = feat.geometry()

    # Get the coordinates of the whole line [or use asPoint()]                    
    line = geom.asPolyline()
        # all points in the line
        for point in line:
            lat = point[0]
            lon = point[1]
            # Add these to a QgsGeometry
            your_Own_QgsGeometry.add...

এটি আপনার স্তর থেকে প্রতিটি বৈশিষ্ট্য পেতে দরকারী হতে পারে বলে মনে হচ্ছে।

অন্য স্তরে লেখার জন্য এখান থেকে খুব জটিল হওয়া উচিত নয়। এর মতো কিছুতে তত্ত্বের কাজ করা উচিত:

# New layer name
filename = "myNewLayer.shp"

# define fields for feature attributes
fields   = { 0 : QgsField("attrOne", QVariant.String),
             1 : QgsField("attrTwo", QVariant.String),
             2 : QgsField("...", QVariant.Int) }

# Create coordinate reference system as WGS84
crs    = QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.PostgisCrsId)

# Create the vector layer
writer = QgsVectorFileWriter(filename, "CP1250", fields, QGis.WKBLineString, crs)

# Create some features
feat = QgsFeature()
feat.addAttribute(0, QVariant(runway))
feat.addAttribute(1, QVariant(arriveDepart))
feat.addAttribute(2, QVariant(subTrack))

# Add your geometry
feat.setGeometry(your_Own_QgsGeometry)

# Add the features
writer.addFeature(feat)

# Add it to QGIS project
self.iface.addVectorLayer(filename, "MyLayerName", "ogr")

এখান থেকে আপনার প্রতিটি বৈশিষ্ট্যের ডেটা পাওয়া এবং নতুন বৈশিষ্ট্যে নতুন স্তরে লিখতে সক্ষম হওয়া উচিত।

দেনিযেল


হেই ধন্যবাদ. আপনার কোডের অংশগুলি দরকারী হবে, যদি আমি আমার আকারগুলিতে বৈশিষ্ট্য লিখতে চাই। তবে আমি উপরে উল্লিখিত হিসাবে আমি কেবল gdal (বিশেষত gdal.RasterizeFunction) ব্যবহার করছি এবং যদি না কেউ জানে যে কোনও QgsVectorLayer অবজেক্টকে একটি gdal অবজেক্টে রূপান্তর করতে এবং তদ্বিপরীত, এই প্রশ্নটি এখনও নিষ্পত্তিযোগ্য নয়।
কার্লিউ

আপনি QGIS দিয়ে এটি করা দরকার তা উল্লেখ করেননি। আপনার প্রাথমিক উদাহরণটি প্লেইন ভ্যানিলা ওজিআর বলে মনে হচ্ছে।
ডেভিডএফ

আমি কিউজিআইএসে এটি করতে চাই (আমার এটি কিউজিআইএস প্লাগইনের জন্য একটি ফাংশন হিসাবে প্রয়োজন), তবে কিউজিআইএসসিআর মডিউলগুলির উপর নির্ভর না করে। সুতরাং আমার প্লেইন ওগরে সমাধান দরকার। ড্যান উত্তর দিয়েছিল কারণ আমি অন্য পোস্টে উল্লেখ করেছি যে এই কোডটি একটি QGIS প্লাগইনের জন্য।
কার্লিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.