
Haversine Formula (PHP, JavaScript, Java, Python, MySQL, MSSQL مثال) استعمال ڪندي ويڪرائي ڦاڪ ۽ ڊگھائي جي پوائنٽن جي وچ ۾ وڏي دائري جي فاصلي جي حساب ڪريو يا پڇو
هن مهيني ۾ آئون پروگرامنگ ڪري رهيو آهيان پي PHP حفاظتي ۽ هن MySQL جي حوالي سان GIS. نيٽ جي چوڌاري ڇڪڻ، مون کي اصل ۾ ڪجهه ڳولڻ ۾ مشڪل هئي جاگرافيائي حساب ٻن جڳهن جي وچ ۾ فاصلو ڳولڻ لاءِ انهي ڪري مون انهن کي هتي شيئر ڪرڻ چاهيو.

ٻن نقطن جي مفاصلي کي طئي ڪرڻ جو سادو طريقو پيٿاگورين فارمولا استعمال ڪري رهيو آهي ته هڪ مثلث جي هائپوٽوزس (A² + B² = C²) جي حساب سان. هي سڃاتو وڃي ٿو ايليڊين جو مفاصلو.
اها هڪ دلچسپ شروعات آهي پر اهو جغرافيائي تي لاڳو نٿو ٿئي ڇو ته ويڪرائي ڦاڪ ۽ ڊگھائي لڪيرن جي وچ ۾ فاصلو برابر نه آهن. جيئن توهان خط استوا جي ويجھو وڃو، ويڪرائي ڦاڪ جون لائينون وڌيڪ ڌار ٿي وينديون. جيڪڏهن توهان هڪ سادي ٽڪنڊي جي مساوات استعمال ڪريو ٿا، اهو ٿي سگهي ٿو فاصلي کي هڪ هنڌ تي صحيح ۽ ٻئي ۾ غلط، ڇاڪاڻ ته ڌرتيء جي وکر جي ڪري.
عظيم سرڪل جو مفاصلو
ڌرتيءَ جي چوڌاري ڊگھي فاصلي تي سفر ڪرڻ وارا رستا Great Circle Distance سڏجن ٿا. اهو آهي… هڪ گولي تي ٻن پوائنٽن جي وچ ۾ ننڍو فاصلو هڪ فليٽ نقشي جي پوائنٽن کان مختلف آهي. انهي حقيقت سان گڏ ڪريو ته ويڪرائي ڦاڪ ۽ ڊگھائي لڪيرون برابر نه آهن... ۽ توهان کي هڪ ڏکيو حساب مليو آهي.
هتي شاندار وڊيو وضاحت آهي هتي بهترين حلقن جو ڪهڙو ڪم ڪار آهي.
هوورزين جو فارمولا
ڌرتيء جي وکر کي استعمال ڪندي فاصلو Haversine فارمولا ۾ شامل ڪيو ويو آهي، جيڪو ڌرتيء جي گھمڻ جي اجازت ڏيڻ لاء ٽريگونوميٽري استعمال ڪري ٿو. جڏهن توهان ڌرتيءَ تي 2 هنڌن جي وچ ۾ فاصلو ڳولي رهيا آهيو (جيئن ڪانو اڏامي ٿو)، هڪ سڌي لڪير اصل ۾ هڪ قوس آهي.
اهو لاڳو ٿئي ٿو هوائي اڏام ۾ - ڇا توهان ڪڏهن ڏٺو آهي اصل نقشي جي اڏام ۽ محسوس ڪيو آهي ته اهي محراب آهن؟ اهو ئي سبب آهي ته ٻن نقطن جي وچ ۾ هڪ محراب ۾ اڏام سڌو هنڌ کان ننڍو آهي.
پي ايڇ پي: طول ۽ طول بلد جي 2 پوائنٽن جي وچ ۾ فاصلو حساب ڪريو
ھتي آھي PHP فارمولا ٻن پوائنٽن جي وچ ۾ فاصلي کي ڳڻڻ لاءِ (ميل بمقابلہ ڪلوميٽر جي تبادلي سان گڏ) ٻن ڏھين جڳھن تي گول ڪيو ويو آھي.
function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'miles') {
$theta = $longitude1 - $longitude2;
$distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)));
$distance = acos($distance);
$distance = rad2deg($distance);
$distance = $distance * 60 * 1.1515;
switch($unit) {
case 'miles':
break;
case 'kilometers' :
$distance = $distance * 1.609344;
}
return (round($distance,2));
}
متغير آهن:
- $Latitude1 - توهان جي پهرين جڳهه جي ويڪرائي ڦاڪ لاءِ هڪ متغير.
- $Dongitude1 - توهان جي پهرين جڳهه جي ڊگھائي لاء هڪ متغير
- $Latitude2 - توهان جي ٻئي هنڌ جي ويڪرائي ڦاڪ لاءِ هڪ متغير.
- $Dongitude2 - توهان جي ٻئي هنڌ جي ڊگھائي لاء هڪ متغير.
- $يونٽ - ڊفالٽ وجود هزارين. هي اپڊيٽ يا منظور ڪري سگهجي ٿو جيئن ڪلوميٽر.
جاوا: 2 پوائنٽس جي ويڪرائي ڦاڪ ۽ ڊگھائي جي وچ ۾ فاصلو حساب ڪريو
public static double getDistanceBetweenPointsNew(double latitude1, double longitude1, double latitude2, double longitude2, String unit) {
double theta = longitude1 - longitude2;
double distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) +
Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
);
if (unit.equals("miles")) {
return Math.round(distance, 2);
} else if (unit.equals("kilometers")) {
return Math.round(distance * 1.609344, 2);
} else {
return 0;
}
}
متغير آهن:
- ويڪرائي ڦاڪ1 - توهان جي پهرين جڳهه جي ويڪرائي ڦاڪ لاءِ هڪ متغير.
- ڊگھائي 1 - توهان جي پهرين جڳهه جي ڊگھائي لاء هڪ متغير
- ويڪرائي ڦاڪ2 - توهان جي ٻئي هنڌ جي ويڪرائي ڦاڪ لاءِ هڪ متغير.
- ڊگھائي 2 - توهان جي ٻئي هنڌ جي ڊگھائي لاء هڪ متغير.
- يونٽ - ڊفالٽ وجود هزارين. هي اپڊيٽ يا منظور ڪري سگهجي ٿو جيئن ڪلوميٽر.
جاوا اسڪرپٽ: 2 پوائنٽس جي ويڪرائي ڦاڪ ۽ ڊگھائي جي وچ ۾ فاصلو حساب ڪريو
function getDistanceBetweenPoints(latitude1, longitude1, latitude2, longitude2, unit = 'miles') {
let theta = longitude1 - longitude2;
let distance = 60 * 1.1515 * (180/Math.PI) * Math.acos(
Math.sin(latitude1 * (Math.PI/180)) * Math.sin(latitude2 * (Math.PI/180)) +
Math.cos(latitude1 * (Math.PI/180)) * Math.cos(latitude2 * (Math.PI/180)) * Math.cos(theta * (Math.PI/180))
);
if (unit == 'miles') {
return Math.round(distance, 2);
} else if (unit == 'kilometers') {
return Math.round(distance * 1.609344, 2);
}
}
متغير آهن:
- ويڪرائي ڦاڪ1 - توهان جي پهرين جڳهه جي ويڪرائي ڦاڪ لاءِ هڪ متغير.
- ڊگھائي 1 - توهان جي پهرين جڳهه جي ڊگھائي لاء هڪ متغير
- ويڪرائي ڦاڪ2 - توهان جي ٻئي هنڌ جي ويڪرائي ڦاڪ لاءِ هڪ متغير.
- ڊگھائي 2 - توهان جي ٻئي هنڌ جي ڊگھائي لاء هڪ متغير.
- يونٽ - ڊفالٽ وجود هزارين. هي اپڊيٽ يا منظور ڪري سگهجي ٿو جيئن ڪلوميٽر.
Python: 2 پوائنٽس جي ويڪرائي ڦاڪ ۽ ڊگھائي جي وچ ۾ فاصلو حساب ڪريو
بهرحال، هتي ٻن پوائنٽن جي وچ ۾ فاصلي کي ڳڻڻ لاءِ پٿون فارمولا آهي (ميل بمقابله ڪلوميٽر جي تبادلي سان گڏ) ٻن ڏهاڪن تائين گول ڪيو ويو آهي. منهنجي پٽ کي ڪريڊٽ، بل ڪرر جيڪو هڪ ڊيٽا سائنسدان آهي OpenINSIGHTS، ڪوڊ لاءِ.
from numpy import sin, cos, arccos, pi, round
def rad2deg(radians):
degrees = radians * 180 / pi
return degrees
def deg2rad(degrees):
radians = degrees * pi / 180
return radians
def getDistanceBetweenPointsNew(latitude1, longitude1, latitude2, longitude2, unit = 'miles'):
theta = longitude1 - longitude2
distance = 60 * 1.1515 * rad2deg(
arccos(
(sin(deg2rad(latitude1)) * sin(deg2rad(latitude2))) +
(cos(deg2rad(latitude1)) * cos(deg2rad(latitude2)) * cos(deg2rad(theta)))
)
)
if unit == 'miles':
return round(distance, 2)
if unit == 'kilometers':
return round(distance * 1.609344, 2)
متغير آهن:
- ويڪرائي ڦاڪ1 - توهان جي پهرين جڳهه لاء هڪ متغير طول و عرض.
- ڊگھائي 1 - توهان جي پهرين جڳهه لاء هڪ متغير ڊگھائي
- ويڪرائي ڦاڪ2 - توهان جي ٻئي هنڌ لاء هڪ متغير طول و عرض.
- ڊگھائي 2 - توهان جي ٻئي هنڌ لاء هڪ متغير ڊگھائي.
- يونٽ - ڊفالٽ وجود هزارين. هي اپڊيٽ يا منظور ڪري سگهجي ٿو جيئن ڪلوميٽر.
MySQL: ويڪرائي ڦاڪ ۽ ڊگھائي استعمال ڪندي ميلن ۾ فاصلي جي حساب سان هڪ حد اندر سڀ رڪارڊ حاصل ڪرڻ
اهو پڻ ممڪن آهي SQL استعمال ڪرڻ لاءِ هڪ مخصوص فاصلي ۾ سڀني رڪارڊن کي ڳڻڻ لاءِ. هن مثال ۾، مان MySQL ۾ MyTable کان پڇڻ وارو آهيان انهن سڀني رڪارڊن کي ڳولڻ لاءِ جيڪي متغير $distance (ميل ۾) کان گهٽ يا برابر آهن منهنجي جڳهه تي $latitude ۽ $longitude:
سڀ رڪارڊ کي خاص ۾ واپس آڻڻ جي لاءِ سوال فاصلي ڊيگهه ۽ طول و عرض جي ٻن پوائنٽن جي وچ ۾ ميلن ۾ مفاصلو طئي ڪندي:
$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`)*pi()/180)))) * 180/pi()) * 60 * 1.1515) as distance FROM `table` WHERE distance <= ".$distance."
توهان کي انهي کي ترتيب ڏيڻ جي ضرورت پوندي.
- $ ڊگھائي - هي پي ايڇ پي جو متحرڪ آهي جتي آئون پوائنٽ جي ڊگھائي گذاري رهيو آهيان.
- $ طول و عرض - هي پي ايڇ پي جو متحرڪ آهي جتي آئون پوائنٽ جي ڊگھائي گذاري رهيو آهيان.
- $ فاصلو - هي اهو مفاصلو آهي جنهن کي توهان سڀني ريڪارڊ گهٽ يا برابر ڳولڻ چاهيندا.
- ميز - هي ٽيبل آهي… توهان ان کي پنهنجي ٽيبل نالي سان مٽائڻ چاهيندا.
- طول و عرض - اهو توهان جي طوالت جو ميدان آهي.
- ڊگھائي - اهو توهان جي ڊگهائپ جو ميدان آهي.
MySQL: ويڪرائي ڦاڪ ۽ ڊگھائي استعمال ڪندي ڪلوميٽرن ۾ فاصلي جي حساب سان هڪ حد اندر سڀ رڪارڊ حاصل ڪرڻ
۽ هتي منهنجي ايس ايس ايل ۾ ڪلوميٽر استعمال ڪندي SQL سوال آهي:
$query = "SELECT *, (((acos(sin((".$latitude."*pi()/180)) * sin((`latitude`*pi()/180)) + cos((".$latitude."*pi()/180)) * cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`) * pi()/180)))) * 180/pi()) * 60 * 1.1515 * 1.609344) as distance FROM `table` WHERE distance <= ".$distance."
توهان کي انهي کي ترتيب ڏيڻ جي ضرورت پوندي.
- $ ڊگھائي - هي پي ايڇ پي جو متحرڪ آهي جتي آئون پوائنٽ جي ڊگھائي گذاري رهيو آهيان.
- $ طول و عرض - هي پي ايڇ پي جو متحرڪ آهي جتي آئون پوائنٽ جي ڊگھائي گذاري رهيو آهيان.
- $ فاصلو - هي اهو مفاصلو آهي جنهن کي توهان سڀني ريڪارڊ گهٽ يا برابر ڳولڻ چاهيندا.
- ميز - هي ٽيبل آهي… توهان ان کي پنهنجي ٽيبل نالي سان مٽائڻ چاهيندا.
- طول و عرض - اهو توهان جي طوالت جو ميدان آهي.
- ڊگھائي - اهو توهان جي ڊگهائپ جو ميدان آهي.
مون انٽرنيشنل ميپنگ پليٽ فارم ۾ اهو ڪوڊ استعمال ڪيو جيڪو اسان اتر آمريڪا جي 1,000،XNUMX هنڌن سان پرچون اسٽور جي لاءِ استعمال ڪيو ۽ اهو سهڻي نموني ڪم ڪيو.
Microsoft SQL سرور جاگرافيائي فاصلو: STDistance
جيڪڏھن توھان استعمال ڪري رھيا آھيو Microsoft SQL Server، اھي پيش ڪن ٿا پنھنجو فنڪشن، ايس ٽي ڊي فاصلو جغرافيائي ڊيٽا جي قسم کي استعمال ڪندي ٻن پوائنٽن جي وچ ۾ فاصلو ڳڻڻ لاء.
DECLARE @g geography;
DECLARE @h geography;
SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326);
SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326);
SELECT @g.STDistance(@h);
منش ساهو، وي پي ۽ آرڪيٽيڪٽ آف کي ٽوپي ٽپ Highbridge.
شيئر ڪرڻ لاء توهان جي وڏي مهرباني. هي هڪ آسان ڪاپي ۽ پيسٽ نوڪري هئي ۽ عظيم ڪم ڪري ٿي. توهان مون کي گهڻو وقت بچايو آهي.
ايف آءِ جي لاءِ ڪنهن کي بندرگاهه ڪرڻ لاءِ:
ٻٽي deg2rad (ٻٽي deg) {واپسي deg * (3.14159265358979323846 / 180.0) ؛ }
پوسٽنگ جو تمام سٺو ٽڪرو - تمام سٺو ڪم ڪيو - مون کي صرف ڊگهو ڊگهو رکڻ واري ٽيبل جو نالو تبديل ڪرڻو هو. اهو تمام تيز ڪم ڪندو آهي .. مون وٽ ڪافي ڊگهو ڊگهو آهي (<400) پر مان سمجهان ٿو ته اهو بهتر نموني سان ٿيندو. سٺي سائيٽ پڻ - مون صرف هن کي پنهنجي del.icio.us اڪائونٽ ۾ شامل ڪيو آهي ۽ باقاعدگي سان واپس چيڪ ڪندس.
تمام گھڻو مهرباني پيٽر ۽ ڪيري! جيڪڏهن توهان GIS منصوبن تي ڪم ڪرڻ چاهيو ٿا، آئون سفارش ڪندس:
توهان جي وڏي مهرباني… 😀
مون س dayو ڏينهن فاصلو جي حساب سان ڳولي ورتو ۽ هاروريس الگورٿم ڏٺائين ، توهان کي ايس سي ايل بيان ۾ رکڻ بابت مثال ڏيڻ جي مهرباني. مهرباني ۽ سلام ، دانيال
مدد ڪرڻ تي خوشي ٿي ، ريلز دوست!
ھاڻي مان آھيان ھڪڙي 'گھڻائي واري حصي ۾' پي ايڇ پي جي فنڪشن جي جيڪو طول و عرض ۽ طول بلد جي طول و عرض کي ترتيب وٺي ٿو ۽ figureاڻيو ٿو ته ڪو ٻيو نڪتو پولي جي اندر يا ٻاهر آهي.
مون کي مليو اهو gاڻڻ لاءِ مساوات جيڪڏهن ڪولگون ۾ هڪ نقطو آهي!
مان سمجهان ٿو ته توهان جي SQL ڪنهن بيان جي ضرورت آهي.
WHERE فاصلي جي بدران <= $ مفاصلو جيڪو توهان کي ضرورت ٿي سگهي ٿي
HAVING فاصلو استعمال ڪريو <= $ مفاصلو
ٻي صورت ۾ مون کي وقت ۽ توانائي جو هڪ حصو بچائڻ جي مهرباني.
ايم ڪيو ايم،
جيڪڏهن توهان ڪنهن به قسم جي GROUP BY بيان ڪري رهيا آهيو، توهان کي هئڻ جي ضرورت پوندي. مان اهو نه ڪري رهيو آهيان مٿين مثال ۾.
Doug
MySQL 5.x جي طور تي ، توهان WHERE شق ڏسو تي عرف استعمال نٿا ڪري سگھو http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
مٿي ڏنل سوالن ۾ هيڏانهن بدران بدران HAVING استعمال ڪريو
توهان جي وڏي مهرباني. تون عظيم ڪم ڪيو آهي اهو ئي آهي جيڪو مان اصل ۾ چاهيان ٿو. وڏي وڏي مهرباني.
هن ڪوڊ کي حصيداري ڪرڻ لاء تمام گهڻو مهرباني. اهو مون کي تمام گهڻو ترقي وقت بچايو. انهي سان گڏ، توهان جي پڙهندڙن جي مهرباني جو اشارو ڪيو ويو آهي ته هڪ HAVING بيان MySQL 5.x لاء ضروري آهي. تمام مددگار.
مون کي خوشي ٿي آهي ته پڙهندڙن جو مون کان وڌيڪ ذهين آهي.
🙂
مٿي ڏنل فارمولا مون کي گهڻو وقت بچائي رهيو آهي. توهان جي وڏي مهرباني.
مون کي پڻ NMEA فارميٽ ۽ درجي جي وچ ۾ سوئچ ڪرڻو پوندو. مون کي هڪ فارمولا مليو هن URL تي صفحي جي تري ۾. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
ڇا ڪنهن کي خبر آهي ته انهي جي تصديق ڪيئن ڪجي؟
توهان جي مهرباني!
هيري
سلام،
ٻيو سوال. ڇا ھيٺ ڏنل ھڪڙي وانگر NMEA اسٽرنگ لاء ھڪڙو فارمولا آھي؟
1342.7500 ، اين ، 10052.2287 ، اي
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
مهرباني،
هيري
مون کي اهو به معلوم ٿيو ته WHERE مون لاء ڪم نه ڪيو. ان کي HAVING ۾ تبديل ڪيو ۽ هر شي مڪمل ڪم ڪري ٿي. پهرين ته مون تبصرا نه پڙهيا هئا ۽ ان کي ٻيهر لکيو آهي هڪ nested چونڊ استعمال ڪندي. ٻئي ٺيڪ ڪم ڪندا.
وڏي مهرباني ڪري منهنجي اسڪرال ۾ لکيل رسم الخط جي لاءِ ، صرف ڪجهه نن adjustڙيون اصلاحون ڪرڻيون هيون (HAVING) 🙂
نوڪري حاصل ڪريو
ناقابل يقين حد مددگار ، توهان جي وڏي مهرباني! مون کي "ڪيڏانهن" جي بدران نئين "HAVING" سان ڪجهه مسئلا ٿي رهيا هئا ، پر هڪ ڀيرو مون هتي تبصرو پڙهيو (مايوسي ۾ = ڏند ڪلاڪ پيسڻ کان پوءِ مايوس = پي) ، مون انهي کي سٺي نموني ڪم ڪيو. توهان جي مهرباني _ _ ^
مهرباني تمام سٺو ڪم ڪيو
ياد رهي ته هڪ منتخب بيان جهڙوڪ ته تمام گهڻو ڳجهو هوندو ۽ تنهنڪري سستي. جيڪڏهن توهان وٽ اهي گهڻا سوال آهن ، اهو تڪڙو شيون ٿي سگهي ٿو.
هڪ تمام گهٽ شديد طريقو اهو آهي ته پهريون (خام) چونڊيو هڪ چورس ايريا استعمال ڪندي جيڪو حساب ڪيل فاصلي سان بيان ڪيو ويو آهي يعني ”چونڊيو * ٽيبل جي نالي مان جتي ويڪرائي ڦاڪ lat1 ۽ lat2 جي وچ ۾ ۽ ڊگھائي lon1 ۽ lon2 جي وچ ۾“. lat1 = targetlatitude - latdiff، lat2 = targetlatitude + latdiff، lon سان ملندڙ جلندڙ. latdiff ~= مفاصلو / 111 (ڪلوميٽر لاءِ)، يا مفاصلو/69 ميلن لاءِ 1 ڊگري ويڪرائي ڦاڪ کان وٺي ~ 111 ڪلوميٽر آهي (ٿوري ڦيرڦار ڇاڪاڻ ته زمين ٿوري اوول آهي، پر هن مقصد لاءِ ڪافي آهي). londiff = مفاصلو / (abs(cos(deg2rad(latitude))*111)) - يا 69 ميلن لاءِ (توهان اصل ۾ ٿورو وڏو چورس وٺي سگهو ٿا تغيرات جي حساب سان). پوء ان جو نتيجو وٺو ۽ ان کي ريڊيل چونڊ ۾ فيڊ ڪريو. صرف حد کان ٻاهر جي همراهن جو حساب ڪرڻ نه وساريو - يعني قابل قبول ڊگھائي جي حد -180 کان +180 آهي ۽ قابل قبول ويڪرائي ڦاڪ جي حد -90 کان +90 آهي - جيڪڏهن توهان جو latdiff يا londiff هن حد کان ٻاهر هلن ٿا. . ياد رهي ته اڪثر ڪيسن ۾ اهو لاڳو نه ٿي سگهي ٿو ڇاڪاڻ ته اهو صرف پئسفڪ سمنڊ ذريعي قطب کان قطب تائين هڪ لڪير تي حسابن تي اثر انداز ٿئي ٿو، جيتوڻيڪ اهو چوڪوٽڪا جو حصو ۽ الاسڪا جو حصو آهي.
جيڪو اسان ان کي حاصل ڪيو ٿا پوائنٽن جي تعداد ۾ هڪ اهم گھٽتائي آهي جنهن جي خلاف توهان اهو حساب ڪتاب ڪيو ٿا. جيڪڏهن توهان وٽ ڊيٽابيس ۾ هڪ ملين گلوبل پوائنٽس آهن جيڪي برابر طريقي سان ورهايل آهن ۽ توهان 100 ڪلوميٽر اندر ڳولڻ چاهيو ٿا ، ته پوءِ توهان جي پهرين (تيز) ڳولا هڪ ايراضي 10000 اسڪوائر ڪلوميٽر آهي ۽ ممڪن طور تي 20 نتيجا حاصل ڪندو تقريبن 500M چورس ڪلو ميٽر جي ايراضي واري ايراضي ، جنهن جو مطلب آهي ته توهان پيچراڻ واري فاصلي جي حساب کي هن سوال جي لاءِ 20 ڀيرا بدران هڪ ڀيرو XNUMX ڀيرا هلائي رهيا آهيو.
مثال ۾ نن mistakeي غلطي… جيڪا 50 ڪلوميٽر جي اندر هوندي (نه 100) ڇاڪاڻ ته اسان پنهنجي “مربع” جي ريڊيس تي ڏسي رهيا آهيون.
شاندار صلاح! مون اصل ۾ هڪ ڊولپر سان ڪم ڪيو جنهن هڪ فنڪشن لکيو جيڪو اندران چورس کي ڇڪيندو هو ۽ پوءِ هڪ ورجائيندڙ فنڪشن جنهن جي چوڌاري ’اسڪوائرز‘ ٺاهيا ويندا آهن باقي پوائنٽن کي شامل ڪرڻ ۽ خارج ڪرڻ لاءِ. نتيجو هڪ ناقابل يقين حد تائين تيز نتيجو هو - هو مائڪرو سيڪنڊن ۾ لکين پوائنٽن جو اندازو لڳائي سگهيو.
منهنجو مٿيون نقطو ضرور ’خامو‘ پر قابل آهي. ٻيهر مهرباني!
ڊوگ ،
مان ڪوشش ڪري رهيو آهيان mysql ۽ php استعمال ڪرڻ جي لاءِ اندازو ڪرڻ لاءِ ته ڇا هڪ lat ڊگهو نقطو پولگون جي اندر آهي. ڇا توهان کي خبر آهي ته توهان جي ڊولپر دوست هن ڪم کي ڪيئن پورو ڪرڻ تي ڪي مثال شايع ڪيو. يا توهان کي خبر آهي ته ڪي سٺا مثال. اڳواٽ شڪريو.
هيلو سڀ اهو منهنجي ٽيسٽ SQL بيان آهي.
SELECT DISTINCT area_id, (
(
(
acos( sin( ( 13.65 * pi( ) /180 ) ) * sin( (
`lat_dec` * pi( ) /180 ) ) + cos( ( 13.65 * pi( ) /180 ) ) * cos( (
`lat_dec` * pi( ) /180 )
) * cos( (
( 51.02 - `lon_dec` ) * pi( ) /180 )
)
)
) *180 / pi( )
) *60 * 1.1515 * 1.609344
) AS distance
FROM `post_codes` WHERE distance <= 50
۽ مصلل اهو ٻڌائي رهيو آهي ته اهو فاصلو ، ڪالم وانگر موجود ناهي ، آئون آرڊر استعمال ڪري سگهان ٿو ، مان ڪٿي به ڪري سگهان ٿو ، ۽ اهو ڪم ڪري ٿو ، پر ان سان نه…
"جتي فاصلو" "هڻ واري فاصلي" سان بدليو.
هڪ ڪرم وانگر ڪم ڪري ٿو ، مهرباني ، ڊگلس!
هي زبردست آهي ، البته اهو ايئن آهي جيئن پکي پکي. ان لاءِ گوگل نقشه واري اي پي کي شامل ڪرڻ جي ڪوشش ڪندي اسان کي ڪنهن طرح سان شامل ڪرڻ جي لاءِ (شايد روڊن وغيره استعمال ڪرڻ) سٺو ٿيندو. مون کي اڃا تائين پي ايڇ پي ۾ هڪ سولي انجڻ ٺاهڻ وارو ڪم ڪرڻو آهي جيڪو سفر ڪندڙ وڪرو ڪندڙ مسئلي جي موثر حل پيش ڪرڻ جي قابل هوندو. پر مان سمجهان ٿو ته آئون ان جي ڪم لاءِ توهان جو ڪوڊ ٻيهر استعمال ڪري سگهان ٿو.
هاءِ ڊگلس ،
هن آرٽيڪل لاءِ تنهنجي وڏي مهرباني - توهان مون کي گهڻو وقت بچايو.
خيال رکجو،
نمرود @ اسرائيل
سٺو مضمون! مون ڪيترن ئي مضمونن کي مليو جئين بيان ڪيو ته ٻن نقطن جي مفاصلي کي ڪئين حساب ڪجي پر مان واقعي واقعي SQL snippet جي ڳولا ڪري رهيو هوس.
مهرباني تمام سٺو ڪم ڪيو آهي
هن فارمولي لاء توهان جي وڏي مهرباني. اهو ڪجهه وقت هڪ اسٽور جي جڳهه جي منصوبي تي ڇڪايو جيڪو مون تي کائي رهيو هو.
مهرباني هڪ بنڊل. ڪوڊ جو هي ننڍڙو لڪير مون کي ڪجهه وقت بچايو اسٽور جي جڳهه جي منصوبي ۾!
# 1054 - اڻ columnاتل ڪالم 'مفاصلو' جتي 'شق'
منظور ڪيو
هيڏانهن به ساڳيو! مسئلو ڇا آهي :-/؟ ”فاصلو“ ڪيئن حل ڪجي - ڪالم جو مسئلو؟ مهرباني ڪري اسان جي مدد ڪريو !! 🙂
ڪوشش ڪريو بدران استعمال ڪرڻ جي بدران
2 ڏينهن جي تحقيق آخرڪار هي پيج ڳولهڻ جو منهنجو مسئلو حل ٿي ويو. ڏسجي ٿو بهتر آءُ منهنجي وولفرام الفا کي ڪ bي ڇڏيندس ۽ منهنجي رياضي کي مٿان صاف ڪندي. WHERE کان HAVING کان تبديلي منهنجي اسڪرپٽ ڪم جي ترتيب ۾ آهي. توهان جي مهرباني
WHERE شق استعمال ڪرڻ جي بدران:
فاصلو <50 آهي
مهرباني جورگي مون ڪالم حاصل ڪيو ’مفاصلي‘ کي نه مليو. هڪ ڀيرو آئون بدلائي ويس جتي هڪ ڀيرو اهو حرف وانگر ڪم ڪيو!
ڪاش اهو پهريون صفحو مون کي هن تي مليو هجي ها. ڪيترن ئي مختلف حڪمن جي ڪوشش ڪرڻ کانپوءِ اهو واحد هو جيڪو صحيح ڪم ڪرڻ جي لاءِ ، ۽ گهٽ ۾ گهٽ تبديلين سان منهنجي پنهنجي ڊيٽابيس کي موزون ڪرڻ جي ضرورت هئي
تمام گهڻو مهرباني!
ڪاش اهو پهريون صفحو مون کي هن تي مليو هجي ها. ڪيترن ئي مختلف حڪمن جي ڪوشش ڪرڻ کانپوءِ اهو واحد هو جيڪو صحيح ڪم ڪرڻ جي لاءِ ، ۽ گهٽ ۾ گهٽ تبديلين سان منهنجي پنهنجي ڊيٽابيس کي موزون ڪرڻ جي ضرورت هئي
تمام گهڻو مهرباني!
وڏي وڏي مهرباني!
وڏي وڏي مهرباني!
مان نه ٿو سمجهان ته ڪوڊ هاڻ ڏيکاريو پيو وڃي. ٿي سگهي ٿو اھو فائر فائڪس ھجي؟
مون صرف ٻنهي فائر فاڪس ۽ ڪروم ۾ آزمايو ۽ اهو ظاهر ٿي رهيو آهي. ٻيهر ڪوشش ڪريو؟
هاء. وڏي وڏي مهرباني. اهو ڪم دلدار وانگر ٿيندو آهي.
وڏي مهرباني ڊگلس. اهو مڪمل ڪم ڪري رهيو آهي.
آئون thisاڻان ٿو ته اهو فارمولا ڪم ڪري ٿو ، پر مان نه ٿو ڏسي سگهان ته زمين جي ريڊس کي ڪهڙي حساب ۾ رکيو ويو آهي. ڇا ڪو مون کي روشن ڪري سگهي ٿو؟
ٽم ، Haversine فارمولا جي مڪمل وضاحت لاءِ (اهو ڪوڊ ناهي) ، وڪي پيڊيا جي آرٽيڪل کي پڙهو: http://en.wikipedia.org/wiki/Haversine_formula
خوبصورت! ان تمام منهنجي مدد ڪئي.
عظيم شيون ڊگلس. ڇا توهان ٻئي پوائنٽ جي لانگ / لٽ / بيئرنگ کي چونڊي واري پوائنٽ حاصل ڪرڻ جي ڪوشش ڪئي آهي؟
اڃان تائين نه ڪيو آهي ، خان!
توهان جي مهرباني ڊگگس ، ايس ايس ايل سوال واقعي آهي جيڪا مون کي گهربل هئي ، ۽ مون سمجهيو ته مون کي اهو به پاڻ لکڻ گهرجي. توهان مونکي غالبا ڪلاڪ ڪلاڪ واري ويڪرائي learningاڪ واري سکيا مان بچايو آهي!
مون کي Errormessage حاصل ٿئي ٿو: نامعلوم ڪالم 'فاصلو' ۾ جتي 'شق' MySQL سوال تي.
پطرس ، مهرباني ڪري ٻين راءِ کي هجو. ظاهر آهي ته ڪجهه ماڻهن ڪيڏانهن وڃڻ يا الڳ رهڻ لاءِ هڪ مختلف نحو استعمال ڪرڻي هئي.
هن عظيم مضمون لاءِ مهرباني! صرف منهنجي ڊي بي تي ڪوڊ آزمائي ۽ عظيم ڪم ڪيو!
ڊگلس ، توهان جي هن حيرت واري ڪوڊ لاءِ مهرباني. جي پي ايس ڪميونٽي پورٽل تي اهو ڪئين ڪجي ته مان پنهنجو سر ٽوڙي رهيو آهيان. توهان مونکي ڪلاڪ بچايو آهي.
ٻڌي ڏاو خوش ٿيو ، ايش!
هي مددگار مضمون پوسٽ ڪرڻ لاءِ مهرباني ،
پر ڪجهه سببن جي ڪري پڇڻ چاهيان ٿو
ڪيئن استعمال ڪجي mysql db ۽ coords جي وچ ۾ فاصلو ڪيئن پي ايڇ ۾ داخل ٿيل صارفن پاران؟
وڌيڪ وضاحت لاءِ.
1. صارف کي ڊي بي کان مخصوص ڊيٽا چونڊڻ لاءِ ۽ [يوزر] کي پاڻ جي خبرن کي داخل ڪرڻ لاءِ [id] داخل ڪرڻو پوندو
2. php فائل حاصل ڪريو ھدف ڊيٽا (ڪنڊ) [id] استعمال ڪندي ۽ پوءِ حساب ڪريو صارف ۽ ھدف پوائنٽ جي وچ ۾
يا صرف هيٺ ڏنل ڪوڊ مان فاصلو حاصل ڪري سگهندو؟
$ qry = "SELECT * ، ({(acos (sin ((". $ latitude. "* pi () / 180)) sin ((" Latitude "* pi () / 180) $ Latitude. "* pi () / 180)) * cos ((" Latitude "* pi () / 180)) * cos ((" 180 / pi ()) * 180 * 60 * 1.1515) جئين فاصلو "MyTable" ڪٿان جو فاصلو> = ". $ مفاصلو." >>>> ڇا مان اتان کان فاصلو ”ڪ takeي سگهان ٿو“؟
ٻيهر مهرباني ،
ٽامي ايس
ڪڏهن به ناهي ، مان سمجهان ٿو ته "فنڪشن" پي ايڇ ڊي ۾ ڪيئن ڪم ڪري ٿو
$ dis = getDistanceBetweenPointsNew ($ userLati، $ userLongi، $ lati، $ longi، $ unit = 'Km')
وڏي وڏي مهرباني!!
ٺيڪ ، سڀ ڪجهه جيڪو مون ڪوشش ڪيو آهي اهو ڪم نه ڪري رهيو آهي. منهنجو مطلب ، مون وٽ ڇا ڪم آهي ، پر فاصلا دور آهن.
ڇا ڪو ڏسي سگهي ٿو ته انهي ڪوڊ سان ڇا غلط آهي؟
جيڪڏهن (جاري ڪيو ويو ($ _ POST ['جمع ٿيل'])) {$ z = $ _POST ['zipcode'] ؛ $ ر = $ _POST ['رداس'] ؛ گونج “نتيجا لاءِ” $ $ ؛ $ sql = mysql_query ("چونڊيو منتخب ڪريو ايم زپ ڪوڊ ، ايم. ايمڪ نام ، ايم ايل لوڊ ايڊ ، ايم ايل ايڊڊ سيٽي ، ايم ايل ايڊڊ اسٽيٽ ، ايم. 1 ، ايم. 1 ، ايم. تصديق ٿيل ، z1.lat ، z2.lon ، z1. شهر ، z1. اسٽيٽ کان mk m ، zip z1 ، zip z2 جتي m.zipcode = z1.zipcode ۽ z2.zipcode = $ z AND (3963 * acos (truncate (sin (z2.lat / 57.2958) * sin y1 / 57.2958) + cos (z2.lat / 57.2958) * cos (m. y1 / 57.2958) * cos (m.x1 / 57.2958 - z2.lon / 57.2958) ، 8))) (mysql_error ()) ؛ جڏهن ته ($ قطار = mysql_fetch_array ($ sql)) {$ store1 = $ قطار ['MktName']. "" ؛ $ اسٽور = $ قطار ['LocAddSt']. "" ؛ $ اسٽور. = $ قطار ['LocAddCity']. "،". $ قطار ['LocAddState']. " $ قطار ['زپ ڪوڊ'] ؛ $ latitude1 = $ قطار ['lat'] ؛ $ ڊگھائي 1 = $ قطار ['lon'] ؛ $ latitude2 = $ قطار ['y1'] ؛ $ ڊگھائي 2 = $ قطار ['x1'] ؛ $ شھر = $ صف ['شھر'] ؛ $ اسٽيٽ = $ قطار ['رياست'] ؛ $ dis = getnew ($ latitude1 ، $ longitude1 ، $ latitude2 ، $ longitude2 ، $ unit = 'Mi') ؛ // $ dis = فاصلو ($ lat1 ، $ lon1 ، $ lat2 ، $ lon2) ؛ $ تصديق ٿيل = $ قطار ['تصديق ٿيل'] ؛ جيڪڏهن ($ تصديق ٿيل == '1') {گونج “”؛ گونج "". $ اسٽور. "" ؛ گونج $ ڊس. ”ميل (ميل) پري“؛ گونج “”؛ } ٻي {گونج “”. $ اسٽور. “”؛ گونج $ ڊس. ”ميل (ميل) پري“؛ گونج “”؛ }}}
منهنجا افعال. php ڪوڊ
فنڪشن getnew ($ latitude1 ، $ longitude1 ، $ latitude2 ، $ longitude2 ، $ unit = 'Mi') {$ theta = $ longitude1 - $ longitude2 ؛ $ فاصلو = (sin (deg2rad ($ latitude1)) * sin (deg2rad ($ latitude2))) + (cos (deg2rad ($ latitude1)) * cos (deg2rad ($ latitude2)) * cos (deg2rad ($ theta)) ) ؛ $ فاصلو = ايڪوس ($ فاصلو) ؛ $ فاصلو = rad2deg ($ فاصلو) ؛ $ فاصلو = $ مفاصلو * 60 * 1.1515؛ سوئچ ($ يونٽ) {ڪيس ‘ايم’: وقفو ؛ ڪيس 'ڪلوميٽر': $ مفاصلو = $ مفاصلو * 1.609344 ؛ } واپسي (گول ($ مفاصلو ، 2)) ؛ }
توھان جي مھرباني
انهي آرٽيڪل جي مهرباني منهنجي ڪوڊ سان ٺيڪ ڪم ڪري رهيو آهي. 🙂
اي يار ڊگلس ، بهترين مضمون. مون توهان جي جاگرافيائي تصورن ۽ ان جي ڪوڊ جي وضاحت ڏا reallyي دلچسپ محسوس ڪئي. منهنجو مشورو رڳو خلا ڏانهن وڃڻ ۽ ڊسپلي لاءِ ڪوڊ کي لڪائڻ (مثال طور اسٽيڪ اوور فلو) مان سمجھان ٿو ته توھان جڳھ کي محفوظ ڪرڻ چاھيو ٿا ، پر روايتي ڪوڊ اسپائيٽنگ / اشوڪارو اھو مون لاءِ ، پروگرامر جي طور تي ، پڙھڻ ۽ تقليد ڪرڻ ۾ مون لاءِ ڏا easierو آسان بڻائي ڇڏيندو. ڪا به ڳالهه ، اها هڪ نن thingڙي شيءِ آهي. زبردست ڪم جاري رکو.
مھرباني! مون پوسٽ کي ٿوري تبديلي ڏني آهي…. پر حقيقتون تمام گهڻا ڪمرا آهن ۽ ايترو ڊگهو آهي جو مون کي پڪ ناهي ته اها تمام گهڻي مدد ڪري ٿي.
توهانجي وڏي مهرباني.
هتي فنڪشن سان استعمال ڪندي اسان هڪ قسم جو فاصلو حاصل ڪري رهيا آهيون .. جڏهن ته سوال کي استعمال ڪندي هن جو فاصلو ٻئي قسم ۾ آهي
آئون ٻن رياستن جي وچ ۾ فاصلو طئي ڪندس
گهڻو ئي گوسيا کان پان هرموسو ڪوڊگو…
هي آئون سٺو cosinus ڪم ڪندو آهيان. آئون رياضي نه ٿو ،اڻان ، پر مهرباني!
عظيم ڪم… 🙂 (ي)
اهو تيز لڳي ٿو (MySql 5.9) چونڊڻ ۾ ٻه ڀيرا فارمولا استعمال ڪرڻ ۽ ڪٿي:
$ فارمولا = “(((ايڪوس (گناہ ((“. $ طول و عرض. ”* پي () / 180)) * گناهه ((“ طول و عرض ”* پائي () / 180)) + cos ((“. $ latitude. cos * ((Latitude "* pi () / 180)) cos ((" "$ longitude." - "longitude") * pi () / 180)))) * 180 / پي ()) * 180 * 60 * 1.1515) ”؛
$ sql = 'SELECT *،'. $ فارمولا. ' جدول کان پري پري تائين ’$ $ فارمولا. $ = ؛ $ فاصلو ؛
مھرباني…
ڪم نٿو ڪري جيڪڏهن
“ڪٿي فاصلو”
ڪم ڪندي
“فاصلو وڃائڻ”
ھن آرٽيڪل کي ختم ڪرڻ لاءِ گھڻا مھرباني. اھو تمام گھڻو مددگار ثابت ٿيو.
PHP پهريان ئي هڪ عام اسڪرپٽ پليٽ فارم ”ذاتي گهر واري پيج“ جي نالي سان ٺاهي وئي. ا PHڪلهه پي ايڇ پي (هائپر ٽيڪسٽ پري پروسیسر لاءِ مختصر) مائڪروسافٽ جي فعال سرور پيجز (اي ايس پي) ٽيڪنالاجي جو هڪ متبادل آهي.
PHP هڪ اوپن سورس سرور طرف واري ٻولي آهي جيڪا متحرڪ ويب پيج ٺاهڻ لاءِ استعمال ٿيندي آهي. اهو HTML ۾ شامل ٿي سگهي ٿو. پي ايڇ پي عام طور تي لينڪس / يونڪس ويب سرور تي آئي ايس ايس ايل ڊيٽابيس جي گڏيل استعمال ڪندو آهي. اھو ٿي سگھي ٿو سڀ کان وڌيڪ مشهور لکت واري ٻولي.
مون مٿي ڏٺو ته حل نه صحيح ڪم ڪري رهيو آهي.
مون کي تبديل ڪرڻ جي ضرورت آھي:
$ qqq = "SELECT * ، ({(acos (sin ((". $ latitude. "* pi () / 180)) * sin ((` latt` * pi () / 180)) + cos ((“. $ طول و عرض. “* pi () / 180)) * cos ((` latt` * pi () / 180)) * cos (((. $ longitude. “-“ longt “) * pi () / 180) 180) / پي ()) * 60 * 1.1515 جئين فاصلو “رجسٽرٽ” کان ؛ “
مهرباني ڪوپندر!
مهرباني سائين بلڪل صحيح ڪم ڪيو .. پر منهنجو هڪ سوال آهي ته جيڪڏهن مان بغير ڊيسيمل پوائنٽ جي آئوٽ ڪرڻ چاهيان ٿو ته پوءِ مان ڇا ڪري سگهان ٿو ..؟
اڳواٽ شڪريو.
هيلو ، مهرباني ڪري آئون واقعي هن تي تنهنجي مدد جي ضرورت پوندي.
مون پنهنجي ويب سرور تي موصول جي درخواست ڪئي
53.47792 = $ طول و عرض
-2.23389 = $ ڊگھائي
۽ 20 = اهو مفاصلو جنهن کي آئون واپس وٺڻ چاهيان ٿو
جيتوڻيڪ توهان جو فارمولا استعمال ڪندي ، اهو منهنجي ڊي بي ۾ سڀني قطار ڏي ٿو
$نتيجا = DB::select( DB::raw("SELECT *، (((acos(sin((".$latitude)"pi()/180)) * گناهه((latpi()/180))+cos((“.$ latitude.”pi()/180)) * cos((latpi()/180)) * cos(((".$ ڊگھائي."- lng)pi()/180))))180/pi())601.1515*1.609344) جيئن نشانن کان فاصلو فاصلو >= “.$ مفاصلو))؛
[{“id”: 1، ”name”: ”Frankie Johnnie & Luigo Too”، ”address”: ”939 W El Camino Real، Mountain View، CA”، ”lat“: 37.386337280273، ”lng“: - 122.08582305908، "فاصلو": 16079.294719663} ، {"id": 2، "name": "Amici's East Coast Pizzeria"، "address": "790 Castro St، Mountain View، CA"، "lat": 37.387138366699، "lng": -122.08323669434، "فاصلو": 16079.175940152}، {"id": 3، "name": "Kapp's Pizza Bar & Grill"، "address": "191 Castro St، Mountain View، CA"، "lat": 37.393886566162، "lng": - 122.07891845703 ، "فاصلو": 16078.381373826}، {"id": 4، "name": "گول ٽيبل پيزا: ماؤنٹین وارو نظارو" ، "پتو": "570 N Shoreline Blvd، Mountain View، CA"، ”لات“: 37.402652740479، ”lng“: - 122.07935333252، ”فاصلو“: 16077.420540582}، {“id”: 5، “name”: “Tony & Alba's Pizza & Pasta”، ”address”: ”619 Escuela Ave، Mountain ڏسو ، سي اي ”،“ لات ”: 37.394012451172،“ lng ”: - 122.09552764893،“ فاصلو ”: 16078.563225154}، {“ id ”: 6،” name ”:” اورينگو جي ووڊ فائر پيزا “،” پتو “:” 4546 ايل ڪيمينو ريئل ، لاس الٽسو ، سي اي ”،“ لات ”: 37.401725769043 ،“ lng ”: - 122.11464691162 ،“ فاصلو ”: 16077.937560795} ، {“ id ”: 7 ،” نالو “:” بارز ۽ گرلس “،” پتو “:” 24 Whiteley Street، Manchester، ”lat”: 53.485118865967، ”lng”: - 2.1828699111938، ”jarak“: 8038.7620112314}]
آئون رڳو 20 ميلن سان قطار بحال ڪرڻ چاهيان ٿو پر اها سڀئي قطار کڻي اچي ٿي. مهرباني ڪري مان جيڪو غلط ڪري رهيو آهيان
مان similarولي رھيو آھيان ھڪڙي سا quئي سوال جي پر ٿورو ا steتي و shortو - مختصر طور تي اھو آھي س allني ڪوآرڊينيٽس کي ھر 2 ڪوآرڊينيٽ جي XNUMX ميلن جي اندر گروپ ڪرڻ ۽ پوءِ countڻيو ته ھر گروپ ۾ ڪيترا ڪوآرڊينيٽ آھن ۽ ر outputو ھڪڙو گروپ outputاھي ٿو جنھن وٽ تمام گھڻا ڪوآرڊينيٽس آھن - جيتوڻيڪ. توھان وٽ آھن ھڪڙي کان و groupيڪ گروپ گروپن ۾ جن وٽ آھي س coord کان و coordيڪ ڪوآرڊينيٽس - ر outputو theاھر ڪ theو بي ترتيب گروپ انھن گروپن مان جيڪي سا largestئي وڏي تعداد ۾ آھن -
توهان جي تمام شيئرنگ جي مهرباني