মাইএসকিউএল ব্যবহার করে দূরত্বের মধ্যে পয়েন্টগুলি সন্ধান করুন


20

আমার ব্যবহারকারীর নাম, অক্ষাংশ এবং দ্রাঘিমাংশ সহ একটি মাইএসকিউএল টেবিল রয়েছে। আমি প্রদত্ত দূরত্বের সাথে প্রদত্ত অক্ষাংশ এবং দ্রাঘিমাংশের বৃত্ত বা বর্গাকার ভিতরে থাকা ব্যবহারকারীর একটি তালিকা পেতে চাই। উদাহরণস্বরূপ আমার ইনপুট ল্যাট = 78.3232 এবং দীর্ঘ = 65.3234 এবং দূরত্ব = 30 মাইল। আমি সেই ব্যবহারকারীদের তালিকা পেতে চাই যা and 65.৩২২২ এবং .3৫.৩২৩৪ পয়েন্ট থেকে ৩০ মাইল দূরত্বে রয়েছে। একক জিজ্ঞাসা দিয়ে এটি সমাধান করা সম্ভব? অথবা আপনি এই প্রশ্নের সমাধান শুরু করার জন্য আমাকে ইঙ্গিত দিতে পারেন? আমি জিও ভিত্তিক তথ্যে নতুন new


পোস্টজিআইএস কেন নয়? আপনি যদি ভূ-প্রকল্প শুরু করে থাকেন তবে আপনি এখনও নিজের স্ট্যাকটি পরিবর্তন করতে পারেন
সিমপ্লেসিও

stackoverflow.com/a/40272394/1281385 এই ক্যোয়ারীটি দ্রুত বাড়ানোর ক্ষেত্রে (যদি প্রয়োজন হয়) দরকারী হওয়া উচিত
এক্সসাম

উত্তর:


32

এসকিউএল বিবৃতিটি .3 78.৩২২২, .3 65.৩২৩৪ স্থানাঙ্ক থেকে 30 মাইল ব্যাসার্ধের মধ্যে নিকটতম 20 টি অবস্থানের সন্ধান করবে। এটি সেই সারির অক্ষাংশ / দ্রাঘিমাংশ এবং লক্ষ্য অক্ষাংশ / দ্রাঘিমাংশের ভিত্তিতে দূরত্ব গণনা করে এবং তারপরে কেবল সারিগুলির জন্য জিজ্ঞাসা করে যেখানে দূরত্বের মান 30 মাইলের চেয়ে কম হয়, পুরো ক্যোয়ারিকে দূরত্ব অনুসারে অর্ডার করে এবং 20 টি ফলাফলের মধ্যে সীমাবদ্ধ করে। মাইলের পরিবর্তে কিলোমিটার অনুসন্ধান করতে, 3959 প্রতিস্থাপন করুন 6371 দিয়ে।

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

এটি ইতিমধ্যে আপনার মাইএসকিউএল ব্যাকএন্ডের সাথে Google মানচিত্রের API v3 ব্যবহার করছে।

https://developers.google.com/maps/articles/phpsqlsearch_v3#findnearsql


এটি ব্যবহার করে আমার নির্বাচনের
বাক্যটিতে

পাওয়া গেছে: আমি lng ভেরিয়েবল খালি ছিল! দুঃখিত!
bluantinoo

ঠিক আমি যা চেয়েছিলাম ঠিক তেমনই, তবে হাজার হাজার রেকর্ডের জন্য ক্যোরির পারফরম্যান্স ওভারলোড কী? এবং কিভাবে সঠিকতা সম্পর্কে?
অমিত শাহ

1
মিটার দ্বারা অনুসন্ধানের জন্য এটি 6371392.896 এ প্রতিস্থাপন করা আরও ভাল
ভ্যাসিলি সুরিকভ

34

ম্যাপারজের উত্তরটি অবৈধ। সাইনাস অবশ্যই দ্রাঘিমাংশ থেকে এবং দ্রাঘিমাংশ থেকে নয় গণনা করা উচিত। সুতরাং কোর্ট এসকিউএল স্টেটমেন্টটি হ'ল:

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

আপনার উত্তর 1 ম অর্ডার করা উচিত।
অমিত শাহ

@AmitShah আপনি মনে করেন যে প্রশ্নকর্তা (@shihabK যারা হয়নি প্রায় 6 বছর ধরে সাইটে সক্রিয়) এবং / অথবা জন্য ভোট ping পারে যে তাহলে meta.stackexchange.com/questions/268666/...
PolyGeo

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
কেটব্যাজার

2

এটি কোনও ফাংশন তৈরির ভিত্তি হতে পারে .. যাতে আপনি এটি অন্যান্য ক্ষেত্রে পুনরায় ব্যবহার করতে পারেন। আপনার জিজ্ঞাসাটি কিছুটা পরিষ্কার করে তুলবে ... কমপক্ষে এটি আমার 2 সেন্ট।

DELIMITER $$

create function calcDistance(lat float, lng float, pnt_lat float, pnt_lng float)

Returns float
BEGIN

Declare dist float;
SET dist =
  3959 * acos (
  cos ( radians(pnt_lat) )
  * cos( radians( lat ) )
  * cos( radians( lng ) - radians(pnt_lng) )
  + sin ( radians(pnt_lat) )
  * sin( radians( lat ) )
);

RETURN dist;

END

আপনি কোডস্টাইল ঠিক করে দিলে উত্তরটি আপভোট হবে। এটি সঠিক উপায়
ভাসিলি সুরিকভ

0

এখানে আমার জিজ্ঞাসার বৈকল্পিকটি কিছুটা সহজ বলে মনে হচ্ছে ( http://dexxtr.com/post/83498801191/how-to-determine-Point-inside-circ-used-mysql )

SELECT 
    *
FROM 
    `locator`
WHERE
    SQRT(POW(X(`center`) - 49.843317 , 2) + POW(Y(`center`) - 24.026642, 2)) * 100 < `radius`

4
এটি সহজ তবে পৃথিবীটি বক্ররেখার বিষয়টিকে উপেক্ষা করে।
টিম রিজাভেক

সঠিক হতে একটি সূত্র প্রয়োজন। সম্ভবত এটি কেবল অল্প দূরত্বেই ভাল হবে: ডি
জেথ্রো

ইয়াজ একটি মিসাইল বা কিছু চালু করবে?
ডেনিস ব্রাগা

1
@DennisBraga - যদি তাই হয়, তাহলে সম্ভবত এই প্রশ্নের প্রসঙ্গ-বহির্ভূত, ভাল উপযুক্ত http://globalthermonuclearwar.stackexchange.com ...?
ashleedawg
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.