দুটি ল্যাট / এলএনজি এর একটি বিন্দু এবং ভার্চুয়াল রেখার মধ্যে দূরত্ব গণনা করা হচ্ছে


14

উদাহরণ এবং সম্পর্কিত চিত্র দেখুন।

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

অঙ্কন

আমি বর্তমানে এটি গুগল ম্যাপস এপিআই v3 এ অর্জন করেছি তবে আমার পছন্দের ভাষাতে পর্দার আড়ালে এটি সম্পাদন করতে সক্ষম হতে চাই। যে কোনও টিপস / ধারণাগুলি প্রশংসিত হবে!



@ কির্ক, না, এবি কেবল একটি সরল রেখা
বন্দী

@ মিশেল, একটি আকর্ষণীয় বিষয়। আমি এটি দেখতে হবে!
কয়েদি

@ প্রিজনার @ কির্ক আক্ষরিক অর্থে, পৃথিবীর পৃষ্ঠের নীচে একটি "সরলরেখা" কেটে যাবে। সাধারণভাবে, এর রেডিয়াল অভিক্ষেপটি পৃষ্ঠের দিকে ফিরে আসলেই একটি দুর্দান্ত বৃত্তের একটি অংশ হবে (একটি গোলকের পৃথিবীর মডেল ব্যবহার করে)।
হোবার

1
@ প্রিজনার এটি তথ্যের একটি অত্যন্ত কার্যকর অতিরিক্ত টুকরা! হ্যাঁ আপনি সঠিক. আপনাকে এখনও এই ক্ষতিপূরণ দিতে হবে যে (ল্যাট, লম্বা) উত্তর-দক্ষিণের তুলনায় পূর্ব-পশ্চিম দূরত্বকে পৃথকভাবে বিকৃত করে। @ জোসের পরামর্শ অনুসারে, সমন্বয়গুলি প্রজেক্ট করুন। এটি গড় অক্ষাংশের কোসাইন দ্বারা দ্রাঘিমাংশকে পূর্ব-গুণিত করা এবং তারপরে আপনি ইউক্যালিডের বিমানে আছেন বলে ভান করা সহজ।
হোবার

উত্তর:


6
def get_perp( X1, Y1, X2, Y2, X3, Y3):
    """************************************************************************************************ 
    Purpose - X1,Y1,X2,Y2 = Two points representing the ends of the line segment
              X3,Y3 = The offset point 
    'Returns - X4,Y4 = Returns the Point on the line perpendicular to the offset or None if no such
                        point exists
    '************************************************************************************************ """
    XX = X2 - X1 
    YY = Y2 - Y1 
    ShortestLength = ((XX * (X3 - X1)) + (YY * (Y3 - Y1))) / ((XX * XX) + (YY * YY)) 
    X4 = X1 + XX * ShortestLength 
    Y4 = Y1 + YY * ShortestLength
    if X4 < X2 and X4 > X1 and Y4 < Y2 and Y4 > Y1:
        return X4,Y4
    return None

সংক্ষিপ্ততম দৈর্ঘ্যটি আপনার প্রয়োজনীয় দূরত্ব, যদি না আমার ভুল হয়?


হ্যাঁ, আমি সি থেকে লাইন বিভাগের সবচেয়ে কম দূরত্ব খুঁজছি। এই কি এই গণিত গণনা?
কয়েদি

1
এটি সত্যই কার্যকর হয়েছে, আমি নিম্নলিখিতটিতে তিনটি পয়েন্ট (এ, বি, সি) পেরিয়েছি : i.imgur.com/bK9oB.jpg এবং এটি এক্স এর লেট / এলএনজি নিয়ে ফিরে এসেছিল Great দুর্দান্ত কাজ!
কয়েদি

1
@ হিরি, একটি সর্বশেষ জিনিস, আমি কীভাবে নিকটস্থ বিন্দুতে যেতে কেবল এটি পরিবর্তন করতে যাব (কেবল লাইন নয়) তাই যদি আমি এটি একটি লাইনে যোগ দেওয়ার পয়েন্টটি রেখে দিয়ে থাকি তবে কীভাবে আমি এটির দূরত্ব পরীক্ষা করতে পারি? বিন্দু?
কয়েদি

1
@ হিরো শুভ সূচনা, তবে মনে হয় Noneবৈধ সমাধানের উপস্থিতিতে এই কোডটি প্রায়শই ফিরে আসে । সমস্যাটি হ'ল শেষ শর্তটি এক্স 1 <এক্স 2 এবং ওয়াই 1 <ওয়াই 2 ধরে থাকে, যা সর্বদা আশ্বাস দেওয়া যায় না। মধ্যস্থতার আরও ভাল পরীক্ষা করা দরকার।
হোবার

1
@ উত্তেজনাপূর্ণ মনে হচ্ছে আপনার এবং @ বিস্ময়করদের মধ্যে এই বিনিময়টি উত্পাদনশীল হয়েছে। আমি জোর দিয়ে বলতে চাই যে আমার ভোটদানের যে কোনও পরিবর্তন বা ঘটেছে এমন পয়েন্টগুলির সাথে (বা এমনকি কোনও নিয়ন্ত্রণেরও) কিছুই ছিল না এবং আমার মন্তব্যটি কেবল আপনাকে আপনার উত্তরকে উন্নত করতে সহায়তা করার উদ্দেশ্যে করা হয়েছিল।
হোবার

11

হতে পারে আমি এটিকে খুব জটিল করে তুলছি তবে আপনি যা চান তা বিন্দু থেকে একটি লাইনের দূরত্ব। এটি AB এর সাথে এমন একটি বিন্দু থেকে দূরত্ব যা AB এর সাথে একটি লাইন অরথোগোনালের সাথে AB যুক্ত করে। এবিটির এই ভেক্টরটি লম্ব করে দেওয়া হয়েছে

v=[x2-x1, -(y2-y1)] # Point A is [x1,y1] Point B is [x2,y2]

(আমি ভেক্টর বা একটি দ্বি-উপাদান অ্যারের সংজ্ঞায়িত করতে বর্গাকার বন্ধনী ব্যবহার করেছি)। সি [xp, yp] এবং বিন্দু A এর মধ্যে দূরত্ব

u=[x1-xp, y1-xp]

লাইন এবং সি এর মধ্যকার দূরত্বটি কেবলমাত্র আপনার উপর ভি-র প্রক্ষেপণ is যদি আমরা মোড (ভি) = 1 (কেবলমাত্র এটি স্বাভাবিক করুন) ধরে নিই, তবে

distance = u*v = abs( (x2-x1)*(y1-yp) - (x1-xp)*(y2-y1) )

কেবলমাত্র জটিলতাটি হ'ল আপনি সম্ভবত নিশ্চিত করতে চান যে আপনার স্থানাঙ্কগুলি ডাব্লু জিএস 84 ল্যাট / লগ জোড় নয়, তবে ভবিষ্যদ্বাণী করা হয়েছে (বা জিওডেটিক স্থানাঙ্কগুলি ব্যবহার করুন)। আপনি ব্যবহার করতে পারেন OGR বা Proj4 এই জন্য।


3
+ উপায় দ্বারা ট্রিগনোমেট্রিক ফাংশন ব্যবহার না করার জন্য কয়েক মিলিয়ন সিউডো-পয়েন্ট। খুব বেশি লোক আর্কট্যানটি টেনে আনেন যখন তাদের এটির দিকে নজর দেওয়া উচিত: en.wikedia.org/wiki/Dot_product
হার্ব

@ জোস, উত্তরের জন্য ধন্যবাদ! আমি গুগল ম্যাপস এপিআই থেকে ল্যাট / লং ব্যবহার করছি। গণিতের অংশটি আমার কাছে একেবারেই নতুন তাই আমি এটি দিয়ে যাব এবং আমি কী দেখতে পাব তা দেখতে পাবো। গণিতে কোনও টিপস? যেমন [x2-x1, - (y2-y1)], এটি কী অনুবাদ করে?
বন্দী

আমি এটির জন্য একটি সংক্ষিপ্ত সম্পাদনা যুক্ত করেছি। মূলত এটি একটি অ্যারে স্বরলিপি, তবে আপনি যদি আপনার স্থানাঙ্কগুলি x1, x2, y1, y2 এবং xp, yp এ সঞ্চয় করেন তবে আপনাকে কেবলমাত্র সরবরাহ করা শেষ সমীকরণের ডানদিকে লিখতে হবে। এই প্রায় কাছাকাছি বৈধ সি, জাভা, জাতীয়, পাইথন ইত্যাদি কোড :)
জোসে

1
@ জোস আপনি সি থেকে লাইন AB পর্যন্ত দূরত্বটি গণনা করছেন । চিত্রের উপর ভিত্তি করে, আমি বিশ্বাস করি যে ওপি সি থেকে লাইন সেগমেন্ট AB এর দূরত্ব চায় । এটিকে লাইনের AB এ প্রজেকশন A এবং B এর মধ্যে রয়েছে কিনা তা পরীক্ষা করার জন্য এটি অতিরিক্ত কাজ প্রয়োজন। পরবর্তী ক্ষেত্রে, দুটি দৈর্ঘ্যের সিএ এবং সিবি সংক্ষিপ্ততর ব্যবহার করুন।
হোবার

1
@ প্রিসনার মূল পার্থক্যটি হ'ল একটি লাইন চিরতরে প্রসারিত হয় (এটি কেবল একটি দিক ভেক্টর এবং একটি বিন্দু দ্বারা সংজ্ঞায়িত করা হয়, বা দুটি পয়েন্ট দ্বারা সংযুক্ত করা হয়), তবে A এবং B এর মধ্যে একটি অংশটি অসীম রেখার বিট যা এ এবং এর মধ্যে যায় বি (এটির সীমাবদ্ধ দৈর্ঘ্য রয়েছে)
জোসে

4

এই সমস্ত গণিতেও কিছুটা বিরূপ থাকাকালীন আমি এটিকে অন্য একটি কোণ থেকে এসেছি। আমি ভার্চুয়াল লাইনের পরিবর্তে এটিকে একটি 'আসল' লাইন তৈরি করব এবং তারপরে বিদ্যমান সরঞ্জামগুলি ব্যবহার করব।

যদি এ এবং বি কোনও বৈশিষ্ট্য ভাগ করে নেয় তবে আপনি সেগুলি একটি লাইন অঙ্কন করে সংযুক্ত করতে পারেন (কোসমো জিআইএসের একটি সরঞ্জাম রয়েছে যা পয়েন্টগুলি থেকে লাইন তৈরি করবে, এবং আমি বিশ্বাস করি এর জন্য একটি কিউজিআইএস প্লাগইন রয়েছে)। আপনার লাইনগুলি একবার হয়ে গেলে, 'সি' পয়েন্ট স্তরটিতে একটি 'কাছাকাছি' ফাংশন আপনাকে রেখার দূরত্ব দেবে। সফ্টওয়্যারটি আপনার জন্য গণিতটি পরিচালনা করতে দিন!


মন্তব্যের জন্য ধন্যবাদ তবে হিরি এই সম্পর্কে ট্রাম্প নিয়ে এসেছিল!
বন্দী

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

1

আপনি যদি অ্যান্ড্রয়েডে জাভা ব্যবহার করে থাকেন তবে এটির লাইব্রেরি ফাংশনের সাথে একটিমাত্র লাইন

import static com.google.maps.android.PolyUtil.distanceToLine;

distanceToLine:

public static double distanceToLine(LatLng p, LatLng start,LatLng end)

পয়েন্ট পি এবং লাইন বিভাগটি শেষ হতে শুরু করার মধ্যে গোলকের দূরত্ব গণনা করে।

পরামিতি: পি - পয়েন্টটি পরিমাপ করা

শুরু - রেখাংশের শুরু

শেষ - রেখাংশের সমাপ্তি

ফিরে আসে: মিটার দূরত্ব (গোলাকার পৃথিবী ধরে)

শুধু আপনার লাইব্রেরি যুক্ত করুন

dependencies {
    compile 'com.google.maps.android:android-maps-utils:0.5+'
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.