বাঁকা পয়েন্ট-টু-পয়েন্ট "রুটের মানচিত্র"


39

আমি সম্প্রতি এয়ারলাইন্সের ওয়েব পৃষ্ঠাগুলিতে সন্ধান করছি যা তাদের পরিষেবাগুলি অন্য সমস্ত শহরগুলিতে নির্দিষ্ট শহর থেকে ছেড়ে যাওয়ার রুটগুলি প্রদর্শন করে। আমি পয়েন্টগুলির মধ্যে অনুরূপ বাঁকানো রুট তৈরি করতে সক্ষম হতে চাই। কেউ কি এমন স্ক্রিপ্ট বা ফাংশন তৈরি করেছেন যা এই উদাহরণে প্রদর্শিত কারকের মতো বাঁকা চাপ তৈরি করবে ?

ফ্লাইট পাথ

পোস্টজিআইএস-এ, কি এসT_MakeLine এর এমন কোনও বাস্তবায়ন রয়েছে যা 2 পয়েন্টের সাথে সংযোগ করার সময় আপনাকে কী পরিমাণ বাঁক ব্যবহার করতে হবে তা নির্দিষ্ট করার অনুমতি দেয়?

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


কেউ এর সুন্দর বাস্তবায়ন সম্পর্কে জানেন? উদাহরণ বা যাই হোক না কেন?
মার্ক বোল্ডার

উত্তর:


26

দুর্দান্ত চেনাশোনা তৈরি করা আপনাকে পছন্দসই প্রভাব দিতে পারে।

হতে পারে http://lists.osgeo.org/pipermail/postgis-users/2008- ফেব্রুয়ারি/018620 . html এ আলোচিত এর মতো কিছু

হালনাগাদ:

আমি "ভিজ্যুয়ালাইজিং গ্লোবাল সংযোগগুলি" এ ধারণাকে অনুসরণ করেছি । এটি খাঁটি পোস্টজিআইএস-ভিত্তিক সমাধান যা আরকেস তৈরির জন্য পুনঃপ্রয়োগ ব্যবহার করে।

SELECT ST_Transform(
  ST_Segmentize(
    ST_MakeLine(
      ST_Transform(a.the_geom, 953027),
      ST_Transform(b.the_geom, 953027)
    ), 
  100000), 
4326)

(953027 এর জন্য সিআরএস সংজ্ঞাটি এখানে পাওয়া যাবে: http://spatialreferences.org/ref/esri/53027/ )

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


4
আমি ধারণাটি পছন্দ করি, যদিও দুর্দান্ত চেনাশোনাগুলির সাথে আপনি যে সমস্যাটি চালাচ্ছেন তা হ'ল সংক্ষিপ্ত দূরত্বে আপনি এখনও একটি সাধারণ সরলরেখার সাথে শেষ করবেন। আমি লাইনে যে অর্কের পরিমাণ রেখেছি তা নিয়ন্ত্রণ করতে সক্ষম হতে চাই (অর্থাত্: ধনু দৈর্ঘ্য = দূরত্ব * 2)।
রায়ানডাল্টন

1
কেবলমাত্র দুর্দান্ত চেনাশোনা ব্যবহার করে এখানে সমস্যার একটি ভাল উদাহরণ রয়েছে: gc.kls2.com/cgi-bin/…
রায়ানডালটন

1
কিছু অতিরিক্ত গবেষণার পরে, আমি এই পোস্টটি পেয়েছি যা এই পদ্ধতিতে সহায়তা করতে কার্যকর হতে পারে। mail-archive.com/postgis-users@postgis.refferences.net/…
রায়ানডালটন

ভবিষ্যতের পাঠকের ব্যবহারের জন্য, আমি ভেবেছিলাম যে আমি কেবল এগিয়ে যাব এবং এই বিষয়টিকে অন্তর্ভুক্ত @ আন্ডারডार्কের সাম্প্রতিক ব্লগ পোস্টে লিঙ্ক করব। আন্ডারড
ાર્

দারুণ!! আমার প্রকল্পে ব্যবহারকারীর চেকিন এবং ভেন্যু অবস্থানগুলির মধ্যে রেখা আঁকার জন্য ব্যবহৃত হয়েছে, ফোর্সকেয়ার থেকে তোলা হয়েছে
লরেঞ্জো

24

সমস্যাটি তাদের চাক্ষুষ রেজোলিউশনকে বাড়ানোর জন্য আরকে কতটা বাঁকতে হবে তা নির্ধারণ করা।

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

সরলতার জন্য আসুন মানচিত্রে বৃত্তাকার আরাক ব্যবহার করা যাক। বিন্দু y থেকে বিন্দু x পর্যন্ত একটি চাপকে "বাঁক" এর একটি প্রাকৃতিক পরিমাপ হ'ল y এ তার ভারবহন এবং সরাসরি y থেকে x পর্যন্ত বিয়ারিংয়ের মধ্যে পার্থক্য । যেমন একটি চাপ একটি বৃত্তের একটি ক্ষেত্র, যার উপর y এবং x উভয় মিথ্যা থাকে; প্রাথমিক জ্যামিতি দেখায় যে বাঁকানো কোণটি অর্কের অন্তর্ভুক্ত কোণটির অর্ধেক সমান হয় ।

একটি অ্যালগরিদম বর্ণনা করতে আমাদের আরও কিছু স্বরলিপি প্রয়োজন। যাক Y বংশোদ্ভুত বিন্দু হতে (যেমন মানচিত্রে অভিক্ষিপ্ত) এবং দিন x_1 , x_2 , ..., x_n গন্তব্য পয়েন্ট দেখুন। A_i নির্ধারণ থেকে জন্মদান হতে Y করার x_i , আমি = 1, 2, ..., এন

প্রাথমিক পদক্ষেপ হিসাবে, ধরে নিন যে বিয়ারিংগুলি (সমস্ত 0 এবং 360 ডিগ্রির মধ্যে রয়েছে) আরোহী ক্রমে রয়েছে: এটির জন্য আমাদের বিয়ারিংগুলি গণনা করা এবং তারপরে সেগুলি বাছাই করা প্রয়োজন; দুটোই সোজা কাজ।

আদর্শভাবে, আমরা কিছু আরম্ভের সাথে তুলনামূলকভাবে আরাকের বিয়ারিংগুলি সমান 360 / এন , 2 * 360 / এন , ইত্যাদি করতে চাই। কাঙ্ক্ষিত বিয়ারিং এবং আসল বিয়ারিংয়ের মধ্যে পার্থক্য তাই সমান i * 360 / n - a_i প্লাস প্রারম্ভিক বিয়ারিং, a0 । বৃহত্তম পার্থক্য হ'ল এই এন পার্থক্যগুলির সর্বাধিক এবং ক্ষুদ্রতম পার্থক্যটি তাদের সর্বনিম্ন। সর্বাধিক এবং ন্যূনতমের মধ্যে অর্ধেক হয়ে a0 সেট করা যাক ; এটি শুরু করা বেয়ারিংয়ের জন্য ভাল প্রার্থী কারণ এটি ঘন হওয়ার সর্বোচ্চ পরিমাণকে হ্রাস করে । ফলস্বরূপ, সংজ্ঞায়িত করুন

b_i = i * 360 / n - a0 - a_i:

এটি ব্যবহারের জন্য নমনীয়

Y থেকে x পর্যন্ত একটি বৃত্তাকার চাপটি আঁকতে প্রাথমিক জ্যামিতির বিষয়টি যা 2 বি_আই এর কোণকে বোঝায় তাই আমি বিশদটি এড়িয়ে যাব এবং সরাসরি একটি উদাহরণে যাব। আয়তক্ষেত্রাকার মানচিত্রের মধ্যে 64৪, ১ 16 এবং ৪ টি এলোমেলো পয়েন্টের সমাধানগুলির চিত্র এখানে দেওয়া হয়েছে

বিকল্প পাঠ

বিকল্প পাঠ

বিকল্প পাঠ

আপনি দেখতে পাচ্ছেন, গন্তব্য পয়েন্টের সংখ্যা বাড়ার সাথে সমাধানগুলি আরও ভাল লাগবে । এন = 4 এর সমাধানটি স্পষ্টভাবে দেখায় যে কীভাবে বিয়ারিংগুলি সমানভাবে ব্যবধানযুক্ত, কারণ এই ক্ষেত্রে ব্যবধানটি 360/4 = 90 ডিগ্রির সমান এবং স্পষ্টতই স্পেসিংটি ঠিক অর্জন করা যায়।

এই সমাধানটি নিখুঁত নয়: গ্রাফিকটি উন্নত করার জন্য আপনি সম্ভবত বেশ কয়েকটি আরক সনাক্ত করতে পারেন যা ম্যানুয়ালি টুইট করা যেতে পারে। তবে এটি কোনও ভয়ানক কাজ করবে না এবং এটি একটি দুর্দান্ত শুরু বলে মনে হচ্ছে।

অ্যালগরিদমটি সরল হওয়ার যোগ্যতাও রয়েছে: সবচেয়ে জটিল অংশটি তাদের বিয়ারিংগুলি অনুসারে গন্তব্যগুলি বাছাই করে।


আইনসংগ্রহ

আমি পোস্টজিআইএস জানি না, তবে সম্ভবত উদাহরণগুলি আঁকার জন্য আমি যে কোডটি ব্যবহার করেছি তা পোস্টজিআইএসে (বা অন্য কোনও জিআইএস) এই অ্যালগরিদম বাস্তবায়নের জন্য গাইড হিসাবে কাজ করতে পারে।

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

  • পরিবর্তনশীল এবং ফাংশনের নামগুলি কেস-সংবেদনশীল।
  • [আলফা] একটি ছোট-ছোট গ্রীক চরিত্র। ([পাই] এর যে মূল্য হওয়া উচিত তা আপনার মনে হয়))
  • x [[i]] হ'ল একটি অ্যারের x এর উপাদান i (1 থেকে শুরু করে সূচকযুক্ত)।
  • f [a, b] টি এবং f এ আর্গুমেন্টে ফাংশন প্রয়োগ করে। 'মিন' এবং 'টেবিল' এর মতো উপযুক্ত ক্ষেত্রে কার্যকারিতা সিস্টেম-সংজ্ঞায়িত; একটি প্রাথমিক লোয়ার কেস লেটারযুক্ত ফাংশন, যেমন 'কোণ' এবং 'অফসেট', ব্যবহারকারী-সংজ্ঞায়িত। মন্তব্যগুলি কোনও অস্পষ্ট সিস্টেমের ফাংশন ব্যাখ্যা করে (যেমন 'আরগ')।
  • সারণী [চ [i], {i, 1, n}] অ্যারে তৈরি করে {চ [1], চ [2], ..., চ [এন]}}
  • বৃত্ত [o, r, {a, b}] কোণ কোণ থেকে কোণ খ-এ ব্যাসার্ধ r এর ওকে কেন্দ্র করে বৃত্তের একটি চাপ তৈরি করে (উভয়ই পূর্বের দিক থেকে উল্টোদিকে রেডিয়ানে))
  • অর্ডার করা [x] x এর বাছাই করা উপাদানগুলির সূচকের একটি অ্যারে প্রদান করে। x [[অর্ডারিং [এক্স]]] হ'ল এক্স এর সাজানো সংস্করণ। X এর সমান দৈর্ঘ্য হলে y, [[ক্রম [x]]] x এর সমান্তরালে y সাজান।

কোডটির সম্পাদনযোগ্য অংশটি করুণার সাথে সংক্ষিপ্ত - 20 টি লাইনের চেয়ে কম - কারণ এর অর্ধেকেরও বেশি হয় হয় ঘোষিত ওভারহেড বা মন্তব্য।

একটি মানচিত্র আঁকুন

zগন্তব্যগুলির একটি তালিকা এবং এটির yউত্স।

circleMap[z_List, y_] := 
Module[{\[Alpha] = angles[y,z], \[Beta], \[Delta], n},
    (* Sort the destinations by bearing *)
    \[Beta] = Ordering[\[Alpha]];
    x = z[[\[Beta] ]]; (* Destinations, sorted by bearing from y *)
    \[Alpha] = \[Alpha][[\[Beta]]]; (* Bearings, in sorted order *)
    \[Delta] = offset[\[Alpha]];
    n = Length[\[Alpha]];
    Graphics[{(* Draw the lines *)
        Gray, Table[circle[y, x[[i]],2 \[Pi] i / n + \[Delta] - \[Alpha][[i]]], 
             {i, 1, Length[\[Alpha]]}],
        (* Draw the destination points *)
        Red, PointSize[0.02], Table[Point[u], {u, x}]
    }]
]

X -> y বিয়ারিংয়ের সাথে কোণ থেকে শুরু করে xবিন্দু থেকে বিন্দুতে একটি বৃত্তাকার চাপ তৈরি করুন ।y\[Beta]

circle[x_, y_, \[Beta]_] /; -\[Pi] < \[Beta] < \[Pi] := 
Module[{v,  \[Rho], r, o, \[Theta], sign},
    If[\[Beta]==0, Return[Line[{x,y}]]];

    (* Obtain the vector from x to y in polar coordinates. *)
    v = y - x; (* Vector from x to y *)
    \[Rho] = Norm[v]; (* Length of v *)
    \[Theta] = Arg[Complex @@ v]; (* Bearing from x to y *)

    (* Compute the radius and center of the circle.*)
    r = \[Rho] / (2 Sin[\[Beta]]); (* Circle radius, up to sign *)
    If[r < 0, sign = \[Pi], sign = 0];
    o = (x+y)/2 + (r/\[Rho]) Cos[\[Beta]]{v[[2]], -v[[1]]}; (* Circle center *)

    (* Create a sector of the circle. *)
    Circle[o, Abs[r], {\[Pi]/2 - \[Beta] + \[Theta] + sign, \[Pi] /2 + \[Beta] + \[Theta] + sign}]
]

উত্স থেকে পয়েন্টের তালিকায় বিয়ারিংগুলি গণনা করুন।

angles[origin_, x_] := Arg[Complex@@(#-origin)] & /@ x;

বিয়ারিংয়ের সেটগুলির অবশিষ্টাংশগুলির মিডরেঞ্জ গণনা করুন।

xসাজানো ক্রমে বিয়ারিংয়ের একটি তালিকা। আদর্শভাবে, x [[i]] ~ 2 [পাই] আই / এন।

offset[x_List] :=
Module[
    {n = Length[x], y},
    (* Compute the residuals. *)
    y = Table[x[[i]] - 2 \[Pi] i / n, {i, 1, n}];
    (* Return their midrange. *)
    (Max[y] + Min[y])/2
]

আমার উল্লেখ করা উচিত যে এই সমাধানটি গন্তব্যগুলিকে কমবেশি উত্সকে ঘিরে ধরেছে। যখন এটি না হয়, সম্পূর্ণ ধারণাটি (সমান দূরত্বের বিয়ারিংয়ের) ভাল হয় না। তবে কৌণিক ফাঁকগুলির মধ্যে কিছু জাল গন্তব্য প্রবর্তন করে এবং পরে সেই গন্তব্যগুলি (এবং তাদের আর্কস) সরিয়ে এটি সহজেই ঠিক করা যেতে পারে। এই প্রক্রিয়াটি বিয়ারিংয়ের মধ্যে গড় দূরত্বের গণনা করে এবং বড় ফাঁকগুলি ইত্যাদি সনাক্ত করতে এটি ব্যবহার করে স্বয়ংক্রিয় করা যায় ।
হোয়বার

চমৎকার গ্রাফিক্স। আমি অবাক হয়েছি যে এয়ারলাইনগুলি যখন তাদের ইন-ফ্লাইট ম্যাগাজিনের পিছনে প্রদর্শিত রুটের মানচিত্রগুলি আঁকবে তখন কোনও স্বয়ংক্রিয় সরঞ্জাম ব্যবহার করে।
কर्क কুইকেনডাল

1
@ কির্ক তারা সম্ভবত কার্টোগ্রাফিটি ম্যানুয়ালি করার জন্য কাউকে অর্থ প্রদান করে :-)। একটি সহজ পদ্ধতির যুক্তিসঙ্গতভাবে ভাল গ্রাফিক্স তৈরি করতে পারে কিনা তা দেখার জন্য আমি এই প্রশ্নের দ্বারা অনুপ্রাণিত হয়েছি। উত্তর আশাব্যঞ্জক বলে মনে হচ্ছে। এই গ্রাফিকগুলি, যাইহোক, ম্যাথমেটিকা 8 এর বৃত্ত এবং পয়েন্টের আদিমগুলি এবং বৃত্ত কেন্দ্রগুলি সন্ধান করার জন্য একটি সামান্য ভেক্টর গাণিতিক ব্যবহার করে উত্পাদিত হয়েছিল ।
হোবার

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

@ হুইবার- আপডেট করা সিউডোকোডের জন্য ধন্যবাদ। আমরা এটি পোস্টগ্রিসে বাস্তবায়িত করতে পারি কিনা তা আমাদের দেখতে হবে।
রায়ানডাল্টন

5

ST_CurveToLine চেষ্টা করুন

উদাহরণস্বরূপ কিছু:

SELECT ST_CurveToLine('CIRCULARSTRING(1 1,5 3,10 1)'::geometry) as the_geom;

আপনি টেক্সট বাক্সে ক্যোয়ারীটি অনুলিপি করে এবং http://www.postgisonline.org/map.php এ মানচিত্র 1 টিপে এটি কল্পনা করতে পারেন


আমি "দুই পয়েন্ট" লাইনস্ট্রিংয়ের একটি সেট বক্ররেখার চেষ্টা করে শেষ করেছি।
ব্রেন্ট এডওয়ার্ডস


3

@ নিক্লাস অ্যাভেনের পরামর্শ অনুসারে এসT_ কিউক্রিভটোলাইন ফাংশনটি ব্যবহার করে "দুই পয়েন্ট" লাইনস্ট্রিংগুলির একটি সেট বক্ররেখার চেষ্টা করে শেষ করেছি।

আমি নীচের 3 টি সমন্বিত সেটগুলি ST_Offसेट কার্কভে ফাংশনে পাস করেছি:

  1. মূল লাইনের শুরু
  2. মূল লাইনের সমান্তরাল একটি লাইনের মিডপয়েন্ট
  3. মূল লাইনের সমাপ্তি

আমি আমার উদাহরণে মূল লাইনের দৈর্ঘ্যের 1/10 তম অফসেট - গণনা করতে ST_OffsetCurve ফাংশনটি ব্যবহার করেছি।

আসল সোজা লাইন থেকে বাঁকা লাইনগুলি তৈরি করতে আমি ব্যবহৃত এসকিউএলটি এখানে:

    ST_CurveToLine('CIRCULARSTRING(' || st_x(st_startpoint(the_geom)) || ' ' || st_y(st_startpoint(the_geom)) || ', ' || st_x(st_centroid(ST_OffsetCurve(the_geom, st_length(the_geom)/10, 'quad_segs=4 join=bevel'))) || ' ' || st_y(st_centroid(ST_OffsetCurve(the_geom, st_length(the_geom)/10, 'quad_segs=4 join=bevel'))) || ', ' || st_x(st_endpoint(the_geom)) || ' ' ||  st_y(st_endpoint(the_geom)) || ')') AS the_curved_geom

সত্যই দরকারী, কিন্তু কিছু কারণে ফলাফল আমার শ্রাদকে সম্মান করে না। কোন ধারণা কেন?
DMS02

আপনি কি আরও কিছু বিশদ সরবরাহ করতে পারেন - ইনপুট জ্যামিতির srid, আউটপুট sid অনুপস্থিত, পৃথক, ত্রুটি উত্পন্ন (কি অ্যাপ্লিকেশন (গুলি) - QGIS, PostgreSQL)।
ব্রেন্ট এডওয়ার্ডস

ফলস্বরূপ বাঁকানো রেখাগুলি আমি যে সারণিতে সন্নিবেশ করতে চাইছি তাতে একটি প্রয়োগ_সারণ_জম সীমাবদ্ধতা রয়েছে। আমি যখন কোয়েরিটি সম্পাদন করি তখন আমি এই ত্রুটিটি এই সীমাবদ্ধতা লঙ্ঘন করে বলে ত্রুটি পাই। ঢোকান এমনটা পরীক্ষা (the_curved_geom) [আপনার SQL এখানে] নির্বাচন করুন লাইন থেকে: যে বাধ্যতা এটি কাজ করে কিন্তু তারপর যখন এটি QGIS যোগ এটা srid 0. আমার ক্যোয়ারী দিয়ে তালিকাভুক্ত করা হয় ছাড়া একটি টেবিলের সাথে
DMS02

জ্যামিতি কলাম (the_curved_geom) এ postgis.net/docs/ST_GeometryType.html এবং postgis.net/docs/ST_SRID.html ফাংশনগুলি চালনার চেষ্টা করুন এবং আপনার পরীক্ষার টেবিলের সাথে বিরোধগুলি রয়েছে কি না তা পরীক্ষা করুন enforce যদি তা হয় তবে আপনি জ্যামিতি / সিডকে প্রয়োজনীয় হিসাবে রূপান্তর করতে পারেন বা আপনার পরীক্ষার সারণী / সীমাবদ্ধতা পরিবর্তন করতে পারেন।
ব্রেন্ট এডওয়ার্ডস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.