GIS සම්බන්ධයෙන් මේ මාසයේ මම PHP සහ MySQL හි තරමක් වැඩසටහන්ගත කර ඇත. දැල වටා සැරිසැරීම, මට ඇත්ත වශයෙන්ම සමහරක් සොයා ගැනීමට අපහසු විය භූගෝලීය ගණනය කිරීම් ස්ථාන දෙකක් අතර දුර සොයා ගැනීමට මට ඒවා මෙහි බෙදා ගැනීමට අවශ්ය විය.
ලක්ෂ්ය දෙකක් අතර දුර ගණනය කිරීමේ සරලම ක්රමය වන්නේ ත්රිකෝණයක (A² + B² = C²) උපකල්පිතය ගණනය කිරීම සඳහා පයිතගරස් සූත්රය භාවිතා කිරීමයි. මෙය හැඳින්වෙන්නේ යුක්ලීඩියානු දුර.
එය සිත්ගන්නාසුලු ආරම්භයක් නමුත් අක්ෂාංශ හා දේශාංශ රේඛා අතර දුර බැවින් එය භූගෝලය සමඟ අදාළ නොවේ සමාන දුර නොවේ වෙන්ව. ඔබ සමකයට සමීප වන විට අක්ෂාංශ රේඛා තව දුරටත් වෙන් වේ. ඔබ යම් ආකාරයක සරල ත්රිකෝණ සමීකරණයක් භාවිතා කරන්නේ නම්, එය පෘථිවියේ වක්රය නිසා එක් ස්ථානයක දුර නිවැරදිව මැනිය හැකි අතර අනෙක් ස්ථානයේ දරුණු ලෙස වැරදිය.
විශාල රවුම් දුර
පෘථිවිය වටා බොහෝ දුර ගමන් කරන මාර්ග හැඳින්වෙන්නේ විශාල රවුම් දුර. එනම්... ගෝලයක ලක්ෂ්ය දෙකක් අතර ඇති කෙටිම දුර පැතලි සිතියමක ලක්ෂ්යවලට වඩා වෙනස් වේ. අක්ෂාංශ සහ දේශාංශ රේඛා සමාන දුරස්ථ නොවන බව සමඟ එය ඒකාබද්ධ කරන්න... ඔබට අපහසු ගණනය කිරීමක් ඇත.
මහා කවයන් ක්රියා කරන ආකාරය පිළිබඳ අපූරු වීඩියෝ පැහැදිලි කිරීමක් මෙන්න.
හැවර්සින් සූත්රය
පෘථිවියේ වක්රය භාවිතා කරන දුර ප්රමාණය හැවර්සින් සූත්රය, පෘථිවියේ වක්රතාවයට ඉඩ දීම සඳහා ත්රිකෝණමිතිය භාවිතා කරයි. ඔබ පෘථිවියේ ස්ථාන 2 ක් අතර දුර සොයා ගන්නා විට (කකුළුවා පියාසර කරන විට), සරල රේඛාවක් යනු සැබවින්ම චාපයකි.
ගුවන් ගමන් වලදී මෙය අදාළ වේ - ඔබ කවදා හෝ සත්ය ගුවන් ගමන් සිතියම දෙස බලා ඒවා ආරුක්කු කර ඇති බව දැක තිබේද? එයට හේතුව සෘජුවම ස්ථානයට වඩා ලකුණු දෙකක් අතර ආරුක්කුවක පියාසර කිරීම කෙටි වීමයි.
PHP: අක්ෂාංශ හා දේශාංශ ලක්ෂ්ය 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 - ඔබගේ පළමු ස්ථානයේ අක්ෂාංශ සඳහා විචල්යයක්.
- $Longitude1 - ඔබගේ පළමු ස්ථානයේ දේශාංශ සඳහා විචල්යයක්
- $Latitude2 - ඔබගේ දෙවන ස්ථානයේ අක්ෂාංශ සඳහා විචල්යයක්.
- $Longitude2 - ඔබගේ දෙවන ස්ථානයේ දේශාංශ සඳහා විචල්යයක්.
- $ ඒකකය - පෙරනිමිය දහස් ගනන්. මෙය යාවත්කාලීන කිරීමට හෝ සම්මත කිරීමට හැකිය කිලෝමීටර.
පයිතන්: අක්ෂාංශ සහ දේශාංශ 2ක් අතර දුර ගණනය කරන්න
කෙසේ වෙතත්, ලක්ෂ්ය දෙකක් අතර දුර (සැතපුම් එදිරිව කිලෝමීටර් පරිවර්තනය සමඟ) දශම ස්ථාන දෙකකට වට කර ගණනය කිරීම සඳහා පයිතන් සූත්රය මෙන්න. දත්ත විද්යාඥයෙකු වන මගේ පුතා බිල් කාර්ට ගෞරවය විවෘත INSIGHTS, කේතය සඳහා.
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 විමසමි.
නිශ්චිත වාර්තාවක් තුළ සියලුම වාර්තා ලබා ගැනීම සඳහා විමසුම දුර අක්ෂාංශ හා දේශාංශ දෙක අතර සැතපුම් දුර ගණනය කිරීමෙන්:
$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 විචල්යයක් වන අතර එහිදී මම ලක්ෂ්යයේ දේශාංශ පසු කරමි.
- $ අක්ෂාංශ - මෙය PHP විචල්යයක් වන අතර එහිදී මම ලක්ෂ්යයේ දේශාංශ පසු කරමි.
- $ දුර - මෙය ඔබ සියලු වාර්තා අඩු හෝ සමාන සොයා ගැනීමට කැමති දුර වේ.
- වගුවයි - මේසය මෙයයි… ඔබට එය ඔබගේ වගුවේ නම සමඟ ආදේශ කිරීමට අවශ්ය වනු ඇත.
- අක්ෂාංශ - මෙය ඔබේ අක්ෂාංශ ක්ෂේත්රයයි.
- දේශාංශ - මෙය ඔබේ දේශාංශයේ ක්ෂේත්රයයි.
MySQL: අක්ෂාංශ සහ දේශාංශ භාවිතා කරමින් කිලෝමීටර් වලින් දුර ගණනය කිරීමෙන් පරාසයක් තුළ සියලුම වාර්තා ලබා ගැනීම
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."
ඔබට මෙය රිසිකරණය කිරීමට අවශ්ය වනු ඇත:
- $ දේශාංශ - මෙය PHP විචල්යයක් වන අතර එහිදී මම ලක්ෂ්යයේ දේශාංශ පසු කරමි.
- $ අක්ෂාංශ - මෙය PHP විචල්යයක් වන අතර එහිදී මම ලක්ෂ්යයේ දේශාංශ පසු කරමි.
- $ දුර - මෙය ඔබ සියලු වාර්තා අඩු හෝ සමාන සොයා ගැනීමට කැමති දුර වේ.
- වගුවයි - මේසය මෙයයි… ඔබට එය ඔබගේ වගුවේ නම සමඟ ආදේශ කිරීමට අවශ්ය වනු ඇත.
- අක්ෂාංශ - මෙය ඔබේ අක්ෂාංශ ක්ෂේත්රයයි.
- දේශාංශ - මෙය ඔබේ දේශාංශයේ ක්ෂේත්රයයි.
මම මෙම කේතය උතුරු ඇමරිකාව පුරා ස්ථාන 1,000 කට අධික සංඛ්යාවක් සහිත සිල්ලර වෙළඳසැලක් සඳහා භාවිතා කළ ව්යවසාය සිතියම්කරණ වේදිකාවක භාවිතා කළ අතර එය ඉතා අලංකාර ලෙස ක්රියාත්මක විය.
Microsoft SQL Server භූගෝලීය දුර: STDistance
ඔබ Microsoft SQL Server භාවිතා කරන්නේ නම්, ඔවුන් ඔවුන්ගේම කාර්යයක් ලබා දෙයි, ST දුර භූගෝලීය දත්ත වර්ගය භාවිතයෙන් ලකුණු දෙකක් අතර දුර ගණනය කිරීම සඳහා.
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);
VP සහ ගෘහ නිර්මාණ ශිල්පී Manash Sahoo වෙත තොප්පි ඉඟිය Highbridge.
බෙදාගැනීම ගැන ඔබට බොහෝම ස්තූතියි. මෙය පහසු පිටපත් හා පේස්ට් කාර්යයක් වූ අතර එය විශිෂ්ට ලෙස ක්රියා කරයි. ඔබ මට බොහෝ කාලයක් ඉතිරි කර ඇත.
සී වෙත පිවිසෙන ඕනෑම අයෙකුට FYI:
double deg2rad (double deg) {return deg * (3.14159265358979323846 / 180.0); }
ඉතා හොඳ පෝස්ට් කෑල්ලක් - ඉතා හොඳට වැඩ කළා - මට සිදු වූයේ මේසයේ නම වෙනස් කිරීමට පමණි. එය ඉතා වේගයෙන් ක්රියාත්මක වේ .. මට සෑහෙන තරම් කුඩා සංඛ්යාවක් (<400) ඇත, නමුත් මම සිතන්නේ මෙය මනාව පරිමාණය වනු ඇත. ලස්සන වෙබ් අඩවියක් ද - මම එය මගේ del.icio.us ගිණුමට එක් කර ඇති අතර එය නැවත පරීක්ෂා කරමි.
බොහොම ස්තූතියි පීටර් සහ කෙරී! ඔබ GIS ව්යාපෘතිවල වැඩ කිරීමට කැමති නම්, මම නිර්දේශ කරමි:
බොහොම ස්තූතියි…
දුර ගණනය කිරීම් සඳහා මම මුළු දවසම සොයා බැලූ අතර, හාවර්සීන් ඇල්ගොරිතම සොයාගතිමි, එය වර්ග ප්රකාශයක තැබිය යුතු ආකාරය පිළිබඳ උදාහරණය ලබා දීම ගැන ඔබට ස්තූතියි. ස්තූතියි, සුබ පැතුම් ඩැනියෙල්
උදව් කිරීමට සතුටුයි, රේල් පීලි මිතුරා!
දැන් මම 'ඉන් පොලිගොන්' පීඑච්පී ශ්රිතයක් සොයමින් සිටින අතර එය අනුක්රමික අක්ෂාංශ හා දේශාංශ ඛණ්ඩාංක රාශියක් ගෙන වෙනත් ලක්ෂ්යයක් බහුඅස්රයේ හෝ ඉන් පිටත තිබේදැයි සොයා බලයි.
මම සොයාගත්තා බහු කෝණයක ලක්ෂ්යයක් ඇත්දැයි සොයා ගැනීමට සමීකරණය!
මම හිතන්නේ ඔබේ SQL ට ප්රකාශයක් අවශ්යයි.
WHERE දුර වෙනුවට <= $ ඔබට අවශ්ය විය හැකි දුර
HAVING දුර <= $ දුර භාවිතා කරන්න
නැතිනම් මට කාලය හා ශක්තිය ඉතිරි කර ගැනීමට ස්තූතියි.
හායි ඩේවිඩ්,
ඔබ කිසියම් ආකාරයක GROUP BY ප්රකාශයක් කරන්නේ නම්, ඔබට HAVING අවශ්ය වේ. ඉහත උදාහරණයෙන් මම එය නොකරමි.
ඩග්
MySQL 5.x අනුව, ඔබට WHERE වගන්තියක් දකින විට අන්වර්ථයක් භාවිතා කළ නොහැක http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
ඉහත විමසුම් වල WHERE වෙනුවට HAVING භාවිතා කරන්න
බොහොම ස්තූතියි. ඔයා නියම වැඩක් කරලා තියෙනවා තමයි මට ඇත්තටම අවශ්ය දේ. ගොඩක් ස්තුතියි.
මෙම කේතය බෙදා ගැනීම ගැන ඔබට බොහෝම ස්තූතියි. එය මට බොහෝ සංවර්ධන කාලය ඉතිරි කළේය. MySQL 5.x සඳහා HAVING ප්රකාශයක් අවශ්ය බව පෙන්වා දීම ගැන ඔබේ පා readers කයන්ට ස්තූතියි. ඉතා ප්රයෝජනවත්.
මට වඩා බුද්ධිමත් පා readers කයන් සිටීම මට භාග්යයක්!
🙂
ඉහත සූත්රය මට බොහෝ කාලයක් ඉතිරි කරයි. බොහොම ස්තූතියි.
මට 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 ලෙස වෙනස් කර ඇති අතර සියල්ල පරිපූර්ණ ලෙස ක්රියා කරයි. මුලදී මම අදහස් කියවා කැදැලි තේරීමක් භාවිතා කර නැවත ලිව්වේ නැත. දෙකම හොඳින් ක්රියාත්මක වේ.
MySQL හි ලියා ඇති ස්ක්රිප්ටයට ස්තූතියි, සුළු වෙනස් කිරීම් කිහිපයක් කිරීමට සිදු විය (HAVING)
හොඳ රැකියාවක්
ඇදහිය නොහැකි තරම් ප්රයෝජනවත්, ඔබට බොහෝම ස්තූතියි! මට “කොහේද” යන්නට වඩා නව “හැවිං” සමඟ යම් යම් ගැටලු ඇති විය, නමුත් වරක් මම මෙහි අදහස් කියවූ පසු (කලකිරීමෙන් දත් ඇඹරීමෙන් පැය භාගයකට පමණ පසු = පී), මම එය හොඳින් ක්රියාත්මක කළෙමි. ස්තූතියි ^ _ ^
ස්තූතියි ගොඩක් වැඩ කරයි
එවැනි තෝරාගත් ප්රකාශයක් ඉතා පරිගණකමය වශයෙන් තීව්ර වන අතර එම නිසා මන්දගාමී බව මතක තබා ගන්න. ඔබට එම විමසීම් බොහොමයක් තිබේ නම්, එය ඉක්මණින් දේවල් අවුල් කළ හැකිය.
වඩා අඩු තීව්ර ප්රවේශයක් නම්, ගණනය කළ දුර ප්රමාණයකින් අර්ථ දක්වා ඇති පළමු (බොරතෙල්) තේරීමක් ක්රියාත්මක කිරීම, එනම් “වගු නාමයෙන් * තෝරන්න * එහිදී lat1 සහ lat2 අතර අක්ෂාංශ සහ lon1 සහ lon2 අතර දේශාංශය. lat1 = targetlatitude - latdiff, lat2 = targetlatitude + latdiff, lon හා සමානයි. latdiff ~ = දුර / 111 (km සඳහා), හෝ අක්ෂාංශ අංශක 69 සිට කිලෝමීටර 1 ක් දුරින් සැතපුම් 111 ක් (පෘථිවිය තරමක් ඕවලාකාර බැවින් සුළු විචලනයකි, නමුත් මේ සඳහා ප්රමාණවත්) londiff = දුර / (abs (cos (deg2rad (අක්ෂාංශ)) * 111%) - හෝ සැතපුම් 69 ක් (වෙනස්කම් සඳහා ගණනය කිරීම සඳහා ඔබට සැබවින්ම තරමක් විශාල චතුරස්රයක් ගත හැකිය). ඉන්පසු එහි ප්රති result ලය ගෙන රේඩියල් වරණයට පෝෂණය කරන්න. සීමාවෙන් පිටත ඛණ්ඩාංක සඳහා ගණනය කිරීමට අමතක නොකරන්න - එනම් පිළිගත හැකි දේශාංශයේ පරාසය -180 සිට +180 දක්වා වන අතර පිළිගත හැකි අක්ෂාංශ පරාසය -90 සිට +90 දක්වා වේ - ඔබේ වැසිකිළිය හෝ ලොන්ඩිෆ් මෙම පරාසයෙන් පිටත ධාවනය වන්නේ නම් . බොහෝ අවස්ථාවන්හීදී මෙය අදාළ නොවිය හැකි බැවින් එය පැසිෆික් සාගරය හරහා ධ්රැවයේ සිට ධ්රැවය දක්වා වූ රේඛාවක් හරහා ගණනය කිරීම් වලට පමණක් බලපාන නමුත් එය චුකොට්කා හා ඇලස්කාවේ කොටසක් සමඟ සම්බන්ධ වේ.
අප මෙයින් ඉටු කරන්නේ ඔබ මෙම ගණනය කරන ලකුණු සංඛ්යාවේ සැලකිය යුතු අඩුවීමකි. ඔබට දළ වශයෙන් ඒකාකාරව බෙදා හරින ලද දත්ත සමුදායේ ගෝලීය ලක්ෂ මිලියනයක් තිබේ නම් සහ ඔබට කිලෝමීටර 100 ක් තුළ සෙවීමට අවශ්ය නම්, ඔබේ පළමු (වේගවත්) සෙවීම වර්ග කිලෝමීටර 10000 ක භූමි ප්රමාණයකින් යුක්ත වන අතර බොහෝ විට ප්රති results ල 20 ක් පමණ ලැබෙනු ඇත (බෙදා හැරීම පවා පදනම් කරගෙන) වර්ග කිලෝමීටර 500 ක පමණ භූමි ප්රමාණයක්), එයින් අදහස් වන්නේ ඔබ මිලියනයක වාරයක් වෙනුවට මෙම විමසුම සඳහා සංකීර්ණ දුර ගණනය 20 වතාවක් ධාවනය කරන බවයි.
උදාහරණයේ ඇති කුඩා අත්වැරැද්ද… එය අපගේ… චතුරස්රයේ “අරය” දෙස බලන බැවින් එය කිලෝමීටර 50 ක් (100 ක් නොවේ) වේ.
අපූරු උපදෙස්! මම ඇත්ත වශයෙන්ම වැඩ කළේ ඇතුළත චතුරස්රය ඇද ගන්නා ශ්රිතයක් ලියා ඇති පුනරාවර්තන ශ්රිතයක් වන අතර ඉතිරි ලකුණු ඇතුළත් කර බැහැර කිරීම සඳහා පරිමිතිය වටා 'චතුරස්ර' සෑදූ පුනරාවර්තන ශ්රිතයකි. ප්රති result ලය ඇදහිය නොහැකි තරම් වේගවත් ප්රති result ලයක් විය - ඔහුට මයික්රෝ තත්පර වලින් ලකුණු මිලියන ගණනක් තක්සේරු කළ හැකිය.
ඉහත මගේ ප්රවේශය අනිවාර්යයෙන්ම 'ගොරහැඩි' නමුත් හැකියාව ඇත. නැවත ස්තූතියි!
ඩග්,
බහුඅස්රයක් තුළ අග දිගු ලක්ෂ්යයක් තිබේද යන්න තක්සේරු කිරීමට මම mysql සහ php භාවිතා කිරීමට උත්සාහ කරමි. ඔබේ සංවර්ධක මිතුරා මෙම කාර්යය ඉටු කරන්නේ කෙසේද යන්න පිළිබඳ උදාහරණ ප්රකාශයට පත් කළේදැයි ඔබ දන්නවාද? නැත්නම් හොඳ උදාහරණ ඔබ දන්නවාද? කලින්ම ස්තූතියි.
ආයුබෝවන් හැමෝටම මෙය මගේ පරීක්ෂණ 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
සහ මිස්ක්ල් මට කියන්නේ දුර, තීරුවක් ලෙස නොපවතින බවත්, මට ඇණවුම භාවිතා කළ හැකි බවත්, මට එය කොතැනකවත් කළ නොහැකි බවත්, එය ක්රියාත්මක වන නමුත් එය සමඟ නොවේ…
“කොතැනද” යන්න “ඇති දුර” සමඟ ප්රතිස්ථාපනය කරන්න.
චමත්කාරයක් වගේ වැඩ කරනවා, ස්තූතියි, ඩග්ලස්!
මෙය විශිෂ්ටයි, කෙසේ වෙතත් එය කුරුල්ලන් පියාසර කරනවා හා සමානයි. ගූගල් සිතියම් ඒපීඅයි කෙසේ හෝ මේ සඳහා සම්බන්ධ කර ගැනීමට උත්සාහ කිරීම ඉතා හොඳය (සමහර විට මාර්ග භාවිතා කිරීම ආදිය) වෙනත් ආකාරයක ප්රවාහන ක්රමයක් භාවිතා කරමින් අදහසක් ලබා දීමට. සංචාරක විකුණුම් කරුවන්ගේ ගැටලුවට කාර්යක්ෂම විසඳුමක් ලබා දිය හැකි PHP හි අනුකරණය කළ හැකි ක්රියාකාරීත්වයක් මා විසින් තවමත් සිදු කර නොමැත. නමුත් ඔබේ කේතය සමහරක් නැවත භාවිතා කිරීමට මට හැකි වනු ඇතැයි මම සිතමි.
හායි ඩග්ලස්,
මෙම ලිපියට බොහෝම ස්තූතියි - ඔබ මට බොහෝ කාලයක් ඉතිරි කළා.
ප්රවේසම් වන්න,
නිම්රොඩ් s ඉශ්රායෙල්
හොඳ ලිපියක්! කරුණු දෙකක් අතර දුර ගණනය කරන්නේ කෙසේදැයි විස්තර කරන ලිපි රාශියක් මට හමු වූ නමුත් මම සැබවින්ම සොයන්නේ SQL ස්නිපටයයි.
ස්තූතියි ගොඩක් හොඳයි
මෙම සූත්රයට බොහෝම ස්තූතියි. එය මා කමින් සිටි ගබඩා ස්ථාන ව්යාපෘතියක යම් කාලයක් රැවුල කපයි.
ස්තූතියි මිටියක්. මෙම කුඩා කේත රේඛාව ගබඩා ස්ථාන ව්යාපෘතියක සැලකිය යුතු කාලයක් ඉතිරි කළේය!
# 1054 - 'කොහේද වගන්තිය' තුළ නොදන්නා තීරුව 'දුර'
අනුමත කරයි
මෙහෙත් එහෙමයි! මොකක්ද ප්රශ්නේ :-/? “දුර” - තීරු ගැටළුව විසඳන්නේ කෙසේද? කරුණාකර අපට උදව් කරන්න !! 🙂
WHERE වෙනුවට HAVING භාවිතා කිරීමට උත්සාහ කරන්න
මගේ ගැටලුව විසඳන මෙම පිටුව සොයා ගැනීමට දින 2 ක පර්යේෂණ. පේන විදියට මම මගේ වුල්ෆ්රාම් ඇල්ෆා ගලවා මගේ ගණිතය මදින්න. WHERE සිට HAVING දක්වා වෙනස් කිරීම මගේ ස්ක්රිප්ට් එක වැඩ කරන පිළිවෙලට ඇත. ඔබට ස්තුතියි
WHERE වගන්තිය භාවිතය වෙනුවට:
දුර <50
ස්තූතියි ජෝර්ජි. මම දිග 'තීරුව' සොයා නොගත්තෙමි. මම කොතැනටද යන්න වෙනස් කළ පසු එය චමත්කාරජනක ලෙස ක්රියා කරයි!
මම මේ ගැන සොයාගත් පළමු පිටුව මෙය යැයි සිතමි. විවිධ විධානයන් අත්හදා බැලීමෙන් පසු නිසි ලෙස ක්රියා කළ හැකි එකම ක්රමය මෙය වූ අතර මගේ දත්ත ගබඩාවට සරිලන පරිදි අවම වෙනස්කම් අවශ්ය විය.
ගොඩක් ස්තුතියි!
මම මේ ගැන සොයාගත් පළමු පිටුව මෙය යැයි සිතමි. විවිධ විධානයන් අත්හදා බැලීමෙන් පසු නිසි ලෙස ක්රියා කළ හැකි එකම ක්රමය මෙය වූ අතර මගේ දත්ත ගබඩාවට සරිලන පරිදි අවම වෙනස්කම් අවශ්ය විය.
ගොඩක් ස්තුතියි!
ගොඩක් ස්තුතියි!
ගොඩක් ස්තුතියි!
මම හිතන්නේ නැහැ කේතය තවදුරටත් පෙන්වයි කියලා. සමහර විට එය ෆයර්ෆොක්ස් ද?
මම ෆයර්ෆොක්ස් සහ ක්රෝම් යන දෙකින්ම අත්හදා බැලුවෙමි. නැවත උත්සහා කරන්න?
හායි. ගොඩක් ස්තුතියි. මෙය චාම් එකක් මෙන් ක්රියා කරයි.
ගොඩක් ස්තූතියි ඩග්ලස්. මෙය පරිපූර්ණව ක්රියාත්මක වේ.
මෙම සූත්රය ක්රියාත්මක වන බව මම දනිමි, නමුත් පෘථිවියේ අරය සැලකිල්ලට ගන්නේ කොතැනදැයි මට නොපෙනේ. කරුණාකර කිසිවෙකුට මාව දැනුවත් කළ හැකිද?
ටිම්, හැවර්සීන් සූත්රය පිළිබඳ සම්පූර්ණ පැහැදිලි කිරීමක් සඳහා (එය කේතය නොවේ), විකිපීඩියාවේ ලිපිය බලන්න: http://en.wikipedia.org/wiki/Haversine_formula
ලස්සනයි! මෙය මට ඉමහත් උපකාරයක් වී තිබේ!
නියම දේවල් ඩග්ලස්. ලකුණු දෙකක් දිගු / අග / දරණ ලෙස ලබා දී මංසන්ධි ලක්ෂ්යය ලබා ගැනීමට ඔබ උත්සාහ කර තිබේද?
තාම ඒක කරලා නෑ ඛාන්!
ස්තූතියි ඩග්ලස්, SQL විමසුම මට අවශ්ය දේමයි, මම සිතුවේ එය මා විසින්ම ලිවිය යුතු බවයි. පැය ගණනක් අක්ෂාංශ දේශාංශ ඉගෙනීමේ වක්රයෙන් ඔබ මාව බේරා ගත්තා!
MySQL විමසුමේ 'කොහේද' යන වගන්තියේ 'දුර' නොදන්නා තීරුව මට ලැබෙමින් පවතී.
පීටර්, කරුණාකර අනෙක් අදහස් කියවන්න. WHERE / HAVING සඳහා සමහර පුද්ගලයින්ට වෙනස් වාක්ය ඛණ්ඩයක් භාවිතා කිරීමට සිදු වූ බව පෙනේ.
මෙම විශිෂ්ට ලිපියට ස්තූතියි! මගේ ඩීබී කේතය පරීක්ෂා කර විශිෂ්ට ලෙස ක්රියා කළා!
ඩග්ලස්, මෙම විස්මිත කේතයට ස්තූතියි. මගේ ජීපීඑස් ප්රජා ද්වාරයෙහි මෙය කරන්නේ කෙසේද යන්න පිළිබඳව මගේ හිස ගසා දමයි. ඔබ මට පැය ගණනක් ඉතිරි කළා.
අහන්න නියමයි, අෂ්!
මෙම ප්රයෝජනවත් ලිපිය පළ කිරීම ගැන ස්තූතියි,
නමුත් කිසියම් හේතුවක් නිසා මම අහන්න කැමතියි
mysql db තුළ ඇති කෝඩ් සහ පරිශීලකයා විසින් php වෙත ඇතුළත් කර ඇති coords අතර දුර ලබා ගන්නේ කෙසේද?
වඩාත් පැහැදිලිව විස්තර කිරීම සඳහා:
1.ber විසින් db සහ පරිශීලකයාගේ කේත වලින් නිශ්චිත දත්ත තෝරා ගැනීම සඳහා [id] ඇතුළත් කළ යුතුය
2. php ගොනුව [id] භාවිතා කර ඉලක්ක දත්ත (coords) ලබාගෙන පරිශීලකයා සහ ඉලක්ක ලක්ෂ්යය අතර දුර ගණනය කරන්න
නැතහොත් පහත කේතයෙන් දුරක් ලබා ගත හැකිද?
$ qry = “SELECT *, ((acos (sin ((“. $ latitude. ”* pi () / 180)) * sin ((` Latitude` * pi () / 180%)) + cos ((“. $ අක්ෂාංශ. ”* pi () / 180)) * cos ((` අක්ෂාංශ` * pi () / 180)) * cos ((“. ))) * 180 / pi ()) * 180 * 60 * 1.1515) `MyTable` වෙතින් දුර ලෙස> =“. $ දුර. ” >>>> මට මෙතැන් සිට ඇති දුර “පිටතට” ගත හැකිද?
නැවත ස්තූතියි,
ටිමී එස්
කමක් නෑ, මම තේරුම් ගත්තා php හි “ශ්රිතය” ක්රියා කරන්නේ කෙසේද කියා
$ dis = getDistanceBetweenPointsNew ($ userLati, $ userLongi, $ lati, $ longi, $ unit = 'Km')
ගොඩක් ස්තුතියි!!
හරි, මම උත්සාහ කළ සියල්ල ක්රියාත්මක නොවේ. මම කිව්වේ, මා සතුව ඇති දේ, නමුත් දුර බැහැර ය.
මෙම කේතයේ ඇති වැරැද්ද කිසිවෙකුට දැකිය හැකිද?
if (isset ($ _ POST ['ඉදිරිපත් කළ'])) {$ z = $ _POST ['zipcode']; $ r = P _POST ['අරය']; echo “සඳහා ප්රති Results ල. $ z; . නගරය, z1.state FROM mrk m, zip z1, zip z1 WHERE m.zipcode = z2.zipcode AND z1.zipcode = $ z AND (1 * acos (කප්පාදු කරන්න (sin (z1.lat / 2) * sin (m. y1 / 2) + cos (z3963.lat / 2) * cos (m.y57.2958 / 1) * cos (m.x57.2958 / 2 - z57.2958.lon / 1), 57.2958))) <= $ r ") හෝ මිය යන්න (mysql_error ()); අතර ($ row = mysql_fetch_array ($ sql)) {$ store1 = $ row ['MktName']. "”; $ store = $ row ['LocAddSt']. ””; $ store. = $ row ['LocAddCity']. ”,“. $ row ['LocAddState']. ” “. $ පේළිය ['zipcode']; $ latitude57.2958 = $ පේළිය ['lat']; $ longitude2 = $ පේළිය ['lon']; $ latitude57.2958 = $ පේළිය ['y8']; $ longitude1 = $ පේළිය ['x1']; $ නගරය = $ පේළිය ['නගරය']; $ state = $ row ['state']; $ dis = getnew ($ latitude1, $ longitude2, $ latitude1, $ longitude2, $ unit = 'Mi'); // $ dis = දුර ($ lat1, $ lon1, $ lat1, $ lon2); $ සත්යාපනය = $ පේළිය ['සත්යාපනය']; if ($ verified == '2') {echo “”; echo “”. $ ගබඩාව. ””; echo $ dis. “සැතපුම් (දුර)”; echo “”; } else {echo “”. $ store. ””; echo $ dis. “සැතපුම් (දුර)”; echo “”; }}}
මගේ functions.php කේතය
ශ්රිතය 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 = rad2deg ($ දුර); $ දුර = $ දුර * 60 * 1.1515; ස්විචය ($ ඒකකය) {නඩුව 'මි': බිඳීම; නඩුව 'කි.මී.': $ දුර = $ දුර * 1.609344; } ආපසු (වටය ($ දුර, 2)); }
ඔයාට කලින්ම ස්තූතියි
මෙම ලිපියට ස්තූතියි. මගේ කේතය සමඟ හොඳින් වැඩ කිරීම. 🙂
හේ ඩග්ලස්, විශිෂ්ට ලිපියක්. භූගෝලීය සංකල්ප සහ කේතය පිළිබඳ ඔබේ පැහැදිලි කිරීම ඇත්තෙන්ම සිත්ගන්නා සුළු බව මට පෙනී ගියේය. මගේ එකම යෝජනාව වනුයේ අවකාශය වෙත ගොස් ප්රදර්ශනය සඳහා කේතය ඇතුල් කිරීමයි (උදාහරණයක් ලෙස ස්ටැකෝවර්ෆ්ලෝ වැනි). ඔබට අවකාශය සංරක්ෂණය කිරීමට අවශ්ය බව මට වැටහී ඇත, නමුත් සාම්ප්රදායික කේත පරතරය / ඉන්ඩෙන්ටේෂන් කිරීම ක්රමලේඛකයෙකු ලෙස මට කියවීමට හා වි ect ටනය කිරීමට පහසු වනු ඇත. කෙසේ වෙතත්, එය කුඩා දෙයක්. නියම වැඩ දිගටම කරගෙන යන්න.
ස්තූතියි! මම පෝස්ට් එක ටිකක් වෙනස් කර ඇත… නමුත් සමීකරණ එතරම් ඉඩ ප්රමාණයක් ගන්නා අතර එය දිගු බැවින් එය ඕනෑවට වඩා උපකාරී වන බව මට විශ්වාස නැත.
ඔයාට බොහෝම ස්තූතියි.
මෙහිදී ශ්රිතය සමඟ භාවිතා කරන විට අපට එක් වර්ගයක දුරක් ලැබේ. විමසුම භාවිතා කරමින් එහි එන අනෙක් දුර ප්රමාණය
මම ප්රාන්ත දෙකක් අතර දුර ගණනය නොකරමි
මුචස් ග්රැසියස් පෝන් ටෑන් හර්මසෝ කොඩිගෝ ...
මෙය හොඳ කොසිනස් කාර්යයන්. මම ගණිතය දන්නේ නැහැ, නමුත් ස්තූතියි!
නියම වැඩක්… y (y)
තෝරාගැනීමේදී දෙවරක් සූත්රය භාවිතා කිරීම වේගවත් බව පෙනේ (mysql 5.9) සහ කොහේද:
$ සූත්රය = “(((acos (sin ((“. $ latitude. ”* pi () / 180)) * sin ((` අක්ෂාංශ` * pi () / 180)) + cos ((“. $ අක්ෂාංශ. ”* Pi () / 180)) * cos ((` අක්ෂාංශ` * pi () / 180)) * cos (((“$ දේශාංශ.” - `දේශාංශ`) * pi () / 180%)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) ”;
$ sql = 'SELECT *,'. $ සූත්රය. ' '.. $ සූත්රය.' <= '. $ දුර;
ස්තූතියි…
නම් වැඩ කරන්නේ නැත
“දුර කොතැනද”
වැඩ කරන්නේ නම්
“දුරක්”
මෙම ලිපිය කැපීමට බොහෝම ස්තූතියි. එය ඉතා ප්රයෝජනවත්.
පීඑච්පී මුලදී නිර්මාණය කළේ “පුද්ගලික මුල් පිටුව” නමින් සරල ස්ක්රිප්ටින් වේදිකාවක් ලෙස ය. වර්තමානයේ PHP (හයිපර්ටෙක්ස්ට් පෙර සැකසුම් සඳහා කෙටිකතාව) මයික්රොසොෆ්ට් හි ක්රියාකාරී සේවාදායක පිටු (ඒඑස්පී) තාක්ෂණයට විකල්පයකි.
PHP යනු ගතික වෙබ් පිටු නිර්මාණය කිරීම සඳහා භාවිතා කරන විවෘත මූලාශ්ර සේවාදායක පාර්ශවීය භාෂාවකි. එය HTML තුළට කාවැද්දිය හැකිය. PHP සාමාන්යයෙන් ලිනක්ස් / යුනික්ස් වෙබ් සේවාදායකයන්හි MySQL දත්ත සමුදායක් සමඟ භාවිතා කරයි. එය බොහෝ විට වඩාත්ම ජනප්රිය ස්ක්රිප්ටින් භාෂාව විය හැකිය.
ඉහත විසඳුම නිසියාකාරව ක්රියාත්මක නොවන බව මට පෙනී ගියේය.
මට මෙය වෙනස් කළ යුතුයි:
$ qqq = “තෝරන්න *, ((acos (sin ((“. $ latitude. ”* pi () / 180)) * sin ((` latt` * pi () / 180)) + cos ((”). $ අක්ෂාංශ. “* pi () / 180)) * cos ((` latt` * pi () / 180)) * cos (((”. $ දේශාංශ.“ - `longt`) * pi () / 180) ))) * 180 / pi ()) * 60 * 1.1515) `රෙජිස්ටර්` වෙතින් දුර ලෙස;
ස්තූතියි කුපේන්ද්ර!
ස්තූතියි සර් පරිපූර්ණව වැඩ කිරීම .. නමුත් මට එක ප්රශ්නයක් ඇත මට දශම ලක්ෂ්යයකින් තොරව ප්රතිදානය කිරීමට අවශ්ය නම් මට කුමක් කළ හැකිද ..?
කලින්ම ස්තූතියි.
හෙලෝ, කරුණාකර මට මේ සඳහා ඔබගේ උදව් අවශ්ය වේ.
මම මගේ වෙබ් සේවාදායකයට ඉල්ලීමක් කළා http://localhost:8000/users/findusers/53.47792/-2.23389/20/
53.47792 = $ අක්ෂාංශ
-2.23389 = $ දේශාංශ
සහ 20 = මට ලබා ගැනීමට අවශ්ය දුර
කෙසේ වෙතත් ඔබ සූත්රය භාවිතා කරමින්, එය මගේ ඩීබී හි සියලුම පේළි ලබා ගනී
$ results = DB :: තෝරන්න (DB :: raw (“SELECT *, ((acos (sin ((“. $ latitude. ”* pi () / 180)) * sin ((lat * pi () / 180 )) + cos ((“. $ අක්ෂාංශ.” * Pi () / 180)) * cos ((lat * pi () / 180)) * cos ((“. $ දේශාංශ.” - lng) * pi ( ) / 180)))) * 180 / pi ()) * 60 * 1.1515 * 1.609344) සලකුණු වලින් ඇති දුර ලෙස> = “. $ දුර));
. ”දුර”: 1}, id “id”: 939, ”නම”: “අමිසී හි නැගෙනහිර වෙරළ පීසීරියාව”, ”ලිපිනය”: ”37.386337280273 කැස්ත්රෝ ශාන්ත, මවුන්ටන් වීව්, සීඒ”, ”ලැට්”: 122.08582305908, ”lng”: -16079.294719663 ” . ”Lat”: 2, ”lng”: - 790, ”දුර”: 37.387138366699}, id “id”: 122.08323669434, ”name”: ”ටෝනි සහ ඇල්බාගේ පීසා සහ පැස්ටා”, ”ලිපිනය”: ”16079.175940152 එස්කුවෙලා ඒව්, මවුන්ටන් බලන්න, CA ”,” lat ”: 3,” lng ”: - 191,” දුර ”: 37.393886566162}, id“ id ”: 122.07891845703,” name ”:” Oregano's Wood-Fired Pizza ”,” address ”:” 16078.381373826 එල් කැමිනෝ රියල්, ලොස් අල්ටොස්, සීඒ ”,” ලැට් ”: 4,” lng ”: - 570,” දුර ”: 37.402652740479}, {“ id ”: 122.07935333252,” name ”:“ බාර් සහ ග්රිල් ”,” ලිපිනය ”:” 16077.420540582 වයිට්ලි වීදිය, මැන්චෙස්ටර් ”,” ලැට් ”: 5,” lng ”: - 619,” දුර ”: 37.394012451172}]
මට සැතපුම් 20 ක් සහිත පේළි ලබා ගැනීමට අවශ්ය නමුත් එය සියලු පේළි ගෙන එයි. කරුණාකර මම වැරදි කරන්නේ කුමක් ද?
මම ඒ හා සමාන විමසුමක් සොයන නමුත් මදක් ඉදිරියට ගියෙමි - කෙටියෙන් කිවහොත් මෙය එක් එක් ඛණ්ඩාංකයේ සිට සැතපුම් 2 ක් ඇතුළත සියළුම ඛණ්ඩාංක කණ්ඩායම් කර එක් එක් කණ්ඩායමේ ඛණ්ඩාංක කොපමණදැයි ගණන් කර වැඩිපුර ඛණ්ඩාංක ඇති එක් කණ්ඩායමක් පමණක් නිෂ්පාදනය කිරීමයි. වැඩිම ඛණ්ඩාංක සංඛ්යාවක් ඇති කණ්ඩායම් අතර ඔබට කණ්ඩායම් එකකට වඩා තිබේ - අහඹු කණ්ඩායම එකම විශාල සංඛ්යාවක් ඇති කණ්ඩායම් වලින් නිකුත්වන්න -