দূরত্ব এবং দ্রাঘিমাংশ / দ্রাঘিমাংশের জন্য আমি বাউন্ডিং বক্সটি কীভাবে গণনা করব


13

প্রদত্ত WGS84 অক্ষাংশ এবং WGS84 দ্রাঘিমাংশ এবং দূরত্বের জন্য আমার একটি বাউন্ডিং বক্স বা চেনাশোনা গণনা করতে সক্ষম হতে হবে তবে কোথা থেকে শুরু করবেন সে সম্পর্কে কোনও ধারণা নেই!

শুরু থেকে ল্যাট / লনের দূরত্ব 10 কিলোমিটার বা তার চেয়ে কম হবে।

কেউ কীভাবে আমাকে এটি করতে পারে তার জন্য আমাকে কিছু পয়েন্টার / উদাহরণ দেওয়া সম্ভব হবে?


যে সমস্ত চেনাশোনাগুলিকে মেরুটি কভার করে না, তাদের জন্য gis.stackexchange.com/questions/19221/… এ একটি বিস্তারিত উত্তর দেওয়া হয়েছে । তবে এটি সম্পূর্ণ গল্প নয়, যেমনটি বর্তমান জবাবগুলি বোঝায়: আপনি গতি-যথার্থতা-প্রোগ্রাম জটিলতার ট্রেড অফ করতে পারেন। মনে রাখবেন, আপনি যখন ল্যাট-লনে কাজ করেন তখন বাউন্ডিং বাক্সগুলি নির্দিষ্ট করার ক্ষেত্রে "র‌্যাপ-আওয়ার" সমস্যা রয়েছে (সমস্যাগুলি +1 -180 ডিগ্রি মেরিডিয়ানে ঘটে)। এর সমাধানের জন্য, gis.stackexchange.com / জিজ্ঞাসা / 17788/… দেখুন
whuber

আপনার কি সত্যিই একটি বাক্স দরকার, বা একটি নির্দিষ্ট পয়েন্টের কাছে 4 পয়েন্ট পর্যাপ্ত হবে? একটি বিন্দু p দেওয়া হয়েছে, পি থেকে NE, SW, SE, এবং NW দিকের 4 পয়েন্ট D দূরত্বে খুঁজুন।
কर्क কুইকেনডাল

@ কির্ক - আপনার যদি চারটি পয়েন্টের সমন্বয় থাকে তবে আপনার কাছে বাক্সটি রয়েছে ...
মার্টিনস্টোকেলি

@ মার্টিনস্টোইক্লি ঠিক আছে, আমি বলছিলাম যে গোলকটির উপরে একটি বাক্সটি কী দেখায় তা কী কল্পনা করা যায় তা না করে সমস্যাটি সহজ করার আশা করছিলাম। নোট এছাড়াও সমস্যাটি সাধারণীকরণ করা যেতে পারে তা পরিষ্কার করে দিতে যে বাক্সের পাশগুলি একই অক্ষাংশ / দ্রাঘিমাংশের (অন্য কথায় একটি ঘোরানো বাক্স) পড়ার প্রয়োজন নেই।
কर्क কুইকেনডাল

@ কির্ক - আহ্ ভাল, আপনার যদি এটির প্রয়োজন হয় তবে অবশ্যই আপনি ঠিকই আছেন। আমি মনে করি বাক্সটি কেবল সম্ভাব্য প্রার্থীদের দ্রুত খুঁজে পেতে দরকারী। দুটি পয়েন্ট নির্দিষ্ট দূরত্বের (বৃত্ত) মধ্যে রয়েছে কিনা তা পরীক্ষা করতে আরও জটিল হ্যাসারিন সূত্র ব্যবহার করা যেতে পারে।
মার্টিনস্টোকেলি

উত্তর:


15

WGS-কি? WGS-84? আপনার সঠিকতা কতটা প্রয়োজন তার উপর নির্ভর করে আপনার আরও অনেক তথ্য জানতে হতে পারে - আমার ধারণা এই কারণেই আপনাকে ভোট দেওয়া হয়েছে, যদিও কেউই কেন এই কারণে মন্তব্য করতে বিরত করেন নি।

এখানে দুটি উপায় রয়েছে:

ভুল না হলেও সম্ভবত 'যথেষ্ট ভাল'

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

10001.965729km = 90 degrees
1km = 90/10001.965729 degrees = 0.0089982311916 degrees
10km = 0.089982311915998 degrees

এটি দশমিক ডিগ্রি ব্যবহার করছে, ডিগ্রি / মিনিট / সেকেন্ড নয়।

সুতরাং, আপনার সীমাবদ্ধ বাক্সটি আপনার পয়েন্ট, প্লাস এবং বিয়োগ 0.08999 ডিগ্রি হবে। বিকল্পভাবে আপনি এই সংখ্যাটি ব্যাসার্ধ হিসাবে ব্যবহার করতে পারেন, আপনাকে একটি সীমাবদ্ধ বৃত্ত দিয়ে

এটি পড়ে যে কোনও জিআইএস ব্যক্তি কাঁপুন। আপনি বিশ্বের কোথায় আছেন তা নির্ভর করে এটি বেশিরভাগ ক্ষেত্রে সঠিক হবে। 10 কিলোমিটার ব্যাসার্ধের জন্য এটি ঠিক থাকতে হবে।

অনেক বেশি নির্ভুল, তবে আরও কোড

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

আপনি WGS-84 কে বেসিক ডেটাম হিসাবে ব্যবহার করবেন (পৃথিবীর উপস্থাপনা) যদি না আপনি কোনও নির্দিষ্ট ব্যবহার করতে চান যা আপনি জানেন না বা এটি আপনার স্থানাঙ্ক তৈরির জন্য ব্যবহৃত হয়েছিল। এটি সাধারণত ব্যবহৃত হয় এবং বেশ নির্ভুল।

যদি আপনার অবস্থান গুগল ম্যাপ থেকে আসে (উদাহরণস্বরূপ), একটি মার্কেটর প্রক্ষেপণ নির্দিষ্ট করুন। আপনি অন্য প্রজেকশন, বা ইউটিএম স্থানাঙ্ক ব্যবহার করতে চাইতে পারেনঅক্ষাংশ এবং দ্রাঘিমাংশের পরিবর্তে, আপনার ডেটার উত্সের উপর নির্ভর করে এবং যদি আপনি একটি ছোট স্থানীয় অঞ্চলের জন্য উচ্চ নির্ভুলতা চান। (ইউটিএমের একাধিক অঞ্চল রয়েছে যার সবগুলিই বিকৃতিটি পরিবর্তন করে যাতে এই অঞ্চলের মধ্যে এটি অত্যন্ত নির্ভুল; আপনি যদি বাইরে কোনও স্থানাঙ্কের জন্য একটি অঞ্চল ব্যবহার করেন তবে আপনি সরে যাওয়ার সাথে সাথে বিকৃতি অনেক বেড়ে যাবে you আপনি যদি পুরো পৃথিবীকে এক থেকে অনুমানিত দেখেন তবে অঞ্চল, এটি অপরিবর্তনীয় হতে পারে। তবে একটি জোনের মধ্যে ইউটিএম অনুবাদগুলি আপনি যতটা পেতে পারেন তত ভাল হবে Co কোর্ডিনেটগুলি সাধারণত মিটারে নির্দিষ্ট করা হয়, ডিগ্রিতে নয়, সুতরাং এটি আপনার জন্য আরও কার্যকর হতে পারে, যদি আপনাকে 10 কিলোমিটার প্রয়োজন হয় ব্যাসার্ধ। 10 কিলোমিটার সহজেই একটি একক জোনের মধ্যে থাকে, আপনার কেন্দ্রের স্থানাঙ্কের ভিত্তিতে আপনাকে কেবল উপযুক্ত জোনটি বেছে নেওয়া দরকার only একমাত্র মুশকিলটি হ'ল আপনি যখন কোনও সীমানার কাছে যান: এটি একটি সাধারণ পরিস্থিতি, এবং এটি ঠিক আছে, ঠিক থাকুনকিভাবে আপনি যা এক আপনি ব্যবহার চয়ন মধ্যে সামঞ্জস্যপূর্ণ । প্রোজ 4 আপনাকে অনুমানগুলিও অনুবাদ করতে দেয়, যাতে আপনি আপনার মারকেটর ডাব্লুজিএস -৪৮ ল্যাট / দীর্ঘ থেকে একটি ইউটিএম জোন এন যেতে পারেন , উদাহরণস্বরূপ, বা দুটি ইউটিএম অঞ্চল এবং এর থেকে যেতে পারেন))


2
যেখানে আমরা থাকি, একজন সমীক্ষক একবার আমাকে বলেছিলেন যে তিনি তার মানসিক গণনার জন্য প্রায় 1 ডিগ্রি প্রায় 108 কিলোমিটার সমান ব্যবহার করেন। মানসিকভাবে 10 কিমি প্রায় 0.1 ডিগ্রি। যেহেতু এগুলি নির্ভুলতার একটি স্তরকে বোঝায় 0.089982311915998 এর চেয়ে 1 টি উল্লেখযোগ্য অঙ্কের (সর্বাধিক 2 বা 3) এর সাথে চিকিত্সা করার জন্য এগুলি মোটামুটি অনুমানযোগ্য best
স্টিফান কোয়ান

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

3

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

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

deltaLatitude[rad] = distance[m] / earthRadius[m]
deltaLongitude[rad] = distance[m] / (cos(latitude[rad]) * $earthRadius[m])

/**
 * Calculates the deltas in latitude and longitude to use, for a db search
 * around a location in the database.
 * @param float $distance Radius to use for the search [m]
 * @param float $latitude Latitude of the location, we need the angle deltas for [deg decimal]
 * @param float $deltaLatitude Calculated delta in latitude [deg]
 * @param float $deltaLongitude Calculated delta in longitude [deg]
 * @param float $earthRadius Mean earth radius in [m]
 */
public static function angleFromSphericDistance($distance, $latitude,
  &$deltaLatitude, &$deltaLongitude, $earthRadius = 6371000)
{
  $lat = deg2rad($latitude);

  $radiusOnLatitude = cos($lat) * $earthRadius;
  $deltaLatitude = $distance / $earthRadius;
  $deltaLongitude = $distance / $radiusOnLatitude;

  $deltaLatitude = rad2deg($deltaLatitude);
  $deltaLongitude = rad2deg($deltaLongitude);
}

সঙ্গে haversine সূত্র , আপনি গোলক উপর দূরত্বের নিরূপণ করতে পারেন। "সঠিক" দূরত্ব পেতে, এটি প্রতিটি পাওয়া জায়গার জন্য ব্যবহার করুন। এইভাবে আপনি পরীক্ষা করতে পারবেন, যদি দুটি জায়গা নির্দিষ্ট ব্যাসার্ধের মধ্যে থাকে (বাক্সের পরিবর্তে একটি বৃত্ত)।

/**
 * Calculates the great-circle distance between two points, with
 * the Haversine formula.
 * @param float $latitudeFrom Latitude of start point in [deg decimal]
 * @param float $longitudeFrom Longitude of start point in [deg decimal]
 * @param float $latitudeTo Latitude of target point in [deg decimal]
 * @param float $longitudeTo Longitude of target point in [deg decimal]
 * @param float $earthRadius Mean earth radius in [m]
 * @return float Distance between points in [m] (same as earthRadius)
 */
public static function haversineGreatCircleDistance(
  $latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371000)
{
  // convert from degrees to radians
  $latFrom = deg2rad($latitudeFrom);
  $lonFrom = deg2rad($longitudeFrom);
  $latTo = deg2rad($latitudeTo);
  $lonTo = deg2rad($longitudeTo);

  $latDelta = $latTo - $latFrom;
  $lonDelta = $lonTo - $lonFrom;

  $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
    cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
  return $angle * $earthRadius;
}

3

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

x = (lonRef - lon) * cos ( latRef )
y = latRef - lat
distance = EarthRadius * sqrt( x*x + y*y )

গুরুত্বপূর্ণ দ্রষ্টব্য: এই সূত্রগুলিতে ল্যাট / লম্বা ডিগ্রি নয় রেডিয়ানে রয়েছে। আর্থর্যাডিয়াসের সাধারণ মান 63৩71১ কিলোমিটার যা কিলোমিটারের একক দূরত্বে ফিরে আসবে। আপনার দূরত্বটি বৃত্তের মধ্যে বা তার বাইরে থাকলে এখন এটি একটি সহজ পরীক্ষা। যদি একটি সীমানা চেনাশোনা কাজ করে, আমি সেই সাথে যাব।

একটি আবদ্ধ আয়তক্ষেত্রের জন্য, আমি ধরে নেব আপনি নিখরচরের সমান্তরাল হয়ে আয়তক্ষেত্রটি সংজ্ঞায়িত করতে চান। তারপরে আমি সীমানা / ভারবহন গণনা (বিয়ারিং 45 ডিগ্রি, 135 ডিগ্রি, 225 ডিগ্রি এবং 315 ডিগ্রি) ব্যবহার করে বাউন্ডিং বক্সের কোণগুলি গণনা করব। সেখান থেকে, আমি ধরে নেব যে আপনি পোলের আশেপাশে নেই এবং বহুভুজ পরীক্ষায় একটি বিন্দু ব্যবহার করবেন।


2

নীচে টি-এসকিউএল কোড রয়েছে যা আমি এসকিউএল-সার্ভার ২০১২-তে বাউন্ডিং বক্স তৈরির জন্য ব্যবহার করি my আমার ক্ষেত্রে আমি ল্যাট, লম্বের দশমিক মান পাই। STDistanceফলাফলগুলি সুনির্দিষ্ট দূরত্বে রয়েছে তা যাচাই করার জন্য এসকিউএল ফাংশনটি ব্যবহার করার আগে আমি দ্রুত সংখ্যক সারি সীমাবদ্ধ করতে এটি ব্যবহার করি । ভূগোল ফাংশনগুলি এসকিউএল সার্ভারে খুব ব্যয়বহুল হয় সুতরাং বাউন্ডিং বাক্সটি তৈরি করে আমি এটি সম্পাদন করতে হয় এমন সময়ের সংখ্যা হ্রাস করতে সক্ষম।

DECLARE @Lat DECIMAL(20, 13) = 35.7862
   ,@Long DECIMAL(20, 13) = -80.3095
   ,@Radius DECIMAL(7, 2) = 5
   ,@Distance DECIMAL(10, 2)
   ,@Earth_Radius INT = 6371000;

SET @Distance = @Radius * 1609.344;

DECLARE @NorthLat DECIMAL(20, 13) = @Lat + DEGREES(@distance / @Earth_Radius)
   ,@SouthLat DECIMAL(20, 13) = @Lat - DEGREES(@distance / @Earth_Radius)
   ,@EastLong DECIMAL(20, 13) = @Long + DEGREES(@distance / @Earth_Radius / COS(RADIANS(@Lat)))
   ,@WestLong DECIMAL(20, 13) = @Long - DEGREES(@distance / @Earth_Radius / COS(RADIANS(@Lat)));

SELECT *
    FROM CustomerPosition AS cp
    WHERE (
            cp.Lat >= @SouthLat
            AND cp.Lat <= @NorthLat )
        AND (
              cp.Long >= @WestLong
              AND cp.Long <= @EastLong )
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.