বিভিন্ন দৈর্ঘ্যের মিলগুলি বিভাগগুলি


13

আমি বৃহত্তর সেগমেন্টের সাথে ছোট বিভাগগুলিকে মেলানোর চেষ্টা করছি যা তারা সম্ভবত সম্পর্কিত: তুলনামূলকভাবে কাছাকাছি, অনুরূপ ভারবহন এবং একে অপরের মুখোমুখি।

আমার কাছে থাকা ডেটার একটি সাধারণ উদাহরণ এখানে দেওয়া হয়েছে:

অংশ

এখানে আমার 750 এবং 707 কোনও কিছুর মিল না থাকা অবস্থায় 652 থেকে 198969 সেগমেন্টের সাথে মিল রাখতে হবে।

আমি বিভিন্ন পদ্ধতি জন্য তাকিয়ে করেছি, বিশেষ Hausdorff দূরত্ব (উত্তর উপর ভিত্তি করে এখানে )। আমি এটি পোস্টজিআইএস ব্যবহার করে গণনা করেছি তবে আমি বিজোড় ফলাফল পাচ্ছি: আমি প্রাপ্ত সবচেয়ে সংক্ষিপ্ত দূরত্ব get০ 70 এবং ১৯৮৯৮৫ এর মধ্যে এবং 2৫২ এর 198969 এর চেয়ে বেশি দূরত্ব রয়েছে 198985 এর চেয়ে বেশি (প্রয়োজনে আমি ক্যোয়ারী এবং ফলাফলগুলি যুক্ত করতে পারি)।

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

আপডেট: আমি একটি পদ্ধতি পেয়েছি যা গ্রহণযোগ্য সমঝোতার মতো বলে মনে হচ্ছে:

  • আমি প্রথমে যে নীলটি মেলে যাবার চেষ্টা করছি তার কাছ থেকে 10 নিকটতম কালো বিভাগগুলি খুঁজে পেয়েছি (পোস্টজিআইএস <->অপারেটরটি ব্যবহার করে ) যা 10 মিটারেরও কম দূরে।
  • তারপরে আমি প্রতিটি কৃষ্ণ বর্ণের নীল অংশের প্রান্তের নিকটতম পয়েন্টগুলি (ব্যবহার করে ST_ClosestPoint) সন্ধান করে একটি নতুন বিভাগ তৈরি করেছি এবং ফলাফলগুলি ফিল্টার করব যার দৈর্ঘ্য নীল রঙের 90% এরও কম নয় (অর্থাত্ বিভাগগুলি নয়) মুখোমুখি হচ্ছেন, বা বিয়ারিং পার্থক্য ~ 20 ° এর চেয়ে বেশি)
  • তারপরে আমি প্রথম ফলাফলটি দূরত্ব এবং হাউসডর্ফ দূরত্ব অনুসারে বাছাই করি, যদি কোনও হয়।

করার জন্য কিছু সূক্ষ্ম টিউনিং থাকতে পারে তবে এটি আপাতত একটি গ্রহণযোগ্য কাজ বলে মনে হচ্ছে। তবুও চালানোর জন্য অন্য কোনও পদ্ধতি বা অতিরিক্ত চেকগুলি সন্ধান করছি যদি আমি কোনও প্রান্তের মামলা মিস করি।


1
লক্ষ্য (কালো) বিভাগগুলির মধ্যে সম্ভাব্য ম্যাচগুলি সনাক্ত করতে কেবল (নীল) বিভাগগুলির শেষ পয়েন্টগুলি কেন ব্যবহার করবেন না? উভয় প্রান্তই একটি সাধারণ লক্ষ্যের কাছাকাছি থাকলে আপনি যে খন্ডটির সাথে সন্ধান করছেন সেগুলি মিলবে যা কার্যকর করার জন্য একটি সাধারণ জিজ্ঞাসা। এই পদ্ধতিটি সেগমেন্ট এন্ডপয়েন্টগুলির অবস্থানগুলির ত্রুটির কারণে এমন বিভেদগুলি পরিচালনা করে, যা অন্যথায় মোকাবেলা করা চ্যালেঞ্জ হতে পারে: লক্ষ্য করুন যে খুব দীর্ঘ (নীল) বিভাগটি দীর্ঘ অংশের তুলনায় খুব কম সুনির্দিষ্ট সহনীয় রয়েছে।
হোবার

1
হ্যাঁ আমি এই লাইনগুলি বরাবর কিছু চেষ্টা করছি, আমি বিশদটি দিয়ে প্রশ্নটি আপডেট করব।
Jukurrpa

1
আমি আপনাকে সঠিকভাবে বুঝতে পেরেছি কিনা তা নিশ্চিত নন, তবে আপনি কি নীলের লাইনের জন্য সেন্ট্রয়েড তৈরি করার চেষ্টা করেছেন এবং তারপরে স্বল্পতম দূরত্ব রেখে, তাদের থেকে নিকটতম লাইনে দূরত্বগুলি পরীক্ষা করে দেখেছেন?
সাইরিল মিখালচেনকো

1
হাই সাইরিল, আমি এই সমস্যাটিতে আর কাজ করছি না, তবে সমস্যাটি ছিল তাদের দৃষ্টিভঙ্গির উপর ভিত্তি করে নীল বিভাগগুলি এবং তারা কালো বিভাগগুলিকে কতটা "মুখোমুখি" করছে তার উপর ভিত্তি করে match যার অর্থ এই ক্ষেত্রে যে
11১১ টি

উত্তর:


1

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

লাইন বিভাগ ESRI @ আকার থেকে আজিমুথ ফিরুন

def returnAzimuth(shape):
    point1 = shape.firstPoint
    point2 = shape.lastPoint
    dX = point2.X-point1.X
    dY = point2.Y-point1.Y
    az = math.atan2(dX,dY)*180/math.pi
    if az<0:
        az = az+360
        return az
    return az

ESRI পয়েন্ট থেকে বিপরীত ফিরে

def returnInverse(point1,point2):
    dX = point2.X-point1.X
    dY = point2.Y-point1.Y
    dis = sqrt(dX**2+dY**2)
    az = math.atan2(dX,dY)*180/math.pi
    if az<0:
        az = az+360
        return az,dis
    return az,dis

লাইন বিভাগে পললাইন বিস্ফোরণ

def explodePolyline(shape):
    sr = "insert your spatial reference"
    lines=[]
    pnts = shape.getPart(0)
    for x in range(len(pnts)-1):
        array = arcpy.Array()
        point1 = arcpy.Point(pnts.getObject(x).X,pnts.getObject(x).Y,pnts.getObject(x).Z)
        point2 = arcpy.Point(pnts.getObject(x+1).X,pnts.getObject(x+1).Y,pnts.getObject(x+1).Z)
        array.add(point1)
        array.add(point2)
        line = arcpy.Polyline(array,sr,True,True)
        print(line)
        lines.append(line)
    return lines

এইভাবে আপনার টেবিল মাধ্যমে চালান

for shape in Table:
    for shape2 in Table:
         check if shape is polyline:
            if yes, explode and compare returned line segments with shape2
                for seg in returnedlinesegments
                    if seg.firstpoint=shape2.lastpoint and shape.az=shape2.az
                        do stuff.....
            if no, compare shape and shape2
                if shape.firstpoint=shape2.lastpoint and shape.az=shape2.az
                   do stuff.....

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

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