ເດືອນນີ້ຂ້ອຍໄດ້ຂຽນໂປຣແກຣມຂ້ອນຂ້າງຂື້ນໃນ PHP ແລະ MySQL ກ່ຽວກັບ GIS. Snooping ປະມານສຸດທິ, ຂ້າພະເຈົ້າໃນຕົວຈິງແມ່ນມີຄວາມຫຍຸ້ງຍາກໃນການຊອກຫາບາງສ່ວນຂອງ ການຄິດໄລ່ພູມສາດ ເພື່ອຊອກຫາໄລຍະຫ່າງລະຫວ່າງສອງສະຖານທີ່ດັ່ງນັ້ນຂ້ອຍຢາກແບ່ງປັນໃຫ້ເຂົາເຈົ້າຢູ່ທີ່ນີ້.
ວິທີງ່າຍໆຂອງການຄິດໄລ່ໄລຍະຫ່າງລະຫວ່າງສອງຈຸດແມ່ນການໃຊ້ສູດ Pythagorean ເພື່ອຄິດໄລ່ hypotenuse ຂອງສາມຫຼ່ຽມ (A² + B² = C²). ນີ້ແມ່ນເປັນທີ່ຮູ້ຈັກກັນໃນນາມ ໄລຍະທາງ Euclidean.
ນັ້ນແມ່ນການເລີ່ມຕົ້ນທີ່ ໜ້າ ສົນໃຈແຕ່ມັນບໍ່ກ່ຽວຂ້ອງກັບພູມສາດເພາະວ່າໄລຍະທາງລະຫວ່າງເສັ້ນຂະ ໜານ ແລະເສັ້ນແວງແມ່ນໄລຍະທາງ ໄລຍະຫ່າງບໍ່ເທົ່າກັນ ນອກ. ໃນຂະນະທີ່ທ່ານໃກ້ຈະໄປຫາເສັ້ນສູນສູດ, ເສັ້ນຂະ ໜານ ເສັ້ນຫ່າງກັນໄກກັນ. ຖ້າທ່ານໃຊ້ສົມຜົນສາມຫລ່ຽມງ່າຍໆບາງຊະນິດ, ມັນອາດຈະວັດແທກໄລຍະທາງທີ່ຖືກຕ້ອງໃນສະຖານທີ່ ໜຶ່ງ ແລະຜິດພາດໃນອີກບ່ອນ ໜຶ່ງ, ເພາະວ່າເສັ້ນໂຄ້ງຂອງໂລກ.
ໄລຍະທາງວົງກົມທີ່ຍິ່ງໃຫຍ່
ບັນດາເສັ້ນທາງທີ່ເດີນທາງໄກຈາກທົ່ວໂລກເອີ້ນວ່າເສັ້ນທາງ ໄລຍະທາງວົງກົມທີ່ຍິ່ງໃຫຍ່. ນັ້ນຄື… ໄລຍະຫ່າງທີ່ສັ້ນທີ່ສຸດລະຫວ່າງສອງຈຸດໃນວົງມົນແມ່ນແຕກຕ່າງຈາກຈຸດທີ່ຢູ່ໃນແຜນທີ່ຮາບພຽງ. ສົມທົບກັບຄວາມຈິງທີ່ວ່າເສັ້ນ latitude ແລະເສັ້ນແວງບໍ່ໄດ້ເທົ່າທຽມກັນ… ແລະທ່ານໄດ້ຮັບການຄິດໄລ່ທີ່ຍາກ.
ນີ້ແມ່ນ ຄຳ ອະທິບາຍວິດີໂອທີ່ດີເລີດຂອງວິທີການ Great Circles ເຮັດວຽກ.
ສູດ Haversine
ໄລຍະທາງທີ່ໃຊ້ເສັ້ນໂຄ້ງຂອງ ໜ່ວຍ ໂລກໄດ້ຖືກລວມເຂົ້າໃນ ສູດ haversine, ເຊິ່ງໃຊ້ trigonometry ເພື່ອອະນຸຍາດໃຫ້ມີເສັ້ນໂຄ້ງຂອງແຜ່ນດິນໂລກ. ເມື່ອທ່ານ ກຳ ລັງຊອກຫາໄລຍະຫ່າງລະຫວ່າງ 2 ສະຖານທີ່ເທິງໂລກ (ໃນຂະນະທີ່ຝູງບິນບິນ), ສາຍກົງແມ່ນເສັ້ນໂຄ້ງແທ້ໆ.
ນີ້ສາມາດໃຊ້ໄດ້ໃນການບິນຜ່ານທາງອາກາດ - ທ່ານເຄີຍໄດ້ເບິ່ງແຜນທີ່ຂອງຖ້ຽວບິນທີ່ແທ້ຈິງແລະສັງເກດເຫັນວ່າມັນຖືກໂຄ້ງບໍ? ນັ້ນແມ່ນຍ້ອນວ່າມັນສັ້ນກວ່າທີ່ຈະບິນໃນທ້ອງຟ້າລະຫວ່າງສອງຈຸດກ່ວາໂດຍກົງກັບສະຖານທີ່.
PHP: ຄິດໄລ່ໄລຍະຫ່າງລະຫວ່າງ 2 ຈຸດຂອງເສັ້ນຂະ ໜານ ແລະເສັ້ນແວງ
ນີ້ແມ່ນສູດ PHP ສໍາລັບການຄິດໄລ່ໄລຍະຫ່າງລະຫວ່າງສອງຈຸດ (ພ້ອມກັບ Mile vs. Kilometer conversion) ມົນເປັນສອງຕໍາແໜ່ງທົດສະນິຍົມ.
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 – ຕົວແປສຳລັບເສັ້ນຂະໜານຂອງສະຖານທີ່ທຳອິດຂອງທ່ານ.
- $Longitude1 – ຕົວແປສໍາລັບເສັ້ນແວງສະຖານທີ່ທໍາອິດຂອງທ່ານ
- $Latitude2 – ຕົວແປສຳລັບເສັ້ນຂະໜານຂອງສະຖານທີ່ທີສອງຂອງທ່ານ.
- $Longitude2 – ຕົວແປສຳລັບເສັ້ນແວງຂອງສະຖານທີ່ທີສອງຂອງທ່ານ.
- $unit – ເປັນຄ່າເລີ່ມຕົ້ນ ໄມ. ນີ້ສາມາດໄດ້ຮັບການປັບປຸງຫຼືຜ່ານ ກິໂລແມັດ.
Python: ຄິດໄລ່ໄລຍະຫ່າງລະຫວ່າງ 2 ຈຸດຂອງເສັ້ນຂະໜານ ແລະເສັ້ນແວງ
ແນວໃດກໍ່ຕາມ, ນີ້ແມ່ນສູດ Python ສໍາລັບການຄິດໄລ່ໄລຍະຫ່າງລະຫວ່າງສອງຈຸດ (ພ້ອມກັບ Mile vs. Kilometer conversion) ມົນເປັນສອງຕໍາແໜ່ງທົດສະນິຍົມ. ສິນເຊື່ອໃຫ້ກັບລູກຊາຍຂອງຂ້ອຍ, Bill Karr ຜູ້ທີ່ເປັນ Data Scientist ສໍາລັບ 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 – ຕົວແປສໍາລັບສະຖານທີ່ທໍາອິດຂອງທ່ານ latitude.
- ເສັ້ນແວງ1 – ຕົວແປສໍາລັບສະຖານທີ່ທໍາອິດຂອງທ່ານ ເສັ້ນແວງ
- ເສັ້ນຂະໜານ 2 – ຕົວແປສໍາລັບສະຖານທີ່ທີສອງຂອງທ່ານ latitude.
- ເສັ້ນແວງ2 – ຕົວແປສໍາລັບສະຖານທີ່ທີສອງຂອງທ່ານ ເສັ້ນແວງ.
- ຫນ່ວຍບໍລິການ – ເປັນຄ່າເລີ່ມຕົ້ນ ໄມ. ນີ້ສາມາດໄດ້ຮັບການປັບປຸງຫຼືຜ່ານ ກິໂລແມັດ.
MySQL: ດຶງເອົາບັນທຶກທັງໝົດພາຍໃນຂອບເຂດໃດໜຶ່ງໂດຍການຄຳນວນໄລຍະທາງເປັນໄມລ໌ໂດຍໃຊ້ເສັ້ນຂະໜານ ແລະເສັ້ນແວງ
ມັນຍັງສາມາດໃຊ້ SQL ເພື່ອເຮັດການຄິດໄລ່ເພື່ອຊອກຫາບັນທຶກທັງ ໝົດ ພາຍໃນໄລຍະທາງສະເພາະ. ໃນຕົວຢ່າງນີ້, ຂ້ອຍຈະສອບຖາມ MyTable ໃນ MySQL ເພື່ອຊອກຫາບັນທຶກທັງ ໝົດ ທີ່ນ້ອຍກວ່າຫລືເທົ່າກັບຕົວແປ $ distance (ໃນ Miles) ກັບສະຖານທີ່ຂອງຂ້ອຍທີ່ $ 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."
ທ່ານ ຈຳ ເປັນຕ້ອງປັບແຕ່ງສິ່ງນີ້:
- ຄວາມຍາວ $ - ນີ້ແມ່ນຕົວແປ PHP ທີ່ຂ້ອຍ ກຳ ລັງຜ່ານຈຸດຍາວຂອງຈຸດ.
- $ latitude - ນີ້ແມ່ນຕົວແປ PHP ທີ່ຂ້ອຍ ກຳ ລັງຜ່ານຈຸດຍາວຂອງຈຸດ.
- $ ໄລຍະທາງ - ນີ້ແມ່ນໄລຍະທາງທີ່ທ່ານຕ້ອງການເພື່ອຊອກຫາບັນທຶກທັງ ໝົດ ທີ່ນ້ອຍກວ່າຫລືເທົ່າກັບ.
- ຕາຕະລາງ - ນີ້ແມ່ນຕາຕະລາງ…ທ່ານຕ້ອງການປ່ຽນບ່ອນນັ້ນດ້ວຍຊື່ຕາຕະລາງຂອງທ່ານ.
- latitude - ນີ້ແມ່ນຂົງເຂດຂອງເສັ້ນຂະ ໜານ ຂອງທ່ານ.
- ເສັ້ນແວງ - ນີ້ແມ່ນພາກສະຫນາມຂອງຄວາມຍາວຂອງທ່ານ.
MySQL: ດຶງຂໍ້ມູນທັງໝົດພາຍໃນຂອບເຂດໃດໜຶ່ງໂດຍການຄຳນວນໄລຍະທາງເປັນກິໂລແມັດໂດຍໃຊ້ເສັ້ນຂະໜານ ແລະເສັ້ນແວງ
ແລະນີ້ແມ່ນ ຄຳ ຖາມ SQL ໂດຍໃຊ້ກິໂລແມັດໃນ MySQL:
$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."
ທ່ານ ຈຳ ເປັນຕ້ອງປັບແຕ່ງສິ່ງນີ້:
- ຄວາມຍາວ $ - ນີ້ແມ່ນຕົວແປ PHP ທີ່ຂ້ອຍ ກຳ ລັງຜ່ານຈຸດຍາວຂອງຈຸດ.
- $ latitude - ນີ້ແມ່ນຕົວແປ PHP ທີ່ຂ້ອຍ ກຳ ລັງຜ່ານຈຸດຍາວຂອງຈຸດ.
- $ ໄລຍະທາງ - ນີ້ແມ່ນໄລຍະທາງທີ່ທ່ານຕ້ອງການເພື່ອຊອກຫາບັນທຶກທັງ ໝົດ ທີ່ນ້ອຍກວ່າຫລືເທົ່າກັບ.
- ຕາຕະລາງ - ນີ້ແມ່ນຕາຕະລາງ…ທ່ານຕ້ອງການປ່ຽນບ່ອນນັ້ນດ້ວຍຊື່ຕາຕະລາງຂອງທ່ານ.
- latitude - ນີ້ແມ່ນຂົງເຂດຂອງເສັ້ນຂະ ໜານ ຂອງທ່ານ.
- ເສັ້ນແວງ - ນີ້ແມ່ນພາກສະຫນາມຂອງຄວາມຍາວຂອງທ່ານ.
ຂ້າພະເຈົ້າໄດ້ ນຳ ໃຊ້ລະຫັດນີ້ໃນເວທີການສ້າງແຜນທີ່ຂອງວິສາຫະກິດທີ່ພວກເຮົາ ນຳ ໃຊ້ ສຳ ລັບຮ້ານຂາຍຍ່ອຍທີ່ມີຫລາຍກວ່າ 1,000 ສະຖານທີ່ທົ່ວອາເມລິກາ ເໜືອ ແລະມັນໄດ້ເຮັດວຽກທີ່ສວຍງາມ.
Microsoft SQL Server ໄລຍະຫ່າງທາງພູມສາດ: STDistance
ຖ້າທ່ານກໍາລັງໃຊ້ Microsoft SQL Server, ພວກເຂົາສະເຫນີຫນ້າທີ່ຂອງຕົນເອງ, STDistance ສໍາລັບການຄິດໄລ່ໄລຍະຫ່າງລະຫວ່າງສອງຈຸດໂດຍໃຊ້ປະເພດຂໍ້ມູນພູມສາດ.
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);
Hat tip ກັບ Manash Sahoo, VP ແລະສະຖາປະນິກຂອງ Highbridge.
ຂອບໃຈຫຼາຍໆທີ່ແບ່ງປັນ. ນີ້ແມ່ນການສໍາເນົາແລະການວາງໄດ້ງ່າຍແລະເຮັດວຽກທີ່ດີເລີດ. ເຈົ້າໄດ້ປະຫຍັດເວລາໃຫ້ຂ້ອຍຫຼາຍ.
FYI ສໍາລັບໃຜທີ່ສົ່ງໄປຫາ C:
double deg2rad(double deg) { return deg*(3.14159265358979323846/180.0); }
ສິ້ນງາມຫຼາຍຂອງການປະກາດ – ເຮັດວຽກງາມຫຼາຍ – ຂ້າພະເຈົ້າພຽງແຕ່ໄດ້ປ່ຽນຊື່ຂອງຕາຕະລາງຖື lat-long. ມັນເຮັດວຽກໄດ້ໄວພໍສົມຄວນກັບ.. ຂ້ອຍມີຕົວເລກຂະໜາດນ້ອຍທີ່ສົມເຫດສົມຜົນ (< 400) ແຕ່ຂ້ອຍຄິດວ່າອັນນີ້ຈະເຮັດໃຫ້ຂະໜາດງາມ. ເວັບໄຊງາມຄືກັນ – ຂ້ອຍຫາກໍ່ເພີ່ມມັນໃສ່ບັນຊີ del.icio.us ຂອງຂ້ອຍ ແລະຈະກວດເບິ່ງຄືນເປັນປົກກະຕິ.
ຂອບໃຈຫຼາຍໆ Peter ແລະ Kerry! ຖ້າທ່ານຕ້ອງການເຮັດວຽກກ່ຽວກັບໂຄງການ GIS, ຂ້າພະເຈົ້າຂໍແນະນໍາ:
ຂອບໃຈຫຼາຍໆ… 😀
ຂ້ອຍຄົ້ນຫາຕະຫຼອດມື້ສໍາລັບການຄິດໄລ່ທາງໄກແລະພົບ harversine algorithm, ຂອບໃຈທີ່ທ່ານໃຫ້ຕົວຢ່າງກ່ຽວກັບວິທີການໃສ່ມັນຢູ່ໃນຄໍາຖະແຫຼງທີ່ sql. ຂອບໃຈ ແລະຊົມເຊີຍ, ດານີເອນ
ດີໃຈທີ່ໄດ້ຊ່ວຍເຫຼືອ, rails ເພື່ອນ!
ຕອນນີ້ຂ້ອຍກໍາລັງຊອກຫາຟັງຊັນ PHP 'in Polygon' ທີ່ຈະເອົາ array ຂອງເສັ້ນຂະຫນານແລະເສັ້ນແວງຕາມລໍາດັບແລະຄິດອອກວ່າຈຸດອື່ນແມ່ນຢູ່ພາຍໃນຫຼືພາຍນອກຂອງ polygon.
ຂ້ອຍພົບ ສົມຜົນເພື່ອຄິດອອກວ່າຈຸດໃດນຶ່ງໃນ polygon!
ຂ້ອຍຄິດວ່າ SQL ຂອງເຈົ້າຕ້ອງການຄໍາຖະແຫຼງການ.
ແທນທີ່ຈະເປັນ WHERE distance <= $distance you may need to
ໃຊ້ HAVING distance <= $distance
ຖ້າ ບໍ່ ດັ່ງ ນັ້ນ ຂໍ ຂອບ ໃຈ ສໍາ ລັບ ຂ້າ ພະ ເຈົ້າ ຊໍ່ ຂອງ ທີ່ ໃຊ້ ເວ ລາ ແລະ ພະ ລັງ ງານ.
ສະບາຍດີ David,
ຖ້າທ່ານກໍາລັງເຮັດປະເພດຂອງ GROUP BY ຄໍາສັ່ງໃດກໍ່ຕາມ, ທ່ານຈະຕ້ອງມີ HAVING. ຂ້ອຍບໍ່ໄດ້ເຮັດແບບນັ້ນໃນຕົວຢ່າງຂ້າງເທິງ.
Doug
ໃນຖານະເປັນຂອງ MySQL 5.x, ທ່ານບໍ່ສາມາດໃຊ້ນາມແຝງຢູ່ໃນ WHERE clause ເບິ່ງ http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
ໃຊ້ HAVING ແທນ WHERE ໃນການສອບຖາມຂ້າງເທິງ
ຂອບໃຈຫຼາຍໆ. ເຈົ້າໄດ້ເຮັດວຽກທີ່ດີເລີດນັ້ນແມ່ນສິ່ງທີ່ຂ້ອຍຕ້ອງການແທ້ໆ. ຂອບໃຈຫຼາຍໆ.
ຂອບໃຈຫຼາຍໆສຳລັບການແບ່ງປັນລະຫັດນີ້. ມັນໄດ້ຊ່ວຍປະຢັດເວລາການພັດທະນາໃຫ້ຂ້ອຍຫຼາຍ. ນອກຈາກນັ້ນ, ຂໍຂອບໃຈກັບຜູ້ອ່ານຂອງທ່ານສໍາລັບການຊີ້ໃຫ້ເຫັນວ່າຄໍາຖະແຫຼງທີ່ HAVING ເປັນສິ່ງຈໍາເປັນສໍາລັບ MySQL 5.x. ມີປະໂຫຍດຫຼາຍ.
ຂ້ອຍໄດ້ຮັບພອນທີ່ມີຜູ້ອ່ານສະຫຼາດກວ່າຂ້ອຍຫຼາຍ!
🙂
ສູດຂ້າງເທິງນີ້ແມ່ນປະຫຍັດເວລາຫຼາຍ. ຂອບໃຈຫຼາຍໆ.
ຂ້ອຍຍັງຕ້ອງປ່ຽນລະຫວ່າງຮູບແບບ NMEA ແລະ Degrees. ຂ້ອຍພົບສູດຢູ່ໃນ URL ນີ້ຢູ່ດ້ານລຸ່ມຂອງຫນ້າ. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
ມີໃຜຮູ້ວິທີກວດສອບອັນນີ້ບໍ?
ຂອບໃຈ!
Harry
ສະບາຍດີ,
ຄໍາຖາມອື່ນ. ມີສູດສໍາລັບ NMEA strings ຄືກັບອັນຂ້າງລຸ່ມນີ້ບໍ?
1342.7500,N,10052.2287,E
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
ຂໍຂອບໃຈ,
Harry
ຂ້ອຍຍັງພົບວ່າ WHERE ບໍ່ໄດ້ຜົນສໍາລັບຂ້ອຍ. ປ່ຽນມັນເປັນ HAVING ແລະທຸກຢ່າງເຮັດວຽກທີ່ສົມບູນແບບ. ທໍາອິດຂ້ອຍບໍ່ໄດ້ອ່ານຄໍາຄິດເຫັນແລະຂຽນມັນໃຫມ່ໂດຍໃຊ້ການຄັດເລືອກແບບຊ້ອນກັນ. ທັງສອງຈະເຮັດວຽກໄດ້ດີ.
ຂອບໃຈຫຼາຍໆ ສຳ ລັບສະຄິບທີ່ຂຽນໃນ mysql, ພຽງແຕ່ຕ້ອງໄດ້ປັບຕົວເລັກນ້ອຍ (ມີ) 🙂
ວຽກດີ
ມີປະໂຫຍດຢ່າງບໍ່ໜ້າເຊື່ອ, ຂອບໃຈຫຼາຍໆ! ຂ້ອຍມີບັນຫາບາງຢ່າງກັບ "HAVING", ແທນທີ່ຈະ "ຢູ່ໃສ", ແຕ່ເມື່ອຂ້ອຍໄດ້ອ່ານຄໍາເຫັນຢູ່ທີ່ນີ້ (ຫຼັງຈາກປະມານເຄິ່ງຊົ່ວໂມງຂອງການກັດແຂ້ວຂອງຂ້ອຍດ້ວຍຄວາມອຸກອັ່ງ =P), ຂ້ອຍໄດ້ເຮັດວຽກໄດ້ດີ. ຂອບໃຈ ^_^
ຂອບໃຈຫຼາຍໆ ເຮັດວຽກໄດ້ດີ
ຈົ່ງຈື່ໄວ້ວ່າຄໍາຖະແຫຼງທີ່ເລືອກແບບນັ້ນຈະມີຄວາມເຂັ້ມຂົ້ນໃນຄອມພິວເຕີ້ຫຼາຍແລະດັ່ງນັ້ນຈຶ່ງຊ້າ. ຖ້າທ່ານມີຄໍາຖາມເຫຼົ່ານັ້ນຫຼາຍ, ມັນສາມາດຂັດຂວາງສິ່ງທີ່ຂ້ອນຂ້າງໄວ.
ວິທີການທີ່ມີຄວາມເຂັ້ມຂຸ້ນຫນ້ອຍຫຼາຍແມ່ນການດໍາເນີນການເລືອກທໍາອິດ (ນໍ້າມັນດິບ) ໂດຍໃຊ້ພື້ນທີ່ SQUARE ທີ່ກໍານົດໂດຍໄລຍະທາງທີ່ຄິດໄລ່ເຊັ່ນ: "ເລືອກ * ຈາກຕາຕະລາງທີ່ມີເສັ້ນຂະຫນານລະຫວ່າງ lat1 ແລະ lat2 ແລະເສັ້ນແວງລະຫວ່າງ lon1 ແລະ lon2". lat1 = targetlatitude – latdiff, lat2 = targetlatitude + latdiff, ຄ້າຍຄືກັນກັບ lon. latdiff ~= ໄລຍະທາງ / 111 (ສໍາລັບກິໂລແມັດ), ຫຼືໄລຍະທາງ / 69 ສໍາລັບໄມນັບຕັ້ງແຕ່ 1 ອົງສາຂອງ latitude ແມ່ນ ~ 111 km (ການປ່ຽນແປງເລັກນ້ອຍເນື່ອງຈາກວ່າແຜ່ນດິນໂລກເປັນຮູບໄຂ່ເລັກນ້ອຍ, ແຕ່ພຽງພໍສໍາລັບຈຸດປະສົງນີ້). londiff = ໄລຍະຫ່າງ / (abs(cos(deg2rad(latitude))*111)) — ຫຼື 69 ສໍາລັບໄມລ໌ (ຕົວຈິງແລ້ວທ່ານສາມາດເອົາສີ່ຫຼ່ຽມໃຫຍ່ກວ່າເລັກນ້ອຍເພື່ອຄິດໄລ່ການປ່ຽນແປງ). ຫຼັງຈາກນັ້ນ, ເອົາຜົນໄດ້ຮັບຂອງການທີ່ແລະອາຫານມັນເຂົ້າໄປໃນ radial ເລືອກ. ພຽງແຕ່ຢ່າລືມພິຈາລະນາພິກັດນອກຂອບເຂດ - ເຊັ່ນ: ຊ່ວງຂອງເສັ້ນແວງທີ່ຍອມຮັບໄດ້ແມ່ນ -180 ຫາ +180 ແລະຊ່ວງຂອງເສັ້ນຂະໜານທີ່ຍອມຮັບໄດ້ແມ່ນ -90 ຫາ +90 — ໃນກໍລະນີທີ່ latdiff ຫຼື londiff ຂອງທ່ານແລ່ນຢູ່ນອກຂອບເຂດນີ້. . ໃຫ້ສັງເກດວ່າໃນກໍລະນີຫຼາຍທີ່ສຸດ, ມັນອາດຈະໃຊ້ບໍ່ໄດ້ເນື່ອງຈາກມັນມີຜົນກະທົບພຽງແຕ່ການຄິດໄລ່ຜ່ານເສັ້ນຜ່ານມະຫາສະຫມຸດປາຊີຟິກຈາກຂົ້ວໂລກໄປຫາເສົາ, ເຖິງແມ່ນວ່າມັນຕັດບາງສ່ວນຂອງ chukotka ແລະສ່ວນຫນຶ່ງຂອງອາລາສກາ.
ສິ່ງທີ່ພວກເຮົາເຮັດສໍາເລັດໂດຍການນີ້ແມ່ນການຫຼຸດລົງຢ່າງຫຼວງຫຼາຍໃນຈໍານວນຈຸດທີ່ທ່ານເຮັດການຄິດໄລ່ນີ້. ຖ້າທ່ານມີຈຸດທົ່ວໂລກຈໍານວນລ້ານຢູ່ໃນຖານຂໍ້ມູນທີ່ແຈກຢາຍປະມານເທົ່າທຽມກັນແລະທ່ານຕ້ອງການຄົ້ນຫາພາຍໃນ 100 ກິໂລແມັດ, ຫຼັງຈາກນັ້ນການຄົ້ນຫາທໍາອິດ (ໄວ) ຂອງທ່ານແມ່ນພື້ນທີ່ 10000 ຕາລາງກິໂລແມັດແລະອາດຈະໃຫ້ຜົນໄດ້ຮັບປະມານ 20 ຜົນໄດ້ຮັບ (ອີງຕາມການແຈກຢາຍເຖິງແມ່ນວ່າໃນໄລຍະຫນຶ່ງ. ພື້ນທີ່ປະມານ 500M sq km), ຊຶ່ງຫມາຍຄວາມວ່າທ່ານດໍາເນີນການຄິດໄລ່ໄລຍະຫ່າງທີ່ສັບສົນ 20 ເທື່ອສໍາລັບການສອບຖາມນີ້ແທນທີ່ຈະເປັນລ້ານເທື່ອ.
ຄວາມຜິດພາດເລັກນ້ອຍໃນຕົວຢ່າງ… ທີ່ຈະຢູ່ພາຍໃນ 50 ກິໂລແມັດ (ບໍ່ແມ່ນ 100) ເນື່ອງຈາກພວກເຮົາກຳລັງເບິ່ງ “ລັດສະໝີ” ຂອງ… ສີ່ຫຼ່ຽມມົນ.
ຄໍາແນະນໍາທີ່ດີເລີດ! ຕົວຈິງແລ້ວຂ້ອຍໄດ້ເຮັດວຽກກັບຜູ້ພັດທະນາທີ່ຂຽນຫນ້າທີ່ດຶງສີ່ຫຼ່ຽມພາຍໃນແລະຫຼັງຈາກນັ້ນຫນ້າທີ່ recursive ທີ່ເຮັດໃຫ້ 'ສີ່ຫລ່ຽມ' ຮອບ perimeter ເພື່ອປະກອບແລະຍົກເວັ້ນຈຸດທີ່ຍັງເຫຼືອ. ຜົນໄດ້ຮັບແມ່ນຜົນໄດ້ຮັບໄວຢ່າງບໍ່ຫນ້າເຊື່ອ - ລາວສາມາດປະເມີນຫຼາຍລ້ານຈຸດໃນ microseconds.
ວິທີການຂອງຂ້ອຍຂ້າງເທິງແມ່ນແນ່ນອນ 'ດິບ' ແຕ່ມີຄວາມສາມາດ. ຂອບໃຈອີກຄັ້ງ!
ດັ໊ກ,
ຂ້ອຍໄດ້ພະຍາຍາມໃຊ້ mysql ແລະ php ເພື່ອປະເມີນວ່າຈຸດຍາວຢູ່ພາຍໃນ polygon. ທ່ານຮູ້ບໍ່ວ່າເພື່ອນນັກພັດທະນາຂອງທ່ານເຜີຍແຜ່ຕົວຢ່າງໃດໆກ່ຽວກັບວິທີເຮັດສໍາເລັດວຽກງານນີ້. ຫຼືເຈົ້າຮູ້ຕົວຢ່າງທີ່ດີອັນໃດ. ຂອບໃຈລ່ວງຫນ້າ.
ສະບາຍດີທຸກຄົນ ນີ້ແມ່ນຄຳສັ່ງ 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
ແລະ Mysql ແມ່ນບອກຂ້ອຍວ່າໄລຍະຫ່າງ, ບໍ່ມີເປັນຖັນ, ຂ້ອຍສາມາດໃຊ້ຄໍາສັ່ງໂດຍ, ຂ້ອຍສາມາດເຮັດໄດ້ໂດຍບໍ່ມີ WHERE, ແລະມັນເຮັດວຽກ, ແຕ່ບໍ່ແມ່ນກັບມັນ ...
ແທນທີ່ “ໄລຍະຫ່າງຢູ່ໃສ” ດ້ວຍ “ໄລຍະທາງມີ”.
ເຮັດວຽກຄືກັບສະເໜ່, ຂອບໃຈ, Douglas!
ນີ້ແມ່ນຍິ່ງໃຫຍ່, ຢ່າງໃດກໍຕາມ, ຄືກັນກັບນົກບິນ. ມັນຈະເປັນການດີທີ່ຈະພະຍາຍາມແລະລວມເອົາ google maps API ເຂົ້າໄປໃນນີ້ somehow (ບາງທີການນໍາໃຊ້ຖະຫນົນຫົນທາງແລະອື່ນໆ.) ພຽງແຕ່ໃຫ້ຄວາມຄິດການນໍາໃຊ້ຮູບແບບການຂົນສົ່ງທີ່ແຕກຕ່າງກັນ. ຂ້າພະເຈົ້າຍັງບໍ່ທັນໄດ້ເຮັດຫນ້າທີ່ການຫມຸນແບບຈໍາລອງໃນ PHP ທີ່ຈະສາມາດສະເຫນີການແກ້ໄຂທີ່ມີປະສິດທິພາບຕໍ່ບັນຫານັກຂາຍການເດີນທາງ. ແຕ່ຂ້ອຍຄິດວ່າຂ້ອຍອາດຈະສາມາດໃຊ້ລະຫັດຂອງເຈົ້າຄືນໃຫມ່ເພື່ອເຮັດແນວນັ້ນ.
ສະບາຍດີ Douglas,
ຂອບໃຈຫຼາຍໆ ສຳ ລັບບົດຄວາມນີ້ - ທ່ານພຽງແຕ່ປະຫຍັດເວລາຫຼາຍ.
ເບິ່ງແຍງ,
nimrod @ Israel
ບົດຄວາມດີໆ! ຂ້ອຍພົບບົດຄວາມຫຼາຍຢ່າງທີ່ອະທິບາຍວິທີການຄິດໄລ່ໄລຍະຫ່າງລະຫວ່າງສອງຈຸດແຕ່ຂ້ອຍກໍ່ກໍາລັງຊອກຫາ SQL snippet.
ຂອບໃຈຫຼາຍໆ ເຮັດວຽກໄດ້ດີ
ຂອບໃຈຫຼາຍໆສໍາລັບສູດນີ້. ມັນໂກນບາງເວລາໃນໂຄງການຕັ້ງຮ້ານທີ່ກິນຢູ່ຂ້ອຍ.
ຂອບໃຈຊຸດ. ລະຫັດນ້ອຍໆນີ້ຊ່ວຍຂ້ອຍໄດ້ໃຊ້ເວລາຫຼາຍສົມຄວນໃນໂຄງການຕັ້ງຮ້ານ!
#1054 – ຖັນທີ່ບໍ່ຮູ້ຈັກ 'ໄລຍະຫ່າງ' ໃນ 'ບ່ອນໃດຂໍ້'
ອະນຸມັດ
ຄືກັນ! ມີບັນຫາຫຍັງ :-/? ວິທີການແກ້ໄຂ "ໄລຍະ" - ບັນຫາຖັນ? ຊ່ວຍພວກເຮົາ, ກະລຸນາ !! 🙂
ລອງໃຊ້ HAVING ແທນ WHERE
2 ມື້ຂອງການຄົ້ນຄວ້າເພື່ອສຸດທ້າຍຊອກຫາຫນ້ານີ້ທີ່ແກ້ໄຂບັນຫາຂອງຂ້ອຍ. ເບິ່ງຄືວ່າຂ້ອຍແຍກ WolframAlpha ຂອງຂ້ອຍອອກດີກວ່າແລະທົບທວນຄະນິດສາດຂອງຂ້ອຍ. ການປ່ຽນແປງຈາກບ່ອນທີ່ເປັນ HAVING ມີສະຄິບຂອງຂ້າພະເຈົ້າໃນຄໍາສັ່ງທີ່ເຮັດວຽກ. ຂອບໃຈ
ແທນທີ່ຈະໃຊ້ WHERE clause:
ມີໄລຍະຫ່າງ <50
ຂອບໃຈ George. ຂ້ອຍສືບຕໍ່ຊອກຫາຖັນ 'ໄລຍະຫ່າງ' ບໍ່ພົບ. ເມື່ອຂ້ອຍປ່ຽນບ່ອນທີ່ຈະມີມັນເຮັດວຽກຄືກັບສະເໜ່!
ຂ້າພະເຈົ້າປາດຖະຫນາວ່ານີ້ແມ່ນຫນ້າທໍາອິດທີ່ຂ້າພະເຈົ້າໄດ້ພົບເຫັນໃນນີ້. ຫຼັງຈາກພະຍາຍາມຫຼາຍຄໍາສັ່ງທີ່ແຕກຕ່າງກັນ, ນີ້ແມ່ນອັນດຽວທີ່ຈະເຮັດວຽກຢ່າງຖືກຕ້ອງ, ແລະມີການປ່ຽນແປງຫນ້ອຍທີ່ຈໍາເປັນເພື່ອໃຫ້ເຫມາະສົມກັບຖານຂໍ້ມູນຂອງຂ້ອຍເອງ.
ຂໍຂອບໃຈຫຼາຍ!
ຂ້າພະເຈົ້າປາດຖະຫນາວ່ານີ້ແມ່ນຫນ້າທໍາອິດທີ່ຂ້າພະເຈົ້າໄດ້ພົບເຫັນໃນນີ້. ຫຼັງຈາກພະຍາຍາມຫຼາຍຄໍາສັ່ງທີ່ແຕກຕ່າງກັນ, ນີ້ແມ່ນອັນດຽວທີ່ຈະເຮັດວຽກຢ່າງຖືກຕ້ອງ, ແລະມີການປ່ຽນແປງຫນ້ອຍທີ່ຈໍາເປັນເພື່ອໃຫ້ເຫມາະສົມກັບຖານຂໍ້ມູນຂອງຂ້ອຍເອງ.
ຂໍຂອບໃຈຫຼາຍ!
ຂອບໃຈຫຼາຍໆ!
ຂອບໃຈຫຼາຍໆ!
ຂ້ອຍບໍ່ຄິດວ່າລະຫັດຈະປາກົດຂຶ້ນອີກ. ບາງທີມັນອາດຈະເປັນ firefox?
ຂ້ອຍພຽງແຕ່ທົດສອບທັງໃນ Firefox ແລະ Chrome ແລະມັນປາກົດ. ລອງອີກຄັ້ງ?
ສະບາຍດີ. ຂອບໃຈຫຼາຍໆ. ອັນນີ້ເຮັດວຽກຄືກັບສະເໜ່.
ຂອບໃຈ Douglas ຫຼາຍ. ນີ້ແມ່ນເຮັດວຽກທີ່ສົມບູນແບບ.
ຂ້າພະເຈົ້າຮູ້ວ່າສູດນີ້ເຮັດວຽກ, ແຕ່ຂ້າພະເຈົ້າບໍ່ສາມາດເບິ່ງວ່າ radius ຂອງແຜ່ນດິນໂລກໄດ້ຮັບການພິຈາລະນາ. ໃຜສາມາດໃຫ້ຄວາມຮູ້ແກ່ຂ້ອຍໄດ້, ກະລຸນາ?
Tim, ສໍາລັບຄໍາອະທິບາຍຢ່າງເຕັມທີ່ຂອງສູດ Haversine (ນັ້ນບໍ່ແມ່ນລະຫັດ), ກວດເບິ່ງບົດຄວາມຂອງ Wikipedia: http://en.wikipedia.org/wiki/Haversine_formula
ງາມ! ອັນນີ້ໄດ້ຊ່ວຍຂ້ອຍຢ່າງມະຫາສານ!
Douglas ສິ່ງທີ່ຍິ່ງໃຫຍ່. ທ່ານໄດ້ພະຍາຍາມເອົາຈຸດຕັດກັນທີ່ໃຫ້ Long/Lat/Bearing ຂອງສອງຈຸດບໍ?
ຍັງບໍ່ທັນເຮັດເທື່ອ, Khanh!
ຂໍຂອບໃຈທ່ານ Douglas, SQL Query ແມ່ນສິ່ງທີ່ຂ້ອຍຕ້ອງການ, ແລະຂ້ອຍຄິດວ່າຂ້ອຍຕ້ອງຂຽນມັນເອງ. ເຈົ້າໄດ້ຊ່ວຍຂ້ອຍໃຫ້ລອດຈາກເສັ້ນໂຄ້ງການຮຽນຮູ້ເສັ້ນແວງຕາມລວງຕັ້ງຫຼາຍຊົ່ວໂມງ!
ຂ້ອຍສືບຕໍ່ໄດ້ຮັບ Errormessage: ຖັນທີ່ບໍ່ຮູ້ຈັກ 'ໄລຍະຫ່າງ' ໃນ 'ບ່ອນໃດຂໍ້' ໃນ MySQL Query.
ເປໂຕ, ກະລຸນາອ່ານຜ່ານຄໍາເຫັນອື່ນໆ. ປະກົດວ່າບາງຄົນຕ້ອງໃຊ້ syntax ທີ່ແຕກຕ່າງກັນສໍາລັບ WHERE/HAVING.
ຂໍຂອບໃຈທ່ານສໍາລັບບົດຄວາມທີ່ຍິ່ງໃຫຍ່ນີ້! ພຽງແຕ່ທົດສອບລະຫັດໃນ DB ຂອງຂ້ອຍແລະເຮັດວຽກໄດ້ດີ!
Douglas, ຂໍຂອບໃຈທ່ານສໍາລັບລະຫັດທີ່ຫນ້າອັດສະຈັນນີ້. ໄດ້ແຕກຫົວຂອງຂ້ອຍກ່ຽວກັບວິທີການເຮັດສິ່ງນີ້ຢູ່ໃນປະຕູຊຸມຊົນ GPS ຂອງຂ້ອຍ. ທ່ານໄດ້ຊ່ວຍປະຢັດຂ້າພະເຈົ້າຊົ່ວໂມງ.
ດີຫຼາຍທີ່ຈະໄດ້ຍິນ, Ash!
ຂອບໃຈສໍາລັບການປະກາດບົດຄວາມທີ່ເປັນປະໂຫຍດນີ້,
ແຕ່ສໍາລັບບາງເຫດຜົນຂ້າພະເຈົ້າຕ້ອງການຖາມ
ວິທີການເອົາໄລຍະຫ່າງລະຫວ່າງ coords ພາຍໃນ mysql db ແລະ coords ເຂົ້າໄປໃນ php ໂດຍຜູ້ໃຊ້?
ສໍາລັບການອະທິບາຍທີ່ຈະແຈ້ງເພີ່ມເຕີມ:
1. ຜູ້ໃຊ້ຕ້ອງໃສ່ [id] ສໍາລັບການເລືອກຂໍ້ມູນທີ່ກໍານົດໄວ້ຈາກ db ແລະລະຫັດຂອງຜູ້ໃຊ້ເອງ.
2. ໄຟລ໌ php ໄດ້ຮັບຂໍ້ມູນເປົ້າຫມາຍ (coords) ໂດຍໃຊ້ [id] ແລະຫຼັງຈາກນັ້ນຄິດໄລ່ໄລຍະຫ່າງລະຫວ່າງຜູ້ໃຊ້ແລະຈຸດເປົ້າຫມາຍ.
ຫຼືພຽງແຕ່ສາມາດເອົາໄລຍະທາງຈາກລະຫັດຂ້າງລຸ່ມນີ້?
$qry = “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) ເປັນໄລຍະທາງຈາກ `MyTable` ໄລຍະຫ່າງ >= “.$distance.” >>>>ຂ້ອຍສາມາດ “ເອົາ” ໄລຍະໄກຈາກບ່ອນນີ້ໄດ້ບໍ?
ຂອບໃຈອີກຄັ້ງ,
Timmy S
ບໍ່ສົນໃຈ, ຂ້ອຍໄດ້ຄິດອອກວ່າ "ຫນ້າທີ່" ເຮັດວຽກຢູ່ໃນ php
$dis=getDistanceBetweenPointsNew($userLati, $userLongi, $lati, $longi, $unit = 'Km')
ຂອບໃຈຫຼາຍໆ!!
ຕົກລົງ, ທຸກຢ່າງທີ່ຂ້ອຍໄດ້ພະຍາຍາມແມ່ນບໍ່ເຮັດວຽກ. ຂ້າພະເຈົ້າຫມາຍຄວາມວ່າ, ສິ່ງທີ່ຂ້ອຍມີວຽກເຮັດ, ແຕ່ໄລຍະຫ່າງແມ່ນທາງອອກ.
ມີໃຜອາດຈະເຫັນສິ່ງທີ່ຜິດພາດກັບລະຫັດນີ້?
if(isset($_POST['submitted'])){ $z = $_POST['zipcode']; $r = $_POST['radius']; echo “ຜົນໄດ້ຮັບສໍາລັບ “.$z; $sql = mysql_query(“SELECT DISTINCT m.zipcode, m.MktName,m.LocAddSt,m.LocAddCity,m.LocAddState,m.x1,m.y1,m.verified,z1.lat,z2.lon,z1. city,z1.state FROM mrk m, zip z1, zip z2 WHERE m.zipcode = z1.zipcode AND z2.zipcode = $z AND (3963 * acos( truncate( sin( z2.lat / 57.2958 ) ) * sin( m. y1 / 57.2958 ) + cos( z2.lat / 57.2958 ) * cos( m.y1 / 57.2958 ) * cos( m.x1 / 57.2958 – z2.lon / 57.2958 ) , 8 ) r ) ") ຫຼື <= $ (mysql_error()); while($row = mysql_fetch_array($sql )) { $store1 = $row['MktName'].""; $store = $row['LocAddSt'].””; $store .= $row['LocAddCity'].", ".$row['LocAddState']." “.$row['zipcode']; $latitude1 = $row['lat']; $longitude1 = $row['lon']; $latitude2 = $row['y1']; $longitude2 = $row['x1']; $city = $row['city']; $state = $row['state']; $dis = getnew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi'); // $dis = distance($lat1, $lon1, $lat2, $lon2); $verified = $row['verified']; if($verified == '1'){ echo “”; echo “”.$store.””; ສະທ້ອນ $dis . ”ໄມລ໌”; ສຽງສະທ້ອນ “”; } else { echo “”.$store.””; ສະທ້ອນ $dis . ”ໄມລ໌”; ສຽງສະທ້ອນ “”; } }}
ລະຫັດ functions.php ຂອງຂ້ອຍ
function getnew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi') { $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 'Mi': break; case 'Km' : $distance = $distance * 1.609344; } return (round($distance,2)); }
ຂອບໃຈລ່ວງຫນ້າ
ຂອບໃຈ ສຳ ລັບບົດຂຽນນີ້. ເຮັດວຽກໄດ້ດີກັບລະຫັດຂອງຂ້ອຍ. 🙂
Hey Douglas, ບົດຄວາມທີ່ຍິ່ງໃຫຍ່. ຂ້ອຍພົບຄໍາອະທິບາຍຂອງເຈົ້າກ່ຽວກັບແນວຄວາມຄິດທາງພູມສາດແລະລະຫັດທີ່ຫນ້າສົນໃຈແທ້ໆ. ຄໍາແນະນໍາດຽວຂອງຂ້ອຍແມ່ນໃຫ້ space ແລະ indent ລະຫັດສໍາລັບການສະແດງ (ເຊັ່ນ: Stackoverflow, ສໍາລັບການຍົກຕົວຢ່າງ). ຂ້າພະເຈົ້າເຂົ້າໃຈວ່າທ່ານຕ້ອງການອະນຸລັກພື້ນທີ່, ແຕ່ໄລຍະຫ່າງຂອງລະຫັດ / ການຫຍໍ້ຫນ້າແບບດັ້ງເດີມຈະເຮັດໃຫ້ຂ້ອຍ, ໃນຖານະນັກຂຽນໂປລແກລມ, ອ່ານແລະທໍາລາຍມັນງ່າຍຂຶ້ນຫຼາຍ. ຢ່າງໃດກໍຕາມ, ມັນເປັນເລື່ອງເລັກນ້ອຍ. ສືບຕໍ່ເຮັດວຽກທີ່ຍິ່ງໃຫຍ່.
ຂອບໃຈ! ຂ້າ ພະ ເຈົ້າ ໄດ້ ດັດ ແກ້ ການ ຕອບ ໄດ້ ພຽງ ເລັກ ນ້ອຍ ... ແຕ່ ສົມ ຜົນ ໃຊ້ ເວ ລາ ເຖິງ ຫ້ອງ ຫຼາຍ ດັ່ງ ນັ້ນ ແລະ ຍາວ ຫຼາຍ ດັ່ງ ນັ້ນ ຂ້າ ພະ ເຈົ້າ ບໍ່ ແນ່ ໃຈວ່ າ ມັນ ຊ່ວຍ ຫຼາຍ ເກີນ ໄປ.
ຂອບໃຈຫຼາຍໆ.
ທີ່ນີ້ໃນຂະນະທີ່ນໍາໃຊ້ກັບຟັງຊັນທີ່ພວກເຮົາກໍາລັງໄດ້ຮັບປະເພດຫນຶ່ງຂອງໄລຍະຫ່າງ..ໃນຂະນະທີ່ການນໍາໃຊ້ການສອບຖາມປະເພດອື່ນໆຂອງໄລຍະທາງມາ
ຂ້ອຍຈະບໍ່ຄິດໄລ່ໄລຍະຫ່າງລະຫວ່າງສອງລັດ
Muchas gracias por tan hermoso codigo…
ມັນເຮັດວຽກໄດ້ດີ. ຂ້ອຍບໍ່ຮູ້ຄະນິດສາດ, ແຕ່ຂອບໃຈ!
ວຽກດີ… 🙂 (y)
ມັນເບິ່ງຄືວ່າໄວກວ່າ (mysql 5.9) ການນໍາໃຊ້ສອງເທົ່າຂອງສູດໃນການເລືອກແລະບ່ອນທີ່:
$formula = “(((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)”;
$sql = 'SELECT *, '.$formula.' ເປັນໄລຍະຫ່າງຈາກຕາຕະລາງທີ່ '..$formula.' <= '.$distance;
ຂອບໃຈ…
ບໍ່ເຮັດວຽກຖ້າ
“ໄລຍະທາງຢູ່ໃສ”
ເຮັດວຽກຖ້າ
“ມີໄລຍະທາງ”
ຂອບໃຈຫຼາຍໆສໍາລັບການຕັດບົດຄວາມນີ້.ມັນເປັນປະໂຫຍດຫຼາຍ.
PHP ໄດ້ຖືກສ້າງຂື້ນໃນຄັ້ງທໍາອິດເປັນເວທີການຂຽນແບບງ່າຍໆທີ່ເອີ້ນວ່າ "ຫນ້າທໍາອິດສ່ວນບຸກຄົນ". ໃນປັດຈຸບັນ PHP (ສັ້ນສໍາລັບ Hypertext Preprocessor) ເປັນທາງເລືອກຂອງເຕັກໂນໂລຢີ Microsoft's Active Server Pages (ASP).
PHP ເປັນພາສາຂ້າງເຊີບເວີແຫຼ່ງເປີດທີ່ຖືກນໍາໃຊ້ສໍາລັບການສ້າງຫນ້າເວັບແບບເຄື່ອນໄຫວ. ມັນສາມາດຖືກຝັງຢູ່ໃນ HTML. PHP ປົກກະຕິແລ້ວແມ່ນໃຊ້ຮ່ວມກັບຖານຂໍ້ມູນ MySQL ໃນເຊີບເວີເວັບ Linux/UNIX. ມັນອາດຈະເປັນພາສາສະຄິບທີ່ນິຍົມທີ່ສຸດ.
ຂ້ອຍພົບວ່າການແກ້ໄຂຂ້າງເທິງນີ້ບໍ່ເຮັດວຽກຢ່າງຖືກຕ້ອງ.
ຂ້ອຍຈໍາເປັນຕ້ອງປ່ຽນເປັນ:
$qqq = “SELECT *,(((acos(sin(“.$latitude.”*pi()/180))) * sin((`latt`*pi()/180))+cos((” . $latitude . “*pi()/180)) * cos((`latt`*pi()/180)) * cos(((” . $longitude . “- `longt`)*pi()/180) )))*180/pi())*60*1.1515) ເປັນໄລຍະຫ່າງຈາກ `ລົງທະບຽນ` “;
ຂອບໃຈ Kupendra!
ຂໍຂອບໃຈທ່ານ wroking ຢ່າງສົມບູນ.. ແຕ່ຂ້າພະເຈົ້າມີຄໍາຖາມຫນຶ່ງຖ້າຫາກວ່າຂ້າພະເຈົ້າຕ້ອງການທີ່ຈະ output ບໍ່ມີຈຸດທົດສະນິຍົມ, ຂ້ອຍຈະເຮັດແນວໃດ..?
ຂອບໃຈລ່ວງຫນ້າ.
ສະບາຍດີ, ຂ້ອຍຕ້ອງການຄວາມຊ່ວຍເຫຼືອຂອງເຈົ້າໃນເລື່ອງນີ້.
ຂ້ອຍໄດ້ຮ້ອງຂໍໃຫ້ເຄື່ອງແມ່ຂ່າຍເວັບຂອງຂ້ອຍ http://localhost:8000/users/findusers/53.47792/-2.23389/20/
53.47792 = $latitude
-2.23389 = $longitude
ແລະ 20 = ໄລຍະຫ່າງທີ່ຂ້ອຍຕ້ອງການດຶງຂໍ້ມູນ
ຢ່າງໃດກໍຕາມ, ການນໍາໃຊ້ສູດຂອງທ່ານ, ມັນດຶງແຖວທັງຫມົດໃນ db ຂອງຂ້ອຍ
$results = DB::select( DB::raw(“SELECT *, ((acos(sin((“.$latitude.”*pi()/180)))) * sin((lat*pi()/180. ))+cos((“.$latitude.”*pi()/180)) * cos((lat*pi()/180)) * cos(((“.$longitude.”- lng)*pi( )/180))))*180/pi())*60*1.1515*1.609344) as distance FROM markers have distance >= “.$distance ));
[{“id”:1,”name”:”Frankie Johnnie & Luigo Too”,”address”:”939 W El Camino Real, Mountain View, CA”,”lat”:37.386337280273,”lng”:-122.08582305908, ”distance”:16079.294719663},{“id”:2,”name”:”Amici's East Coast Pizzeria”,”address”:”790 Castro St, Mountain View, CA”,”lat”:37.387138366699,”lng”: -122.08323669434,”distance”:16079.175940152},{“id”:3,”name”:”Kapp's Pizza Bar & Grill”,”address”:”191 Castro St, Mountain View, CA”,”lat”:37.393886566162, ”lng”:-122.07891845703,”distance”:16078.381373826},{“id”:4,”name”:”Round Table Pizza: Mountain View”,”address”:”570 N Shoreline Blvd, Mountain View, CA”, ”lat”:37.402652740479,”lng”:-122.07935333252,”distance”:16077.420540582},{“id”:5,”name”:”Tony & Alba's Pizza & Pasta”,”619vecu,”Esla”,”ພູດອຍ”:” View, CA”,”lat”:37.394012451172,”lng”:-122.09552764893,”distance”:16078.563225154},{“id”:6,”name”:”Oregano's Wood-Fired Pizza:”,”4546”,” El Camino Real, Los Altos, CA”,”lat”:37.401725769043,”lng”:-122.11464691162,”ໄລຍະຫ່າງ”:16077.937560795},{“ id”:7,”name”:”The bars and grills”,”address”:”24 Whiteley Street, Manchester”,”lat”:53.485118865967,”lng”:-2.1828699111938,”distance”:8038.7620112314}
ຂ້າພະເຈົ້າຕ້ອງການທີ່ຈະດຶງເອົາພຽງແຕ່ແຖວທີ່ມີ 20 ໄມ, ແຕ່ວ່າມັນເອົາທັງຫມົດແຖວ. ກະລຸນາຂ້ອຍເຮັດຫຍັງຜິດ
ຂ້ອຍກໍາລັງຊອກຫາຄໍາຖາມທີ່ຄ້າຍຄືກັນແຕ່ໄດ້ກ້າວຂຶ້ນເລັກນ້ອຍ - ໃນສັ້ນນີ້ແມ່ນການຈັດກຸ່ມພິກັດທັງຫມົດພາຍໃນ 2 ໄມຂອງແຕ່ລະພິກັດແລະຫຼັງຈາກນັ້ນນັບຈໍານວນພິກັດໃນແຕ່ລະກຸ່ມແລະຜົນໄດ້ຮັບພຽງແຕ່ກຸ່ມຫນຶ່ງທີ່ມີຈຸດປະສານງານຫຼາຍທີ່ສຸດ - ເຖິງແມ່ນວ່າ. ທ່ານມີຫຼາຍກ່ວາຫນຶ່ງກຸ່ມໃນບັນດາກຸ່ມທີ່ມີຈໍານວນຫຼາຍທີ່ສຸດຂອງການປະສານງານ - ພຽງແຕ່ອອກກຸ່ມ Random ຈາກກຸ່ມທີ່ມີຈໍານວນໃຫຍ່ທີ່ສຸດດຽວກັນ -