এসকিউএল কোয়েরি সহ নিকটতম অক্ষাংশ / দ্রাঘিমাংশ সন্ধান করুন


173

আমার কাছে অক্ষাংশ এবং দ্রাঘিমাংশ রয়েছে এবং আমি ডাটাবেস থেকে রেকর্ডটি টেনে আনতে চাই, যার নিকটতম অক্ষাংশ এবং দ্রাঘিমাংশ দূরত্বের সাথে রয়েছে, যদি সেই দূরত্বটি নির্দিষ্ট কোনওটির চেয়ে বেশি হয়ে যায়, তবে এটি পুনরুদ্ধার করবেন না।

টেবিল কাঠামো:

id
latitude
longitude
place name
city
country
state
zip
sealevel


1
মাইএসকিউএল (পিডিএফ লিংক) এর সাথে জিও (নৈকট্য) অনুসন্ধানে আলেকজান্ডার রুবিনের স্লাইডগুলির একটি সেট রয়েছে
মার্টিজান পিটার

উত্তর:


209
SELECT latitude, longitude, SQRT(
    POW(69.1 * (latitude - [startlat]), 2) +
    POW(69.1 * ([startlng] - longitude) * COS(latitude / 57.3), 2)) AS distance
FROM TableName HAVING distance < 25 ORDER BY distance;

যেখানে [স্টার্ল্যাট] এবং [স্টার্টলং] হ'ল অবস্থানটি যেখানে দূরত্ব পরিমাপ করা শুরু করবে।


49
কেবলমাত্র একটি পারফরম্যান্স নোট, দূরত্বের পরিবর্তনশীলটি স্কোয়ার্ট না করা বরং তার পরিবর্তে '25' পরীক্ষার মানটি বর্গাকার করা ... পরে আপনাকে যদি দূরত্বটি দেখানোর দরকার হয় তবে পাস হওয়া ফলাফলগুলিকে sqrt করুন
sradforth

9
মিটারে দূরত্বের জন্য একই কোয়েরিটি কী হবে? (যা বর্তমানে মাইলের মধ্যে রয়েছে, তাইনা?)
httpste

8
25 কি পরিমাপ হয়?
স্টিফান ডোনাল

16
এখানে শুধুমাত্র স্পষ্ট করার জন্য 69.1 হ'ল মাইল থেকে অক্ষাংশ ডিগ্রি রূপান্তর ফ্যাক্টর। 57.3 মোটামুটি 180 / পাই, তাই এটি কোজিন ফাংশনের জন্য ডিগ্রি থেকে রেডিয়ানে রূপান্তর। 25 মাইল অনুসন্ধান ব্যাসার্ধ। দশমিক ডিগ্রি এবং আইন মাইল ব্যবহার করার সময় এটি সূত্র the
জন ভ্যানস

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

63

গুগলের সমাধান:

সারণী তৈরি করা হচ্ছে

আপনি যখন মাইএসকিউএল টেবিলটি তৈরি করেন, আপনি ল্যাট এবং এলএনজি বৈশিষ্ট্যগুলিতে বিশেষ মনোযোগ দিতে চান। গুগল ম্যাপের বর্তমান জুম ক্ষমতা সহ, দশমিকের পরে আপনার কেবল 6 সংখ্যক নির্ভুলতার প্রয়োজন। আপনার টেবিলের জন্য প্রয়োজনীয় স্টোরেজ স্থানটি সর্বনিম্ন রাখতে, আপনি উল্লেখ করতে পারেন যে ল্যাট এবং এলএনজি বৈশিষ্ট্যগুলি আকারের (10,6) ভাসমান are এটি ক্ষেত্রগুলিকে দশমিকের পরে digit ডিজিট সংরক্ষণ করতে দেয় এবং দশমিকের আগে 4 অঙ্ক পর্যন্ত, যেমন -123.456789 ডিগ্রি পূর্বে। প্রাথমিক কী হিসাবে পরিবেশন করতে আপনার টেবিলটিতে একটি আইডি বৈশিষ্ট্যও থাকা উচিত।

CREATE TABLE `markers` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `name` VARCHAR( 60 ) NOT NULL ,
  `address` VARCHAR( 80 ) NOT NULL ,
  `lat` FLOAT( 10, 6 ) NOT NULL ,
  `lng` FLOAT( 10, 6 ) NOT NULL
) ENGINE = MYISAM ;

টেবিলের জনসংখ্যা

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

INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Frankie Johnnie & Luigo Too','939 W El Camino Real, Mountain View, CA','37.386339','-122.085823');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Amici\'s East Coast Pizzeria','790 Castro St, Mountain View, CA','37.38714','-122.083235');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Kapp\'s Pizza Bar & Grill','191 Castro St, Mountain View, CA','37.393885','-122.078916');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Round Table Pizza: Mountain View','570 N Shoreline Blvd, Mountain View, CA','37.402653','-122.079354');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Tony & Alba\'s Pizza & Pasta','619 Escuela Ave, Mountain View, CA','37.394011','-122.095528');
INSERT INTO `markers` (`name`, `address`, `lat`, `lng`) VALUES ('Oregano\'s Wood-Fired Pizza','4546 El Camino Real, Los Altos, CA','37.401724','-122.114646');

মাইএসকিউএল সহ লোকেশন সন্ধান করা হচ্ছে

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

এখানে এসকিউএল বিবৃতিটি নিকটস্থ 20 টি অবস্থানের সন্ধান করবে যা 37, -122 স্থানাঙ্কের 25 মাইল ব্যাসার্ধের মধ্যে রয়েছে। এটি সেই সারির অক্ষাংশ / দ্রাঘিমাংশ এবং লক্ষ্য অক্ষাংশ / দ্রাঘিমাংশের ভিত্তিতে দূরত্ব গণনা করে এবং তারপরে কেবল সারিগুলির জন্য জিজ্ঞাসা করে যেখানে দূরত্বের মান 25 এর চেয়ে কম হয়, পুরো ক্যোয়ারিকে দূরত্বে অর্ডার করে এবং 20 টি ফলাফলের মধ্যে সীমাবদ্ধ করে। মাইলের পরিবর্তে কিলোমিটার অনুসন্ধান করতে, 3959 প্রতিস্থাপন করুন 6371 দিয়ে।

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 < 28 
ORDER BY distance LIMIT 0, 20;

এটি হ'ল 28 মাইলেরও কম দূরত্বে অক্ষাংশ এবং দ্রাঘিমাংশ সন্ধান করা।

আর একটি হ'ল তাদেরকে ২৮ থেকে ২৯ মাইল দূরত্বের মধ্যে খুঁজে পাওয়া যাবে:

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 < 29 and distance > 28 
ORDER BY distance LIMIT 0, 20;

https://developers.google.com/maps/articles/phpsqlsearch_v3#creating-the-map


1
HAVING distance < 25আমরা 25 মাইল ব্যাসার্ধের মধ্যে অবস্থানগুলি জিজ্ঞাসা করার মতো এটি হওয়া উচিত ?
ভিটালি এলেনহাপ্ট

এটি> 25 হওয়া উচিত, তারপরে এটি সমস্ত রেকর্ড অনুসন্ধান করবে
vidur punj

আপনি কি> বিদুরপুঞ্জ সম্পর্কে নিশ্চিত> 25?
আমরণুর রহমান

আমি SQL কোয়েরি ব্যবহার করার চেষ্টা: দূরত্ব <25 কিন্তু কোনো ফলাফল পাওয়া যায়নি .. নমুনা চিহ্নিতকারী দূরত্বের হিসাবে সব 25 উপরে আছে ...
IbrahimShendy

37, -122 স্থানাঙ্ক, এই অক্ষাংশ এবং দ্রাঘিমাংশের অবস্থানের জন্য যেখানে আমাদের দূরত্বটি খুঁজে পাওয়া দরকার?
প্রসভ.কোল্লাতু

28

এখানে আমার সম্পূর্ণ সমাধান পিএইচপি প্রয়োগ করা হয়।

এই সমাধানটি হ্যাভারসাইন সূত্রটি http://www.scribd.com/doc/2569355/ জিও- দূরত্ব- অনুসন্ধান- MySQL- র সাথে উপস্থাপিত হিসাবে ব্যবহার করে ।

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

আমি অক্ষাংশকে ডেসিমাল (10,8) এবং দ্রাঘিমাংশকে ডেসিমাল (11,8) হিসাবে সংরক্ষণ করছি। আশা করি এটি সাহায্য করে!

showClosest.php

<?PHP
/**
 * Use the Haversine Formula to display the 100 closest matches to $origLat, $origLon
 * Only search the MySQL table $tableName for matches within a 10 mile ($dist) radius.
 */
include("./assets/db/db.php"); // Include database connection function
$db = new database(); // Initiate a new MySQL connection
$tableName = "db.table";
$origLat = 42.1365;
$origLon = -71.7559;
$dist = 10; // This is the maximum distance (in miles) away from $origLat, $origLon in which to search
$query = "SELECT name, latitude, longitude, 3956 * 2 * 
          ASIN(SQRT( POWER(SIN(($origLat - latitude)*pi()/180/2),2)
          +COS($origLat*pi()/180 )*COS(latitude*pi()/180)
          *POWER(SIN(($origLon-longitude)*pi()/180/2),2))) 
          as distance FROM $tableName WHERE 
          longitude between ($origLon-$dist/cos(radians($origLat))*69) 
          and ($origLon+$dist/cos(radians($origLat))*69) 
          and latitude between ($origLat-($dist/69)) 
          and ($origLat+($dist/69)) 
          having distance < $dist ORDER BY distance limit 100"; 
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_assoc($result)) {
    echo $row['name']." > ".$row['distance']."<BR>";
}
mysql_close($db);
?>

./assets/db/db.php

<?PHP
/**
 * Class to initiate a new MySQL connection based on $dbInfo settings found in dbSettings.php
 *
 * @example $db = new database(); // Initiate a new database connection
 * @example mysql_close($db); // close the connection
 */
class database{
    protected $databaseLink;
    function __construct(){
        include "dbSettings.php";
        $this->database = $dbInfo['host'];
        $this->mysql_user = $dbInfo['user'];
        $this->mysql_pass = $dbInfo['pass'];
        $this->openConnection();
        return $this->get_link();
    }
    function openConnection(){
    $this->databaseLink = mysql_connect($this->database, $this->mysql_user, $this->mysql_pass);
    }

    function get_link(){
    return $this->databaseLink;
    }
}
?>

./assets/db/dbSettings.php

<?php
$dbInfo = array(
    'host'      => "localhost",
    'user'      => "root",
    'pass'      => "password"
);
?>

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

আমার কাছে 17,000 ডলার জায়গাগুলির একটি ডেটাবেস রয়েছে এবং ক্যোয়ারি এক্সিকিউশন সময় 0.054 সেকেন্ড।


আমি কিমি বা মিটারগুলিতে দূরত্বটি কীভাবে অর্জন করতে পারি? শুভেচ্ছা সহ!
চেমিট্যাক্সিস

2
মাইল * 1.609344 = কিলোমিটার
সিনান ডিজডারেভিć

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

1
এবং যে কেউ মিটারে এটি চায়: 3956 মাইল কিলোমিটারে রূপান্তর করুন: পৃথিবীর ব্যাসার্ধ; 69 মাইল কিলোমিটার রূপান্তর করুন: কিমি মধ্যে 1 ডিগ্রী অক্ষাংশের aproxímate দৈর্ঘ্য; এবং কিলোমিটার মধ্যে দূরত্ব ইনপুট।
চাংগো

1
এবং প্রতিস্থাপন 69সঙ্গে 111,044736(ভুলে গেছি যে উপরে মন্তব্য)
rkeet

24

আপনি যদি আমার মতো অলস হন তবে এখানে একটি সমাধান একত্রিত হয়েছে এবং এসও-র অন্যান্য উত্তরগুলি।

set @orig_lat=37.46; 
set @orig_long=-122.25; 
set @bounding_distance=1;

SELECT
*
,((ACOS(SIN(@orig_lat * PI() / 180) * SIN(`lat` * PI() / 180) + COS(@orig_lat * PI() / 180) * COS(`lat` * PI() / 180) * COS((@orig_long - `long`) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS `distance` 
FROM `cities` 
WHERE
(
  `lat` BETWEEN (@orig_lat - @bounding_distance) AND (@orig_lat + @bounding_distance)
  AND `long` BETWEEN (@orig_long - @bounding_distance) AND (@orig_long + @bounding_distance)
)
ORDER BY `distance` ASC
limit 25;

1
ঠিক কি bounding_distanceপ্রতিনিধিত্ব করে? এই মান ফলাফল একটি মাইল পরিমাণ সীমাবদ্ধ করে? তাহলে এক্ষেত্রে এটি 1 মাইলের মধ্যে ফলাফল ফিরিয়ে দেবে?
জেমস

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

1
এটি কোন ভৌগলিক দূরত্বের সূত্রটি ব্যবহার করছে?
bbodenmiller

12

সহজ একটি;)

SELECT * FROM `WAYPOINTS` W ORDER BY
ABS(ABS(W.`LATITUDE`-53.63) +
ABS(W.`LONGITUDE`-9.9)) ASC LIMIT 30;

আপনার প্রয়োজনীয়গুলি সহ স্থানাঙ্কগুলি প্রতিস্থাপন করুন। মানগুলি দ্বিগুণ হিসাবে সংরক্ষণ করতে হবে। এটি একটি কার্যকারী MySQL 5.x উদাহরণ।

চিয়ার্স


2
আপত্তি কেন নয়, ওপি নির্দিষ্ট দুরত্বের মাধ্যমে সীমাবদ্ধ করতে এবং অর্ডার করতে চায়, 30 দ্বারা সীমাবদ্ধ না করে অর্ডার করতে হবেdx+dy
Okm

3
এটা আমার জন্য এটি। ওপি যা চেয়েছিল তা নয়, আমি যা চেয়েছিলাম তা তাই, উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ! :)
ওয়েবমাস্টার জি

বাইরেরতম এবিএস () যথেষ্ট।
dzona

6

এটি ব্যবহার করে দেখুন, এটি প্রদত্ত স্থানাঙ্কগুলির নিকটতম পয়েন্টগুলি দেখায় (50 কিলোমিটারের মধ্যে)। এটি নিখুঁতভাবে কাজ করে:

SELECT m.name,
    m.lat, m.lon,
    p.distance_unit
             * DEGREES(ACOS(COS(RADIANS(p.latpoint))
             * COS(RADIANS(m.lat))
             * COS(RADIANS(p.longpoint) - RADIANS(m.lon))
             + SIN(RADIANS(p.latpoint))
             * SIN(RADIANS(m.lat)))) AS distance_in_km
FROM <table_name> AS m
JOIN (
      SELECT <userLat> AS latpoint, <userLon> AS longpoint,
             50.0 AS radius, 111.045 AS distance_unit
     ) AS p ON 1=1
WHERE m.lat
BETWEEN p.latpoint  - (p.radius / p.distance_unit)
    AND p.latpoint  + (p.radius / p.distance_unit)
    AND m.lon BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
    AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
ORDER BY distance_in_km

শুধু পরিবর্তন <table_name><userLat>এবং<userLon>

আপনি এই সমাধান সম্পর্কে এখানে আরও পড়তে পারেন: http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/


6

প্রশ্নের মূল উত্তরগুলি ভাল, তবে মাইএসকিএল (মাইএসকিউএল 5.7.6 অন) এর নতুন সংস্করণগুলি জিও কোয়েরিগুলিকে সমর্থন করে, তাই আপনি এখন জটিল প্রশ্নগুলি না করে কার্যক্ষমতায় বিল্ট ব্যবহার করতে পারেন।

আপনি এখন এর মতো কিছু করতে পারেন:

select *, ST_Distance_Sphere( point ('input_longitude', 'input_latitude'), 
                              point(longitude, latitude)) * .000621371192 
          as `distance_in_miles` 
  from `TableName`
having `distance_in_miles` <= 'input_max_distance'
 order by `distance_in_miles` asc

metersআপনি যদি KMমাইল .0001পরিবর্তে মাইল ব্যবহার না করে চান তবে ফলাফলগুলি এখানে ফিরে আসে.000621371192

মাইএসকিউএল ডক্স এখানে রয়েছে


যদি সম্ভব হয় তবে উত্তরে mysql সংস্করণ যুক্ত করুন।
পরীক্ষিত

ST_Distance_Sphereআমার হোস্টের ইনস্টল ( mysql Ver 15.1 Distrib 10.2.23-MariaDB) এ উপস্থিত নেই। আমি বিকল্পে কোথাও পড়েছি ST_Distanceতবে দূরত্বগুলি বন্ধ।
অ্যাশলেডগ

@ অ্যাশলিডগ - সংস্করণ থেকে, আমি মনে করি আপনি মারিয়াডিবি ব্যবহার করছেন, এটি মাইএসকিএলের একটি কাঁটাচামচ। এই কথোপকথন থেকে দেখে মনে হচ্ছে মারিয়াডিবি বাস্তবায়িত হয়নিST_Distance_Sphere
শেরম্যান

5

আপনি haversine সূত্র মত জিনিস খুঁজছেন । এখানেও দেখুন ।

অন্যগুলি রয়েছে তবে এটি সর্বাধিক উল্লেখ করা হয়।

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


এটি প্রকৃতপক্ষে সর্বাধিক উদ্ধৃত হয়, তবে অন্যান্য পদ্ধতিগুলি ব্যবহার করে ভুল কম্পিউটারিংয়ের বিবৃতি দেওয়ার ক্ষেত্রে অনেকগুলি নিবন্ধ পুরানো কম্পিউটিং হার্ডওয়্যারকে বোঝায়। অস্থাবর-type.co.uk/scriptts/latlong.html#cosine-law
আরজান

4

মাইএসকিউএল-সহ জিও-দূরত্ব-অনুসন্ধান নিবন্ধের ভিত্তিতে এই কোডটি পরীক্ষা করুন :

উদাহরণ: 10 মাইল ব্যাসার্ধে আমার বর্তমান অবস্থানে নিকটস্থ 10 টি হোটেল সন্ধান করুন:

#Please notice that (lat,lng) values mustn't be negatives to perform all calculations

set @my_lat=34.6087674878572; 
set @my_lng=58.3783670308302;
set @dist=10; #10 miles radius

SELECT dest.id, dest.lat, dest.lng,  3956 * 2 * ASIN(SQRT(POWER(SIN((@my_lat -abs(dest.lat)) * pi()/180 / 2),2) + COS(@my_lat * pi()/180 ) * COS(abs(dest.lat) *  pi()/180) * POWER(SIN((@my_lng - abs(dest.lng)) *  pi()/180 / 2), 2))
) as distance
FROM hotel as dest
having distance < @dist
ORDER BY distance limit 10;

#Also notice that distance are expressed in terms of radius.

3
simpledb.execSQL("CREATE TABLE IF NOT EXISTS " + tablename + "(id INTEGER PRIMARY KEY   AUTOINCREMENT,lat double,lng double,address varchar)");
            simpledb.execSQL("insert into '" + tablename + "'(lat,lng,address)values('22.2891001','70.780154','craftbox');");
            simpledb.execSQL("insert into '" + tablename + "'(lat,lng,address)values('22.2901396','70.7782428','kotecha');");//22.2904718 //70.7783906
            simpledb.execSQL("insert into '" + tablename + "'(lat,lng,address)values('22.2863155','70.772108','kkv Hall');");
            simpledb.execSQL("insert into '" + tablename + "'(lat,lng,address)values('22.275993','70.778076','nana mava');");
            simpledb.execSQL("insert into '" + tablename + "'(lat,lng,address)values('22.2667148','70.7609386','Govani boys hostal');");


    double curentlat=22.2667258;  //22.2677258
    double curentlong=70.76096826;//70.76096826

    double curentlat1=curentlat+0.0010000;
    double curentlat2=curentlat-0.0010000;

    double curentlong1=curentlong+0.0010000;
    double curentlong2=curentlong-0.0010000;

    try{

        Cursor c=simpledb.rawQuery("select * from '"+tablename+"' where (lat BETWEEN '"+curentlat2+"' and '"+curentlat1+"') or (lng BETWEEN         '"+curentlong2+"' and '"+curentlong1+"')",null);

        Log.d("SQL ", c.toString());
        if(c.getCount()>0)
        {
            while (c.moveToNext())
            {
                double d=c.getDouble(1);
                double d1=c.getDouble(2);

            }
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

2

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


2

আমার নিকটতম ব্যবহারকারীদের সন্ধান করুন:

মিটারে দূরত্ব

ভিনসেন্টির সূত্রে ভিত্তি করে

আমার ব্যবহারকারীর টেবিল রয়েছে:

+----+-----------------------+---------+--------------+---------------+
| id | email                 | name    | location_lat | location_long |
+----+-----------------------+---------+--------------+---------------+
| 13 | xxxxxx@xxxxxxxxxx.com | Isaac   | 17.2675625   | -97.6802361   |
| 14 | xxxx@xxxxxxx.com.mx   | Monse   | 19.392702    | -99.172596    |
+----+-----------------------+---------+--------------+---------------+

SQL:

-- my location:  lat   19.391124   -99.165660
SELECT 
(ATAN(
    SQRT(
        POW(COS(RADIANS(users.location_lat)) * SIN(RADIANS(users.location_long) - RADIANS(-99.165660)), 2) +
        POW(COS(RADIANS(19.391124)) * SIN(RADIANS(users.location_lat)) - 
       SIN(RADIANS(19.391124)) * cos(RADIANS(users.location_lat)) * cos(RADIANS(users.location_long) - RADIANS(-99.165660)), 2)
    )
    ,
    SIN(RADIANS(19.391124)) * 
    SIN(RADIANS(users.location_lat)) + 
    COS(RADIANS(19.391124)) * 
    COS(RADIANS(users.location_lat)) * 
    COS(RADIANS(users.location_long) - RADIANS(-99.165660))
 ) * 6371000) as distance,
users.id
FROM users
ORDER BY distance ASC

পৃথিবীর ব্যাসার্ধ: 6371000 (মিটারে)


1

এমএস এসকিউএল সংস্করণ এখানে:

        DECLARE @SLAT AS FLOAT
        DECLARE @SLON AS FLOAT

        SET @SLAT = 38.150785
        SET @SLON = 27.360249

        SELECT TOP 10 [LATITUDE], [LONGITUDE], SQRT(
            POWER(69.1 * ([LATITUDE] - @SLAT), 2) +
            POWER(69.1 * (@SLON - [LONGITUDE]) * COS([LATITUDE] / 57.3), 2)) AS distance
        FROM [TABLE] ORDER BY 3

0

আপনি যেমন পোস্টজিআইএস, স্পটালালাইট, এসকিউএল সার্ভার2008, বা ওরাকল স্পেশিয়াল ব্যবহার করবেন এমন মনে হচ্ছে। তারা সকলেই আপনার জন্য স্থানিক এসকিউএল দিয়ে এই প্রশ্নের উত্তর দিতে পারে।


7
মনে হচ্ছে আপনার যেন এমন পরামর্শ দেওয়া উচিত নয় যে লোকেরা তাদের পুরো ডাটাবেস প্ল্যাটফর্মটি স্যুইচ করে এবং অপ্রাসঙ্গিক ফলাফলগুলি আমার গুগল অনুসন্ধানে প্রদর্শিত হয় যখন আমি স্পষ্টভাবে "ওরাকল" অনুসন্ধান
করি

0

চরম ক্ষেত্রে এই পন্থা ব্যর্থ হয়, তবে কার্য সম্পাদনের জন্য, আমি ত্রিকোণমিতি এড়িয়ে গিয়ে কেবল তির্যক বর্গক্ষেত্র গণনা করেছি।


-13

এই সমস্যাটি মোটেই খুব কঠিন নয়, তবে আপনার যদি এটির অপটিমাইজ করার প্রয়োজন হয় তবে এটি আরও জটিল হয়ে ওঠে।

আমার অর্থ হ'ল, আপনার ডাটাবেসে 100 টি অবস্থান আছে বা 100 মিলিয়ন? এটি একটি বড় পার্থক্য করে।

যদি জায়গাগুলির সংখ্যা কম হয় তবে সেগুলি এসকিউএল থেকে বের করে এবং কোডে সবেমাত্র -> করে get

Select * from Location

আপনি সেগুলি কোডে আনার পরে, প্রতিটি লেট / লোন এবং হ্যাভারসাইন সূত্রের সাহায্যে আপনার মূলের মধ্যে দূরত্ব গণনা করুন এবং এটি বাছাই করুন।

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