পাইকিজিআইএস / পাইথন ব্যবহার করে অন্য স্তরের কোনও বৈশিষ্ট্যটি ছেদ করার সময় একটি বৈশিষ্ট্যকে বিভক্ত করুন?


12

আমার একটি বাফার স্তর রয়েছে (সবুজ বহুভুজ) যা যখনই কোনও বাধা (নীল রেখা) অতিক্রম করে আমি দুটি বহুভুতে বিভক্ত করতে চাই। আমি "স্প্লিটজমিট্রি" পদ্ধতিটি ব্যবহার করার চেষ্টা করছি, তবে আমি এটি কাজ করতে পারি না। এখন পর্যন্ত আমার কোডটি হ'ল:

while ldbuffprovider.nextFeature(feat):
  while barprovider.nextFeature(feat2):
    if feat.geometry().intersects(feat2.geometry()):
        intersection = feat.geometry().intersection(feat2.geometry())
        result, newGeometries, topoTestPoints=feat.geometry().splitGeometry(intersection.asPolyline(),True) 

যা ফলাফলের জন্য 1 টি প্রদান করে (ত্রুটি) এবং নতুন জ্যামিতির জন্য একটি খালি তালিকা। কোন সাহায্য ব্যাপকভাবে প্রশংসা করা হয়।

এখানে চিত্র বর্ণনা লিখুন


1
: হয়তো এখানে এই এক আপনাকে সাহায্য করবে gis.stackexchange.com/questions/66543/erase-method-using-ogr
Michalis avraam

উত্তর:


7

আপনি reshapeGeometryএর জন্য QgsGeometryঅবজেক্টের ফাংশনটি ব্যবহার করতে পারেন , যা একটি রেখার সাথে ছেদ করে বহুভুজ কেটে দেয়।

নিম্নলিখিতগুলি রেখাগুলির সাহায্যে বাফার বহুভুজকে ছেদ করবে এবং মেমোরি স্তর (QGIS 2.0 সিনট্যাক্স) এ বিভক্ত বহুভুজ বৈশিষ্ট্য যুক্ত করবে:

# Get the dataProvider objects for the layers called 'line' and 'buffer'
linepr = QgsMapLayerRegistry.instance().mapLayersByName('line')[0].dataProvider()
bufferpr = QgsMapLayerRegistry.instance().mapLayersByName('buffer')[0].dataProvider()

# Create a memory layer to store the result
resultl = QgsVectorLayer("Polygon", "result", "memory")
resultpr = resultl.dataProvider()
QgsMapLayerRegistry.instance().addMapLayer(resultl)


for feature in bufferpr.getFeatures():
  # Save the original geometry
  geometry = QgsGeometry.fromPolygon(feature.geometry().asPolygon())
  for line in linepr.getFeatures():
    # Intersect the polygon with the line. If they intersect, the feature will contain one half of the split
    t = feature.geometry().reshapeGeometry(line.geometry().asPolyline())
    if (t==0):
      # Create a new feature to hold the other half of the split
      diff = QgsFeature()
      # Calculate the difference between the original geometry and the first half of the split
      diff.setGeometry( geometry.difference(feature.geometry()))
      # Add the two halves of the split to the memory layer
      resultpr.addFeatures([feature])
      resultpr.addFeatures([diff])


1
এটি দুর্দান্তভাবে কাজ করে। আমি প্রথমে অন্য সমাধানটি চেষ্টা করেছিলাম এবং এটি আপনার উত্তরগুলি পড়ার আগেই এটি এতটা কাজ করেছিল for এই সমাধানটি একেবারে নিখুঁত এবং আমার স্ক্রিপ্টটি আরও ভাল। এর জন্য দুঃখিত: /
অ্যালেক্স

হেই, কোন সমস্যা নেই! খুশি এটা সাহায্য করে!
জেক 21

আমি আপনার উত্তরটিকে উত্সাহিত করেছি কারণ এটি নিখুঁতভাবে কাজ করে, যখন আমার কেবলমাত্র একটি আনুমানিক। @ পেয়ামান অনুগ্রহের জন্য ধন্যবাদ, তবে আমার কাছ থেকে উত্তর পাওয়া গেল না যখন অনুগ্রহের মূল্য শেষ হয়ে যায়। আরও ভাল সমাধান সর্বদা স্বাগত।
আন্তোনিও ফ্যালকিয়ানো

স্পিকারিফসি স্তরের সমস্ত বহুভুজকে বিভক্ত করার কোনও উপায় আছে কি?
মুহাম্মদ ফয়জান খান

আমার একটি এক স্তর রয়েছে এবং আমি একাধিক বহুভুজ রয়েছে যা আমি তাদেরকে ট্রট কোডিংকে বিভক্ত করতে চাই
মুহাম্মদ ফয়জান খান

2

GDAL> = 1.10.0 সঙ্গে একটি ভাল পড়তা SQLite এবং SpatiaLite সঙ্গে কম্পাইল আপনার স্তর মোড়কে (যেমন মধ্যে গঠিত poligon.shp এবং line.shp একটি OGR VRT ফাইলে) (উদাঃ layers.vrt ):

<OGRVRTDataSource>
    <OGRVRTlayer name="buffer_line">
        <SrcDataSource>line.shp</SrcDataSource>
        <SrcSQL dialect="sqlite">SELECT ST_Buffer(geometry,0.000001) from line</SrcSQL>
    </OGRVRTlayer>
    <OGRVRTlayer name="polygon">
        <SrcDataSource>polygon.shp</SrcDataSource>
    </OGRVRTlayer>
</OGRVRTDataSource>

একটি খুব ক্ষুদ্র বাফার (উদাহরণস্বরূপ 1 মাইক্রন) লাইনের চারপাশে থাকতে পারে * * বাফার_লাইন * স্তরটি প্রাপ্ত করে p তারপরে, আমরা স্প্যাটিয়ালাইট ব্যবহার করে এই জ্যামিতির উপর প্রতিসারণের পার্থক্য এবং পার্থক্য প্রয়োগ করতে পারি:

ogr2ogr splitted_polygons.shp layers.vrt -dialect sqlite -sql "SELECT ST_Difference(ST_SymDifference(g1.geometry,g2.geometry),g2.geometry) FROM polygon AS g1, buffer_line AS g2" -explodecollections

স্পষ্টতই, এই সমস্ত জিনিস পাইথন স্ক্রিপ্ট থেকে পুরোপুরি কার্যকর করা যায়:

os.system("some_command with args")

আশাকরি এটা সাহায্য করবে!


@ জেক পুনঃসাপদ
ব্যবহারকারী 99

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.