প্রদত্ত লেট / এলএনজি অবস্থানের জন্য বাউন্ডিং বক্সটি কীভাবে গণনা করবেন?


101

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

সীমানা বাক্সটি ল্যাটিন, এলএনগমিন এবং ল্যাটম্যাক্স, এলএনজিএম্যাক্স হিসাবে সংজ্ঞায়িত করা উচিত।

Panoramio API ব্যবহার করার জন্য আমার এই জিনিসগুলির প্রয়োজন ।

কেউ কীভাবে এই পয়েন্ট পেতে হবে তার সূত্রটি জানেন?

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

সম্পাদনা করুন: আমি এমন কোনও সমাধান খুঁজছি না যা আমাকে 2 পয়েন্টের দূরত্ব দেখায়


আপনি যদি কোথাও জিওডাটাবেস ব্যবহার করছেন তবে তাদের অবশ্যই একটি বাউন্ডিং বাক্স গণনা ইন্টিগ্রেটেড আছে। এমনকি আপনি পোস্টজিআইএস / জিইওএসের উত্সও পরীক্ষা করতে পারেন।
ভিঙ্কো ভার্সালোভিক

উত্তর:


60

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

আমার বাস্তবায়ন অনুসরণ করে (এটি পাইথনে লেখা; আমি এটি পরীক্ষা করি নি):

# degrees to radians
def deg2rad(degrees):
    return math.pi*degrees/180.0
# radians to degrees
def rad2deg(radians):
    return 180.0*radians/math.pi

# Semi-axes of WGS-84 geoidal reference
WGS84_a = 6378137.0  # Major semiaxis [m]
WGS84_b = 6356752.3  # Minor semiaxis [m]

# Earth radius at a given latitude, according to the WGS-84 ellipsoid [m]
def WGS84EarthRadius(lat):
    # http://en.wikipedia.org/wiki/Earth_radius
    An = WGS84_a*WGS84_a * math.cos(lat)
    Bn = WGS84_b*WGS84_b * math.sin(lat)
    Ad = WGS84_a * math.cos(lat)
    Bd = WGS84_b * math.sin(lat)
    return math.sqrt( (An*An + Bn*Bn)/(Ad*Ad + Bd*Bd) )

# Bounding box surrounding the point at given coordinates,
# assuming local approximation of Earth surface as a sphere
# of radius given by WGS84
def boundingBox(latitudeInDegrees, longitudeInDegrees, halfSideInKm):
    lat = deg2rad(latitudeInDegrees)
    lon = deg2rad(longitudeInDegrees)
    halfSide = 1000*halfSideInKm

    # Radius of Earth at given latitude
    radius = WGS84EarthRadius(lat)
    # Radius of the parallel at given latitude
    pradius = radius*math.cos(lat)

    latMin = lat - halfSide/radius
    latMax = lat + halfSide/radius
    lonMin = lon - halfSide/pradius
    lonMax = lon + halfSide/pradius

    return (rad2deg(latMin), rad2deg(lonMin), rad2deg(latMax), rad2deg(lonMax))

সম্পাদনা: নিম্নলিখিত কোডটি (ডিগ্রি, প্রাইমস, সেকেন্ড) ডিগ্রি + ডিগ্রি ভগ্নাংশে রূপান্তরিত করে এবং বিপরীতে (পরীক্ষিত নয়):

def dps2deg(degrees, primes, seconds):
    return degrees + primes/60.0 + seconds/3600.0

def deg2dps(degrees):
    intdeg = math.floor(degrees)
    primes = (degrees - intdeg)*60.0
    intpri = math.floor(primes)
    seconds = (primes - intpri)*60.0
    intsec = round(seconds)
    return (int(intdeg), int(intpri), int(intsec))

4
প্রস্তাবিত সিপিএএন লাইব্রেরির ডকুমেন্টেশনে যেমন উল্লেখ করা হয়েছে, এটি কেবল অর্ধদৈর্ঘ্য <= 10 কিমি।
ফেডেরিকো এ রামপনি

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

1
এখানে জানমাতুস্কেক.ডে পাওয়া স্পেসিফিকেশন থেকে একটি পিএইচপি বাস্তবায়ন: github.com/anthonymartin/GeLocation.class.php
অ্যান্টনি মার্টিন

2
আমি নীচে নীচে এই উত্তরটির একটি সি # বাস্তবায়ন যুক্ত করেছি।
27 Г И І И О

2
@ ফেডারিকোএ.রম্পনি এখানে হল্ডসাইডাইন কেএম কি? বুঝতে পারছি না ... এই যুক্তিগুলিতে আমাকে কী পাস করতে হবে, মানচিত্রে দুটি পয়েন্টের মধ্যে ব্যাসার্ধ বা কী?

53

আমি সীমাবদ্ধ স্থানাঙ্কগুলি সন্ধান সম্পর্কে একটি নিবন্ধ লিখেছিলাম:

http://JanMatuschek.de/LatitudeLongitudeBoundingCoordinates

নিবন্ধটি সূত্রগুলি ব্যাখ্যা করে এবং একটি জাভা বাস্তবায়নও সরবরাহ করে। (এটি ন্যূনতম / সর্বাধিক দ্রাঘিমাংশের জন্য ফেডেরিকোর সূত্রটি কেন সঠিক নয় তাও দেখায়))


4
আমি আপনার জিওলোকেশন ক্লাসের একটি পিএইচপি পোর্ট করেছি। এটি এখানে পাওয়া যাবে: pastie.org/5416584
অ্যান্টনি মার্টিন


1
এটি কি প্রশ্নের উত্তর দেয়? আমাদের কাছে যদি কেবলমাত্র 1 টি পয়েন্ট থাকে তবে আমরা এই কোডের মতো দুর্দান্ত বৃত্তের দূরত্ব গণনা করতে পারি না, এর জন্য দুটি ল্যাট, দীর্ঘ অবস্থান প্রয়োজন।
mdoran3844

আপনার সি # ভেরিয়েন্টে একটি খারাপ কোড রয়েছে, উদাহরণস্বরূপ: public override string ToString()এই জাতীয় বৈশ্বিক পদ্ধতিটি শুধুমাত্র একটি উদ্দেশ্যে যুক্ত করা আরও ভাল, অন্য কোনও পদ্ধতি যুক্ত করা ভাল, তারপরে স্ট্যান্ডার্ড পদ্ধতিটি ওভাররাইড করা, যা অ্যাপ্লিকেশনের অন্যান্য অংশে ব্যবহার করা যেতে পারে,

এখানে জ্যানের জিওলোকাইটন ক্লাসের পিএইচপি বন্দরের আপডেট লিংকটি রয়েছে: github.com/anthonymartin/GoLocation.php
অ্যান্টনি মার্টিন

34

এখানে আমি আগ্রহী যে কারও জন্য ফেডেরিকো এ রামপোনির জবাব সি # তে রূপান্তর করেছি:

public class MapPoint
{
    public double Longitude { get; set; } // In Degrees
    public double Latitude { get; set; } // In Degrees
}

public class BoundingBox
{
    public MapPoint MinPoint { get; set; }
    public MapPoint MaxPoint { get; set; }
}        

// Semi-axes of WGS-84 geoidal reference
private const double WGS84_a = 6378137.0; // Major semiaxis [m]
private const double WGS84_b = 6356752.3; // Minor semiaxis [m]

// 'halfSideInKm' is the half length of the bounding box you want in kilometers.
public static BoundingBox GetBoundingBox(MapPoint point, double halfSideInKm)
{            
    // Bounding box surrounding the point at given coordinates,
    // assuming local approximation of Earth surface as a sphere
    // of radius given by WGS84
    var lat = Deg2rad(point.Latitude);
    var lon = Deg2rad(point.Longitude);
    var halfSide = 1000 * halfSideInKm;

    // Radius of Earth at given latitude
    var radius = WGS84EarthRadius(lat);
    // Radius of the parallel at given latitude
    var pradius = radius * Math.Cos(lat);

    var latMin = lat - halfSide / radius;
    var latMax = lat + halfSide / radius;
    var lonMin = lon - halfSide / pradius;
    var lonMax = lon + halfSide / pradius;

    return new BoundingBox { 
        MinPoint = new MapPoint { Latitude = Rad2deg(latMin), Longitude = Rad2deg(lonMin) },
        MaxPoint = new MapPoint { Latitude = Rad2deg(latMax), Longitude = Rad2deg(lonMax) }
    };            
}

// degrees to radians
private static double Deg2rad(double degrees)
{
    return Math.PI * degrees / 180.0;
}

// radians to degrees
private static double Rad2deg(double radians)
{
    return 180.0 * radians / Math.PI;
}

// Earth radius at a given latitude, according to the WGS-84 ellipsoid [m]
private static double WGS84EarthRadius(double lat)
{
    // http://en.wikipedia.org/wiki/Earth_radius
    var An = WGS84_a * WGS84_a * Math.Cos(lat);
    var Bn = WGS84_b * WGS84_b * Math.Sin(lat);
    var Ad = WGS84_a * Math.Cos(lat);
    var Bd = WGS84_b * Math.Sin(lat);
    return Math.Sqrt((An*An + Bn*Bn) / (Ad*Ad + Bd*Bd));
}

1
ধন্যবাদ, আমার জন্য এই কাজ। কোডটি হাতে হাতে পরীক্ষা করতে হয়েছিল, কীভাবে এর জন্য ইউনিট পরীক্ষা লিখতে হয় তা জানতাম না তবে এটি আমার প্রয়োজনীয় সঠিকতার ডিগ্রির সঠিক ফলাফল উত্পন্ন করে
mdoran3844

এখানে haldSideinKm কি? বুঝতে পারছি না ... এই যুক্তিগুলিতে আমাকে কী পাস করতে হবে, মানচিত্রে দুটি পয়েন্টের মধ্যে ব্যাসার্ধ বা কী?

@ জেলোভোলরো: আপনি যে সীমাবদ্ধ বাক্সটি চান সেটি অর্ধেক দৈর্ঘ্য
Г И І И О

1
অগত্যা আপনার নিজের মানচিত্রের বর্গ লিখতে হবে না। সিস্টেমে একটি জিও-কর্ডিনেট ক্লাস রয়েছে ev
আইনজীবী

1
এটি সুন্দরভাবে কাজ করে। আমি সত্যিই সি # বন্দরের প্রশংসা করি।
টম ল্যাচার

10

আমি একটি জাভাস্ক্রিপ্ট ফাংশন লিখেছিলাম যা একটি স্কোয়ার বাউন্ডিং বাক্সের চারটি স্থানাঙ্ক দেয়, একটি দূরত্ব এবং এক জোড়া স্থানাঙ্ক প্রদান করে:

'use strict';

/**
 * @param {number} distance - distance (km) from the point represented by centerPoint
 * @param {array} centerPoint - two-dimensional array containing center coords [latitude, longitude]
 * @description
 *   Computes the bounding coordinates of all points on the surface of a sphere
 *   that has a great circle distance to the point represented by the centerPoint
 *   argument that is less or equal to the distance argument.
 *   Technique from: Jan Matuschek <http://JanMatuschek.de/LatitudeLongitudeBoundingCoordinates>
 * @author Alex Salisbury
*/

getBoundingBox = function (centerPoint, distance) {
  var MIN_LAT, MAX_LAT, MIN_LON, MAX_LON, R, radDist, degLat, degLon, radLat, radLon, minLat, maxLat, minLon, maxLon, deltaLon;
  if (distance < 0) {
    return 'Illegal arguments';
  }
  // helper functions (degrees<–>radians)
  Number.prototype.degToRad = function () {
    return this * (Math.PI / 180);
  };
  Number.prototype.radToDeg = function () {
    return (180 * this) / Math.PI;
  };
  // coordinate limits
  MIN_LAT = (-90).degToRad();
  MAX_LAT = (90).degToRad();
  MIN_LON = (-180).degToRad();
  MAX_LON = (180).degToRad();
  // Earth's radius (km)
  R = 6378.1;
  // angular distance in radians on a great circle
  radDist = distance / R;
  // center point coordinates (deg)
  degLat = centerPoint[0];
  degLon = centerPoint[1];
  // center point coordinates (rad)
  radLat = degLat.degToRad();
  radLon = degLon.degToRad();
  // minimum and maximum latitudes for given distance
  minLat = radLat - radDist;
  maxLat = radLat + radDist;
  // minimum and maximum longitudes for given distance
  minLon = void 0;
  maxLon = void 0;
  // define deltaLon to help determine min and max longitudes
  deltaLon = Math.asin(Math.sin(radDist) / Math.cos(radLat));
  if (minLat > MIN_LAT && maxLat < MAX_LAT) {
    minLon = radLon - deltaLon;
    maxLon = radLon + deltaLon;
    if (minLon < MIN_LON) {
      minLon = minLon + 2 * Math.PI;
    }
    if (maxLon > MAX_LON) {
      maxLon = maxLon - 2 * Math.PI;
    }
  }
  // a pole is within the given distance
  else {
    minLat = Math.max(minLat, MIN_LAT);
    maxLat = Math.min(maxLat, MAX_LAT);
    minLon = MIN_LON;
    maxLon = MAX_LON;
  }
  return [
    minLon.radToDeg(),
    minLat.radToDeg(),
    maxLon.radToDeg(),
    maxLat.radToDeg()
  ];
};

এই কোডটি মোটেই কাজ করে না। আমি বলতে চাচ্ছি, মত সুস্পষ্ট ত্রুটি আপ ফিক্সিং পরেও minLon = void 0;এবং maxLon = MAX_LON;এটি এখনও কাজ করে না।
আরথ

1
@ আরথ, আমি কেবল এটি পরীক্ষা করেছি এবং কোনও সমস্যা নেই had মনে রাখবেন যে centerPointআর্গুমেন্ট দুটি সমন্বয় সমন্বিত একটি অ্যারে। উদাহরণস্বরূপ, getBoundingBox([42.2, 34.5], 50)- void 0হ'ল "অপরিজ্ঞাত" এর জন্য কফিস্ক্রিপ্ট আউটপুট এবং কোডগুলি চালানোর ক্ষমতাকে প্রভাবিত করবে না।
asalisbury

এই কোড কাজ করে না। degLat.degToRadকোনও ফাংশন নয়
ব্যবহারকারী 299709

কোড নোড এবং ক্রোমে যেমন আছে তেমন কাজ করেছে, যতক্ষণ না আমি এটিকে কাজ করছি এমন একটি প্রকল্পের মধ্যে রেখেছি এবং degToRad"ত্রুটি নয়" ত্রুটি পাওয়া শুরু করি। কখনই খুঁজে পাওয়া যায় নি তবে এর Number.prototype.মতো কোনও ইউটিলিটি ফাংশনের জন্য ভাল ধারণা নয় তাই আমি এগুলিকে সাধারণ স্থানীয় ফাংশনে রূপান্তর করি। এছাড়াও এটি লক্ষণীয় গুরুত্বপূর্ণ যে ফেরত দেওয়া বাক্সটি হ'ল [এলএনজি, এলএটি, এলএনজি, এলএটি] পরিবর্তে [এলএটি, এলএনজি, ল্যাট, এলএনজি]। বিভ্রান্তি এড়াতে আমি এটি ব্যবহার করার সময় আমি ফাংশনটি পরিবর্তন করেছি।
কর্নেলিমোমোস

9

যেহেতু আমার খুব মোটামুটি অনুমানের প্রয়োজন ছিল, তাই স্থিতিশীল অনুসন্ধানে কিছু অযথা ডকুমেন্টগুলি ফিল্টার করার জন্য, আমি নীচের সূত্রটি নিযুক্ত করেছি:

Min.lat = Given.Lat - (0.009 x N)
Max.lat = Given.Lat + (0.009 x N)
Min.lon = Given.lon - (0.009 x N)
Max.lon = Given.lon + (0.009 x N)

N = কিমি প্রয়োজনীয় প্রদত্ত অবস্থানটি তৈরি করে। আপনার কেস জন্য এন = 10

সঠিক না হলেও কার্যকর


প্রকৃতপক্ষে, সঠিক নয় তবে কার্যকর এবং বাস্তবায়নের পক্ষে খুব সহজ।
এমভি

6

আপনি একটি উপবৃত্তাকার সূত্র খুঁজছেন।

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

জিও :: উপবৃত্তাকার

locationপদ্ধতিটি একবার দেখুন । এটিকে দু'বার কল করুন এবং আপনার বাক্সটি পেয়েছেন।

আপনি কোন ভাষাটি ব্যবহার করছেন তা পোস্ট করেননি। ইতিমধ্যে আপনার জন্য একটি জিওকোডিং গ্রন্থাগার থাকতে পারে।

ওহ, এবং যদি আপনি এখনই এটি সন্ধান না করে থাকেন তবে গুগল ম্যাপে ডাব্লুজিএস 84 এলিপসয়েড ব্যবহার করা হয়।


5

@ জ্যান ফিলিপ মাতুচেকের দুর্দান্ত ব্যাখ্যাটির উদাহরণ (

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

পি এর হরসারিন দূরত্ব (ছেদ অক্ষাংশ, দ্রাঘিমাংশ উচ্চ) থেকে (অক্ষাংশ, দ্রাঘিমাংশ) এর দূরত্ব ডি এর সমান।

পাইথন এখানে প্রকাশ করেছেন https://gist.github.com/alexcpn/f95ae83a7ee0293a5225

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


5

এখানে জাভাস্ক্রিপ্ট ব্যবহার করে একটি সরল বাস্তবায়ন দেওয়া হচ্ছে যা অক্ষাংশ ডিগ্রি কে কিমি থেকে রূপান্তরের উপর ভিত্তি করে 1 degree latitude ~ 111.2 km

আমি প্রদত্ত অক্ষাংশ এবং দ্রাঘিমাংশ থেকে 10 কিলোমিটার প্রস্থের সাথে মানচিত্রের সীমানা গণনা করছি।

function getBoundsFromLatLng(lat, lng){
     var lat_change = 10/111.2;
     var lon_change = Math.abs(Math.cos(lat*(Math.PI/180)));
     var bounds = { 
         lat_min : lat - lat_change,
         lon_min : lng - lon_change,
         lat_max : lat + lat_change,
         lon_max : lng + lon_change
     };
     return bounds;
}

4

আমি ঠিক এই কাজটি করতে পেলাম এমন একটি পিএইচপি স্ক্রিপ্ট গ্রহণ করেছি। আপনি এটি বিন্দুর চারপাশে একটি বাক্সের কোণগুলি খুঁজে পেতে ব্যবহার করতে পারেন (বলুন, 20 কিমি দূরে)। আমার নির্দিষ্ট উদাহরণটি গুগল ম্যাপস এপিআই এর জন্য:

http://www.richardpeacock.com/blog/2011/11/draw-box-around-coordinate-google-maps-based-miles-or-kilometers


-1 ওপি কী সন্ধান করছে তা হ'ল: একটি রেফারেন্স পয়েন্ট (ল্যাট, লম্বা) এবং একটি দূরত্ব দেওয়া হলে, সবচেয়ে ছোট বাক্সটি সন্ধান করুন যাতে রেফারেন্স পয়েন্ট থেকে <= "দূরত্ব" দূরে থাকা সমস্ত পয়েন্টগুলি বাক্সের বাইরে নয়। আপনার বাক্সটির রেফারেন্স পয়েন্ট থেকে "কোণ" দূরে রয়েছে এবং এটি খুব ছোট। উদাহরণ: যে বিন্দুটি উত্তর দিয়ে "দূরত্ব" রয়েছে তা আপনার বাক্সের বাইরে খুব ভাল।
জন মাচিন

ঠিক আছে, আসলে, এটি ঠিক আমার প্রয়োজন ছিল। তাই আপনাকে ধন্যবাদ, এমনকি যদি এটি এই প্রশ্নের যথেষ্ট উত্তর না দেয় :)
সাইমন স্টেইনবার্গার

ভাল, আমি আনন্দিত এটি কারও সাহায্য করতে পারে!
রিচার্ড

1

আমি স্থির LAT, লং পয়েন্টের SrcRad ব্যাসার্ধের সমস্ত পয়েন্ট সাইড ইস্যু হিসাবে বাউন্ডিং বক্স সমস্যা নিয়ে কাজ করছিলাম। বেশ কয়েকটি গণনা ব্যবহার করা হয়েছে

maxLon = $lon + rad2deg($rad/$R/cos(deg2rad($lat)));
minLon = $lon - rad2deg($rad/$R/cos(deg2rad($lat)));

দ্রাঘিমাংশের সীমা গণনা করতে, তবে এটি প্রয়োজনীয় উত্তরগুলি না দেওয়ার জন্য আমি এটি পেয়েছি। কারণ আপনি যা করতে চান তা হ'ল

(SrcRad/RadEarth)/cos(deg2rad(lat))

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

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

-- GLOBAL Constants
gc_pi CONSTANT REAL := 3.14159265359;  -- Pi

-- Conversion Factor Constants
gc_rad_to_degs          CONSTANT NUMBER := 180/gc_pi; -- Conversion for Radians to Degrees 180/pi
gc_deg_to_rads          CONSTANT NUMBER := gc_pi/180; --Conversion of Degrees to Radians

lv_stat_lat    -- The static latitude point that I am searching from 
lv_stat_long   -- The static longitude point that I am searching from 

-- Angular radius ratio in radians
lv_ang_radius := lv_search_radius / lv_earth_radius;
lv_bb_maxlat := lv_stat_lat + (gc_rad_to_deg * lv_ang_radius);
lv_bb_minlat := lv_stat_lat - (gc_rad_to_deg * lv_ang_radius);

--Here's the tricky part, accounting for the Longitude getting smaller as we move up the latitiude scale
-- I seperated the parts of the equation to make it easier to debug and understand
-- I may not be a smart man but I know what the right answer is... :-)

lv_int_calc := gc_deg_to_rads * lv_stat_lat;
lv_int_calc := COS(lv_int_calc);
lv_int_calc := lv_ang_radius/lv_int_calc;
lv_int_calc := gc_rad_to_degs*lv_int_calc;

lv_bb_maxlong := lv_stat_long + lv_int_calc;
lv_bb_minlong := lv_stat_long - lv_int_calc;

-- Now select the values from your location datatable 
SELECT *  FROM (
SELECT cityaliasname, city, state, zipcode, latitude, longitude, 
-- The actual distance in miles
spherecos_pnttopntdist(lv_stat_lat, lv_stat_long, latitude, longitude, 'M') as miles_dist    
FROM Location_Table 
WHERE latitude between lv_bb_minlat AND lv_bb_maxlat
AND   longitude between lv_bb_minlong and lv_bb_maxlong)
WHERE miles_dist <= lv_limit_distance_miles
order by miles_dist
;

0

এটি খুব সহজ মাত্র প্যানোরামিও ওয়েবসাইটে যান এবং তারপরে প্যানরোমিও ওয়েবসাইট থেকে বিশ্ব মানচিত্র খুলুন open তারপরে নির্দিষ্ট স্থানে যান যা দ্রাঘিমাংশ এবং দ্রাঘিমাংশ প্রয়োজনীয়।

তারপরে আপনি এই ঠিকানাতে উদাহরণস্বরূপ অক্ষাংশ এবং দ্রাঘিমাংশ খুঁজে পেয়েছেন।

http://www.panoramio.com/map#lt=32.739485&ln=70.491211&z=9&k=1&a=1&tab=1&pl=all

lt = 32.739485 => অক্ষাংশ ln = 70.491211 => দ্রাঘিমাংশ

এই Panoramio জাভাস্ক্রিপ্ট এপিআই উইজেট ল্যাট / লম্বা জুটির চারপাশে একটি বাউন্ডিং বক্স তৈরি করে এবং তারপরে সমস্ত ফটোগুলি সেই সীমানায় ফিরিয়ে দেয়।

Panoramio জাভাস্ক্রিপ্ট এপিআই উইজেটের আর এক ধরণের যাতে আপনি উদাহরণ এবং কোড সহ পটভূমির রঙও পরিবর্তন করতে পারেন

এটি মুড রচনায় প্রদর্শিত হয় না I এটি প্রকাশের পরে শো।

<div dir="ltr" style="text-align: center;" trbidi="on">
<script src="https://ssl.panoramio.com/wapi/wapi.js?v=1&amp;hl=en"></script>
<div id="wapiblock" style="float: right; margin: 10px 15px"></div>
<script type="text/javascript">
var myRequest = {
  'tag': 'kahna',
  'rect': {'sw': {'lat': -30, 'lng': 10.5}, 'ne': {'lat': 50.5, 'lng': 30}}
};
  var myOptions = {
  'width': 300,
  'height': 200
};
var wapiblock = document.getElementById('wapiblock');
var photo_widget = new panoramio.PhotoWidget('wapiblock', myRequest, myOptions);
photo_widget.setPosition(0);
</script>
</div>

0

এখানে যদি কারও আগ্রহ থাকে তবে আমি ফেডেরিকো এ রামপোনির উত্তর পিএইচপি-তে রূপান্তর করেছি:

<?php
# deg2rad and rad2deg are already within PHP

# Semi-axes of WGS-84 geoidal reference
$WGS84_a = 6378137.0;  # Major semiaxis [m]
$WGS84_b = 6356752.3;  # Minor semiaxis [m]

# Earth radius at a given latitude, according to the WGS-84 ellipsoid [m]
function WGS84EarthRadius($lat)
{
    global $WGS84_a, $WGS84_b;

    $an = $WGS84_a * $WGS84_a * cos($lat);
    $bn = $WGS84_b * $WGS84_b * sin($lat);
    $ad = $WGS84_a * cos($lat);
    $bd = $WGS84_b * sin($lat);

    return sqrt(($an*$an + $bn*$bn)/($ad*$ad + $bd*$bd));
}

# Bounding box surrounding the point at given coordinates,
# assuming local approximation of Earth surface as a sphere
# of radius given by WGS84
function boundingBox($latitudeInDegrees, $longitudeInDegrees, $halfSideInKm)
{
    $lat = deg2rad($latitudeInDegrees);
    $lon = deg2rad($longitudeInDegrees);
    $halfSide = 1000 * $halfSideInKm;

    # Radius of Earth at given latitude
    $radius = WGS84EarthRadius($lat);
    # Radius of the parallel at given latitude
    $pradius = $radius*cos($lat);

    $latMin = $lat - $halfSide / $radius;
    $latMax = $lat + $halfSide / $radius;
    $lonMin = $lon - $halfSide / $pradius;
    $lonMax = $lon + $halfSide / $pradius;

    return array(rad2deg($latMin), rad2deg($lonMin), rad2deg($latMax), rad2deg($lonMax));
}
?>

0

ফাইটোন বাস্তবায়নের জন্য @ ফেড্রিকো এ। কে ধন্যবাদ, আমি এটিকে একটি উদ্দেশ্য সি বিভাগের শ্রেণীতে পোর্ট করেছি। এখানে:

#import "LocationService+Bounds.h"

//Semi-axes of WGS-84 geoidal reference
const double WGS84_a = 6378137.0; //Major semiaxis [m]
const double WGS84_b = 6356752.3; //Minor semiaxis [m]

@implementation LocationService (Bounds)

struct BoundsLocation {
    double maxLatitude;
    double minLatitude;
    double maxLongitude;
    double minLongitude;
};

+ (struct BoundsLocation)locationBoundsWithLatitude:(double)aLatitude longitude:(double)aLongitude maxDistanceKm:(NSInteger)aMaxKmDistance {
    return [self boundingBoxWithLatitude:aLatitude longitude:aLongitude halfDistanceKm:aMaxKmDistance/2];
}

#pragma mark - Algorithm 

+ (struct BoundsLocation)boundingBoxWithLatitude:(double)aLatitude longitude:(double)aLongitude halfDistanceKm:(double)aDistanceKm {
    double radianLatitude = [self degreesToRadians:aLatitude];
    double radianLongitude = [self degreesToRadians:aLongitude];
    double halfDistanceMeters = aDistanceKm*1000;


    double earthRadius = [self earthRadiusAtLatitude:radianLatitude];
    double parallelRadius = earthRadius*cosl(radianLatitude);

    double radianMinLatitude = radianLatitude - halfDistanceMeters/earthRadius;
    double radianMaxLatitude = radianLatitude + halfDistanceMeters/earthRadius;
    double radianMinLongitude = radianLongitude - halfDistanceMeters/parallelRadius;
    double radianMaxLongitude = radianLongitude + halfDistanceMeters/parallelRadius;

    struct BoundsLocation bounds;
    bounds.minLatitude = [self radiansToDegrees:radianMinLatitude];
    bounds.maxLatitude = [self radiansToDegrees:radianMaxLatitude];
    bounds.minLongitude = [self radiansToDegrees:radianMinLongitude];
    bounds.maxLongitude = [self radiansToDegrees:radianMaxLongitude];

    return bounds;
}

+ (double)earthRadiusAtLatitude:(double)aRadianLatitude {
    double An = WGS84_a * WGS84_a * cosl(aRadianLatitude);
    double Bn = WGS84_b * WGS84_b * sinl(aRadianLatitude);
    double Ad = WGS84_a * cosl(aRadianLatitude);
    double Bd = WGS84_b * sinl(aRadianLatitude);
    return sqrtl( ((An * An) + (Bn * Bn))/((Ad * Ad) + (Bd * Bd)) );
}

+ (double)degreesToRadians:(double)aDegrees {
    return M_PI*aDegrees/180.0;
}

+ (double)radiansToDegrees:(double)aRadians {
    return 180.0*aRadians/M_PI;
}



@end

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


0

উপরের সমস্ত উত্তর কেবল আংশিকভাবে সঠিক । বিশেষত অস্ট্রেলিয়ার মতো অঞ্চলে, তারা সর্বদা মেরু অন্তর্ভুক্ত করে এবং খুব বড় আয়তক্ষেত্র এমনকি 10 কিলোমিটারের জন্য গণনা করে।

বিশেষত জ্যান ফিলিপ মাতুশ্চেকের http://janmatuschek.de/ এ অ্যাটেলাইট লম্বিটেইডবাউন্ডিংকর্ডিনেটস # ইউসিংআইডেক্সে অ্যালগরিদম অস্ট্রেলিয়ার প্রায় প্রতিটি পয়েন্টের জন্য (-37, -90, -180, 180) থেকে একটি খুব বড় আয়তক্ষেত্র অন্তর্ভুক্ত। এটি ডাটাবেসে একটি বিশাল ব্যবহারকারীকে হিট করে এবং প্রায় অর্ধেক দেশের সমস্ত ব্যবহারকারীদের জন্য দূরত্ব গণনা করতে হয়।

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

https://www.rit.edu/drupal/api/drupal/sites%21all%21modules%21location%21earth.inc/7.54

সীমিত আয়তক্ষেত্র গণনা করার জন্য উপরের অ্যালগরিদম থেকে earth_latitude_rangeএবং ব্যবহার করুনearth_longitude_range

এবং দূরত্ব গণনা করতে গুগল ম্যাপ দ্বারা ডকুমেন্টেড দূরত্ব গণনা সূত্রটি ব্যবহার করুন

https://developers.google.com/maps/solutions/store-locator/clothing-store-locator#outputting-data-as-xml-using-php

মাইলের পরিবর্তে কিলোমিটার অনুসন্ধান করতে, 3959 প্রতিস্থাপন করুন 6371 এর সাথে (ল্যাট, এলএনজি) = (37, -122) এবং কলামগুলি ল্যাট এবং এলএনজি সহ একটি চিহ্নিতকারী টেবিল , সূত্রটি হ'ল:

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

Https://stackoverflow.com/a/45950426/5076414 এ আমার বিশদ উত্তরটি পড়ুন


0

এখানে গো ফেডেরিকো রাম্পোনির উত্তর। দ্রষ্টব্য: কোনও ত্রুটি-পরীক্ষা করা নয় :(

import (
    "math"
)

// Semi-axes of WGS-84 geoidal reference
const (
    // Major semiaxis (meters)
    WGS84A = 6378137.0
    // Minor semiaxis (meters)
    WGS84B = 6356752.3
)

// BoundingBox represents the geo-polygon that encompasses the given point and radius
type BoundingBox struct {
    LatMin float64
    LatMax float64
    LonMin float64
    LonMax float64
}

// Convert a degree value to radians
func deg2Rad(deg float64) float64 {
    return math.Pi * deg / 180.0
}

// Convert a radian value to degrees
func rad2Deg(rad float64) float64 {
    return 180.0 * rad / math.Pi
}

// Get the Earth's radius in meters at a given latitude based on the WGS84 ellipsoid
func getWgs84EarthRadius(lat float64) float64 {
    an := WGS84A * WGS84A * math.Cos(lat)
    bn := WGS84B * WGS84B * math.Sin(lat)

    ad := WGS84A * math.Cos(lat)
    bd := WGS84B * math.Sin(lat)

    return math.Sqrt((an*an + bn*bn) / (ad*ad + bd*bd))
}

// GetBoundingBox returns a BoundingBox encompassing the given lat/long point and radius
func GetBoundingBox(latDeg float64, longDeg float64, radiusKm float64) BoundingBox {
    lat := deg2Rad(latDeg)
    lon := deg2Rad(longDeg)
    halfSide := 1000 * radiusKm

    // Radius of Earth at given latitude
    radius := getWgs84EarthRadius(lat)

    pradius := radius * math.Cos(lat)

    latMin := lat - halfSide/radius
    latMax := lat + halfSide/radius
    lonMin := lon - halfSide/pradius
    lonMax := lon + halfSide/pradius

    return BoundingBox{
        LatMin: rad2Deg(latMin),
        LatMax: rad2Deg(latMax),
        LonMin: rad2Deg(lonMin),
        LonMax: rad2Deg(lonMax),
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.