অর্কিপাই ব্যবহার করে বহুবিধ লাইনের সংযোগকারী বহুভুজ তৈরি করছেন?


10

আমি আর্কিজিআইএস-এ পাইথনস্ক্রিপ্টের সাথে একটি পলিলেনের সমষ্টিযুক্ত শেফফিলের সমস্ত প্রান্তকে সংযুক্ত করে এমন বহুভুজ তৈরির উপায়টি নির্ধারণ করার চেষ্টা করছি, বহুভুজের নোডের ক্রমটি গুরুত্বপূর্ণ কারণ এটি করতে আমার সমস্যা হচ্ছে। আমি সবুজ লাইন থেকে ছবিতে ধূসর বহুভুজ অর্জন করতে চাই

আমি ম্যানুয়ালি না করে ধূসর বহুভুজ তৈরি করতে সবুজ লাইনের শেষ পয়েন্টগুলি সংযোগ করতে চাই


আপনার লাইনে অর্ডার দেওয়ার জন্য কিছু গুণ আছে কি?
ইয়ান টার্টন

প্রথমত, আপনার জিজ্ঞাসিত ক্রিয়াকলাপটি যেমন @ জিজ্ঞাসা করা হয়েছে, তারপরে আপনার পরবর্তী শুরুর পয়েন্টের সাথে শেষ পয়েন্টটি সংযুক্ত করা হোক বা অন্য কোনও উপায়ে করানো হোক না কেন তার নিয়ম দরকার
ম্যাটজ

3
ব্যর্থ যে শেষ পয়েন্টে আলফা হাল্ল কিছু ধরণের হতে পারে?
ইয়ান টার্টন

লাইনটি কিছুটা ডিগ্রী দেয় যাতে তাদের অর্ডার দেওয়ার বৈশিষ্ট্য থাকে। তাদের একটি আইডি নম্বর রয়েছে তবে উপরের উদাহরণের জন্য ডান ব্রাঙ্কের আইডি রয়েছে 1-7, বাম 15- 21 এবং তারা সংযুক্ত হওয়ার পরে আইডি 22-27
আমান্ডা

1
আপনি ক) টিআইএন তৈরি করে, লাইনগুলি ব্যবহার করে, খ) টিআইএনকে ত্রিভুজগুলিতে রূপান্তরিত করে গ) লাইনগুলির সাথে একটি সীমানা ভাগ করে এমন ত্রিভুজ নির্বাচন করে খুব কাছাকাছি যেতে পারবেন। শীর্ষে মুছে ফেলার জন্য আপনার কাছে কেবল একটি বহুভুজ থাকবে
ফেলিক্সআইপি

উত্তর:


11

ধাপ:

গণনা বিভাগ কেন্দ্র পয়েন্ট: এখানে চিত্র বর্ণনা লিখুন

তাদের ইউক্যালিডিয়ান ন্যূনতম বিস্তৃত গাছ তৈরি করুন, এটি দ্রবীভূত করুন এবং গণনা বাফারটি, সংক্ষিপ্ত বিভাগের দৈর্ঘ্যের সমান দূরত্ব: এখানে চিত্র বর্ণনা লিখুন

বিভাগের শেষ পয়েন্টগুলি তৈরি করুন এবং বাফারের সীমানায় তাদের শৃঙ্খলা (লাইন বরাবর দূরত্ব) গণনা করুন (বাফারের বন্ধ পললাইন সংস্করণ): এখানে চিত্র বর্ণনা লিখুন

চেইনেজ ক্ষেত্রটি ব্যবহার করে আরোহী ক্রমে শেষ পয়েন্টগুলি সাজান। নীচের পয়েন্টগুলি তাদের এফআইডি দ্বারা লেবেলযুক্ত:

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

অর্ডার করা পয়েন্টের সেট থেকে বহুভুজ তৈরি করুন: এখানে চিত্র বর্ণনা লিখুন

লিপি:

import arcpy, traceback, os, sys,time
from heapq import *
from math import sqrt
import itertools as itt
from collections import defaultdict

try:
    def showPyMessage():
        arcpy.AddMessage(str(time.ctime()) + " - " + message)
    # MST by PRIM's
    def prim( nodes, edges ):
        conn = defaultdict( list )
        for n1,n2,c in edges:
            conn[ n1 ].append( (c, n1, n2) )
            conn[ n2 ].append( (c, n2, n1) )
        mst = []
        used = set( nodes[ 0 ] )
        usable_edges = conn[ nodes[0] ][:]
        heapify( usable_edges )

        while usable_edges:
            cost, n1, n2 = heappop( usable_edges )
            if n2 not in used:
                used.add( n2 )
                mst.append( ( n1, n2, cost ) )

                for e in conn[ n2 ]:
                    if e[ 2 ] not in used:
                        heappush( usable_edges, e )
        return mst        


    mxd = arcpy.mapping.MapDocument("CURRENT")
    SECTIONS=arcpy.mapping.ListLayers(mxd,"SECTION")[0]
    PGONS=arcpy.mapping.ListLayers(mxd,"RESULT")[0]
    d=arcpy.Describe(SECTIONS)
    SR=d.spatialReference

    cPoints,endPoints,lMin=[],[],1000000
    with arcpy.da.SearchCursor(SECTIONS, "Shape@") as cursor:
        # create centre and end points
        for row in cursor:
            feat=row[0]
            l=feat.length
            lMin=min(lMin,feat.length)
            theP=feat.positionAlongLine (l/2).firstPoint
            cPoints.append(theP)
            theP=feat.firstPoint
            endPoints.append(theP)
            theP=feat.lastPoint
            endPoints.append(theP)

        arcpy.AddMessage('Computing minimum spanning tree')
        m=len(cPoints)
        nodes=[str(i) for i in range(m)]
        p=list(itt.combinations(range(m), 2))
        edges=[]
        for f,t in p:
            p1=cPoints[f]
            p2=cPoints[t]
            dX=p2.X-p1.X;dY=p2.Y-p1.Y
            lenV=sqrt(dX*dX+dY*dY)
            edges.append((str(f),str(t),lenV))
        MST=prim(nodes,edges)

        mLine=[]
        for edge in MST:
            p1=cPoints[int(edge[0])]
            p2=cPoints[int(edge[1])]
            mLine.append([p1,p2])
        pLine=arcpy.Polyline(arcpy.Array(mLine),SR)

        # create buffer and compute chainage
        buf=pLine.buffer(lMin/2)
        outLine=buf.boundary()
        chainage=[]
        for p in endPoints:
            measure=outLine.measureOnLine(p)
            chainage.append([measure,p])
        chainage.sort(key=lambda x: x[0])

        # built polygon
        pGon=arcpy.Array()
        for pair in chainage:
            pGon.add(pair[1])
        pGon=arcpy.Polygon(pGon,SR)
        curT = arcpy.da.InsertCursor(PGONS,"SHAPE@")
        curT.insertRow((pGon,))
        del curT
except:
    message = "\n*** PYTHON ERRORS *** "; showPyMessage()
    message = "Python Traceback Info: " + traceback.format_tb(sys.exc_info()[2])[0]; showPyMessage()
    message = "Python Error Info: " +  str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"; showPyMessage()

আমি জানি এটি একটি সাইকেল, তবে এটি আমার নিজস্ব এবং আমি এটি পছন্দ করি


2

আমি কিউজিআইএস-এর জন্য এই সমাধানটি এখানে পোস্ট করি কারণ এটি নিখরচায় সফ্টওয়্যার এবং কার্যকর করা সহজ। আমি পললাইন ভেক্টর স্তরটির সঠিক "শাখা" বিবেচনা করেছি; যেহেতু এটি পরবর্তী ছবিতে পর্যবেক্ষণ করা যেতে পারে (বৈশিষ্ট্য সারণীতে 12 টি বৈশিষ্ট্য):

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

কিউজিআইএসের পাইথন কনসোলে চলার জন্য কোড (এক লাইনের পাইথন তালিকার বোঝার ক্ষেত্রে অ্যালগরিদম) হল:

layer = iface.activeLayer()

features = layer.getFeatures()

features = [feature for feature in features]

n = len(features)

geom = [feature.geometry().asPolyline() for feature in features ]

#multi lines as closed shapes
multi_lines = [[geom[i][0], geom[i][1], geom[i+1][1], geom[i+1][0], geom[i][0]]
               for i in range(n-1)]

#multi polygons
mult_pol = [[] for i in range(n-1)]

for i in range(n-1):
    mult_pol[i].append(multi_lines[i])

#creating a memory layer for multi polygon
crs = layer.crs()
epsg = crs.postgisSrid()

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           "polygon",
                           "memory")

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

mem_layer.startEditing()

#Set features
feature = [QgsFeature() for i in range(n-1)]

for i in range(n-1):
    #set geometry
    feature[i].setGeometry(QgsGeometry.fromPolygon(mult_pol[i]))
    #set attributes values
    feature[i].setAttributes([i])
    mem_layer.addFeature(feature[i], True)

#stop editing and save changes
mem_layer.commitChanges()

কোড চালানোর পরে:

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

এটি বহুভুজ মেমরি স্তর উত্পাদিত হয়েছিল (এর বৈশিষ্ট্য সারণীতে 11 টি বৈশিষ্ট্য সহ)। এটি দুর্দান্তভাবে কাজ করে।


1

আপনি একটি বহুভুতে অংশ নেবে এমন শেষবিন্দু নির্বাচন করতে পারেন, কেবলমাত্র সেই পয়েন্টগুলি থেকে একটি টিআইএন তৈরি করুন। টিআইএনকে বহুভুতে রূপান্তর করুন, বহুভুজকে দ্রবীভূত করুন। এই প্রক্রিয়াটি স্বয়ংক্রিয় করার কৌশলটি সিদ্ধান্ত নিয়েছে যে প্রতিটি বহুভুতে কোন পয়েন্টকে অবদান রাখতে হবে। যদি আপনার বৈধ দিকনির্দেশগুলির সাথে রেখা থাকে এবং এই রেখাগুলি সমস্ত কিছু সাধারণ বৈশিষ্ট্য ভাগ করে থাকে তবে আপনি রফতানি করতে কোনও প্রশ্ন লিখতে পারতেন বলে শেষ বিন্দুগুলিকে বিন্দুতে লাইনটি উল্লম্ব ব্যবহার করে লিখুন, তবে সেই বৈশিষ্ট্যগুলির দ্বারা নির্বাচন করুন যা সাধারণ বৈশিষ্ট্যটির মান রয়েছে।
পয়েন্টগুলি উত্তোলন / নির্বাচন করা, একটি কার্সার ব্যবহার করে এক্স, y মানগুলি পড়া, নতুন বহুভুজ লেখার জন্য x, y মানগুলি ব্যবহার করা ভাল। আমি আপনার পোস্টে একটি সংযুক্ত ছবি দেখতে পাচ্ছি না তবে পয়েন্ট অর্ডারটি যদি গুরুত্বপূর্ণ হয় তবে আপনি একবার পাইথন তালিকায় x, y এর মান সংরক্ষণ করলে সেগুলি বাছাই করুন। http://resources.arcgis.com/EN/HELP/MAIN/10.1/index.html#//002z0000001v000000


1

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

আপনার সমস্যা সমাধানের জন্য প্রথমে শেষ পয়েন্টগুলি বের করতে ফিচার টু পয়েন্ট ব্যবহার করুন । তারপরে অবতল হলের গণনা করতে এই লিঙ্ক থেকে পাইথন সরঞ্জামটি ব্যবহার করুন ।


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