
רעכענען אָדער אָנפרעג גרויס קרייַז דיסטאַנסע צווישן די ברייט און לאַנדזשאַטוד פּאָינץ ניצן די האַווערסינע פאָרמולע (PHP, JavaScript, Java, Python, MySQL, MSSQL ביישפילן)
דעם חודש איך האָבן פּראָגראַממינג גאַנץ אַ ביסל אין PHP און MySQL מיט רעספּעקט צו גיס. סנאָאָפּינג אַרום די נעץ, איך אַקשלי געהאט אַ שווער צייט צו געפֿינען עטלעכע פון די דזשיאַגראַפיק חשבונות צו געפֿינען די ווייַטקייט צווישן צוויי לאָוקיישאַנז, אַזוי איך געוואלט צו טיילן זיי דאָ.

די פּשוט וועג צו רעכענען אַ ווייַטקייט צווישן צוויי פונקטן איז ניצן די פּיטהאַגאָרעאַן פאָרמולע צו רעכענען די כייפּאַטענאַס פון אַ דרייַעק (A² + B² = C²). דאָס איז באַוווסט ווי דער עוקלידיאַן ווייַטקייט.
דאָס איז אַ טשיקאַווע אָנהייב אָבער עס איז נישט אַפּלייז צו געאָגראַפי זינט די דיסטאַנסע צווישן די שורות פון ברייט און לענג איז נישט גלייַך דיסטאַנסאַז באַזונדער. ווען איר באַקומען נעענטער צו די עקוואַטאָר, די ברייט שורות באַקומען ווייַטער באַזונדער. אויב איר נוצן אַ פּשוט טריאַנגולאַטיאָן יקווייזשאַן, עס קען מעסטן די ווייַטקייט אַקיעראַטלי אין איין אָרט און פאַלש אין די אנדערע, ווייַל פון די קערוואַטשער פון דער ערד.
גרויס סירקלע דיסטאַנסע
די רוץ וואָס זענען געפארן לאַנג דיסטאַנסאַז אַרום דער ערד זענען באקאנט ווי די גרויס קרייַז דיסטאַנסע. דאָס איז ... די שאָרטיסט ווייַטקייט צווישן צוויי פונקטן אויף אַ קויל איז אַנדערש פון די פונקטן אויף אַ פלאַך מאַפּע. קאַמביין דאָס מיט דעם פאַקט אַז ברייט און לאַנדזשאַטוד שורות זענען נישט עקווידיסטאַנט ... און איר האָבן אַ שווער כעזשבן.
דאָ ס אַ פאַנטאַסטיש ווידעא דערקלערונג פון ווי גרויס קרייזן אַרבעט.
די האַווערסינע פאָרמולע
די דיסטאַנסע ניצן די קערוואַטשער פון דער ערד איז ינקאָרפּערייטיד אין די Haversine פאָרמולע, וואָס ניצט טריגאָנאָמעטרי צו לאָזן די קערוואַטשער פון דער ערד. ווען איר געפֿינען די ווייַטקייט צווישן 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));
}
די וועריאַבאַלז זענען:
- $ ברייט1 - אַ בייַטעוודיק פֿאַר די ברייט פון דיין ערשטער אָרט.
- $ לאָנגיטודע1 - אַ בייַטעוודיק פֿאַר דיין ערשטער אָרט ס לאַנדזשאַטוד
- $ ברייט2 - אַ בייַטעוודיק פֿאַר די ברייט פון דיין רגע אָרט.
- $ לאָנגיטודע2 - אַ וועריאַבאַל פֿאַר די לענג פון דיין רגע אָרט.
- $ אַפּאַראַט - די פעליקייַט זייַענדיק מייל. דאָס קען זיין דערהייַנטיקט אָדער דורכגעגאנגען ווי קילאָמעטערס.
Java: רעכענען דיסטאַנסע צווישן 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 - אַ וועריאַבאַל פֿאַר די לענג פון דיין רגע אָרט.
- אַפּאַראַט - די פעליקייַט זייַענדיק מייל. דאָס קען זיין דערהייַנטיקט אָדער דורכגעגאנגען ווי קילאָמעטערס.
פּיטהאָן: רעכענען דיסטאַנסע צווישן 2 פונט פון ברייט און לאַנדזשאַטוד
סייַ ווי סייַ, דאָ ס די פּיטהאָן פאָרמולע פֿאַר קאַלקיאַלייטינג די ווייַטקייט צווישן צוויי פונקטן (צוזאמען מיט מייל ווס קילאָמעטער קאַנווערזשאַן) ראַונדיד צו צוויי דעצימאַל ערטער. קרעדיט צו מיין זון, Bill Karr, וואָס איז אַ דאַטאַ ססיענטיסט פֿאַר 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 צו רעכענען אַלע רעקאָרדס אין אַ ספּעציפיש ווייַטקייט. אין דעם בייַשפּיל, איך בין געגאנגען צו אָנפֿרעג MyTable אין 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) as distance FROM `table` WHERE distance <= ".$distance."
איר דאַרפֿן צו קאַסטאַמייז דעם:
- $ לאַנדזשאַטוד - דאָס איז אַ פפּ בייַטעוודיק וווּ איך פאָרן די לאַנדזשאַטוד פון די פונט.
- $ ברייט - דאָס איז אַ פפּ בייַטעוודיק וווּ איך פאָרן די לאַנדזשאַטוד פון די פונט.
- $ ווייטקייט - דאָס איז די ווייַטקייט וואָס איר ווילט צו געפֿינען אַלע רעקאָרדס ווייניקער אָדער גלייַך צו.
- טיש - דאָס איז דער טיש ... איר וועט וועלן צו פאַרבייַטן דעם מיט דיין טיש נאָמען.
- ברייט - דאָס איז די פעלד פון דיין ברייט.
- לאַנדזשאַטוד - דאָס איז די פעלד פון דיין לאַנדזשאַטוד.
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."
איר דאַרפֿן צו קאַסטאַמייז דעם:
- $ לאַנדזשאַטוד - דאָס איז אַ פפּ בייַטעוודיק וווּ איך פאָרן די לאַנדזשאַטוד פון די פונט.
- $ ברייט - דאָס איז אַ פפּ בייַטעוודיק וווּ איך פאָרן די לאַנדזשאַטוד פון די פונט.
- $ ווייטקייט - דאָס איז די ווייַטקייט וואָס איר ווילט צו געפֿינען אַלע רעקאָרדס ווייניקער אָדער גלייַך צו.
- טיש - דאָס איז דער טיש ... איר וועט וועלן צו פאַרבייַטן דעם מיט דיין טיש נאָמען.
- ברייט - דאָס איז די פעלד פון דיין ברייט.
- לאַנדזשאַטוד - דאָס איז די פעלד פון דיין לאַנדזשאַטוד.
איך האָב גענוצט דעם קאָד אין אַ פֿירמע מאַפּינג פּלאַטפאָרמע אַז מיר געוויינט פֿאַר אַ לאַכאָדימ קראָם מיט איבער 1,000 לאָוקיישאַנז אַריבער צפון אַמעריקע, און עס אַרבעט ביוטאַפלי.
Microsoft SQL Server Geographic Distance: 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);
הוט שפּיץ צו Manash Sahoo, VP און אַרטשיטעקט פון Highbridge.
דאנק איר זייער פיל פֿאַר ייַנטיילונג. דאָס איז געווען אַן גרינג קאָפּיע און פּאַפּ אַרבעט און אַרבעט גרויס. איר האָט מיר געראטעוועט אַ פּלאַץ פון צייט.
FYI פֿאַר ווער עס יז פּאָרטינג צו C:
טאָפּל דע2ראַד (טאָפּל דעג) {צוריקקער דעג * (3.14159265358979323846/180.0); }
זייער פייַן שטיק פון פּאָסטינג - געארבעט זייער פייַן - איך נאָר האָבן צו טוישן די נאָמען פון די טיש האלטן די לאַט-לאַנג. עס אַרבעט שיין שנעל צו .. איך האָבן אַ ריזאַנאַבלי קליין נומער פון לאַט-לאָנגס (<400) אָבער איך טראַכטן דאָס וואָלט זיין שיין וואָג. פייַן פּלאַץ אויך - איך נאָר צוגעגעבן עס צו מיין del.icio.us חשבון און וועט טשעק צוריק קעסיידער.
דאַנקען זייער פיל פעטרוס און קערי! אויב איר ווי צו אַרבעטן אויף GIS פּראַדזשעקס, איך רעקאָמענדירן:
דאַנקען דיר זייער פיל ... 😀
איך געזוכט דעם גאַנצן טאָג פֿאַר דיסטאַנסע חשבונות און געפונען די האַרווערסינע אַלגערידאַם, דאַנק צו איר פֿאַר געבן דעם בייַשפּיל ווי צו שטעלן עס אין אַ sql דערקלערונג. דאַנקען און באַגריסן, דניאל
צופרידן צו העלפן אויס, ריילז פרייַנד!
איצט איך בין אין זוכן פון אַ 'אין פּאָליגאָן' פפּ פֿונקציע וואָס וועט נעמען אַ מענגע פון סיקוואַנסעד ברייט און לאַנדזשאַטוד קאָואָרדאַנאַץ און רעכענען אויס אויב אן אנדער פונט איז ין אָדער אַרויס פון די פילעק.
איך געפֿונען די יקווייזשאַן צו רעכענען אויב אַ פונט אין אַ פילעק!
איך טראַכטן דיין SQL דאַרף אַ ויסזאָגונג.
אַנשטאָט WHERE דיסטאַנסע <= $דיסטאַנסע איר קען דאַרפֿן צו
נוצן HAVING דיסטאַנסע <= $דיסטאַנסע
אַנדערש דאַנקען פֿאַר שפּאָרן מיר אַ בינטל פון צייט און ענערגיע.
העלא דוד,
אויב איר טאָן קיין טיפּ פון GROUP BY ויסזאָגונג, איר דאַרפֿן צו האָבן. איך טאָן ניט טאָן דאָס אין דעם בייַשפּיל אויבן.
דאַג
פֿון MySQL 5.x, איר קענט נישט נוצן אַן אַליאַס אויף אַ WHERE פּונקט זען http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html
ניצן HAVING אַנשטאָט פון WHERE אין די אויבן פֿראגן
א גרויסן דאנק. איר האָט געטאן אַ גרויס אַרבעט, דאָס איז די זאַך וואָס איך טאַקע ווילן. א גרויסן ש 'כח.
דאַנקען דיר אַזוי פיל פֿאַר ייַנטיילונג דעם קאָד. עס געראטעוועט מיר אַ פּלאַץ פון אַנטוויקלונג צייט. אויך, דאַנק צו דיין לייענער פֿאַר ווייזן אַז אַ HAVING ויסזאָגונג איז נייטיק פֿאַר MySQL 5.x. זייער נוציק.
איך בין ברוך צו האָבן לייענער פיל סמאַרטער ווי איך בין!
????
די אויבן פאָרמולע איז שפּאָרן מיר אַ פּלאַץ פון צייט. א גרויסן יישר כח.
איך אויך האָבן צו באַשטימען צווישן די NMEA פֿאָרמאַט און גראַדעס. איך געפֿונען אַ פאָרמולע אין דעם URL אין די דנאָ פון די בלאַט. http://www.errorforum.com/knowledge-base/16273-converting-nmea-sentence-latitude-longitude-decimal-degrees.html
ווייסט ווער עס יז ווי צו באַשטעטיקן דעם?
דאנק איר!
מאַטערן
העלא,
אן אנדער קשיא. איז עס אַ פאָרמולע פֿאַר NMEA סטרינגס ווי דער אונטן?
1342.7500,N,10052.2287,E
$GPRMC,032731.000,A,1342.7500,N,10052.2287,E,0.40,106.01,101106,,*0B
דאַנק,
מאַטערן
איך אויך געפונען אַז WHERE האט נישט אַרבעטן פֿאַר מיר. טשיינדזשד עס צו HAVING און אַלץ אַרבעט גאנץ. אין ערשטער איך האט נישט לייענען די באַמערקונגען און ריראָוט עס מיט אַ נעסטעד אויסקלייַבן. ביידע וועלן אַרבעט גוט.
דאַנקען דיר זייער פיל פֿאַר די שריפט געשריבן אין mysql, נאָר האָבן צו מאַכן עטלעכע מינערווערטיק אַדזשאַסטמאַנץ (מיט) 🙂
גוט אַרבעט
ינקרעדאַבלי נוציק, דאַנקען דיר זייער פיל! איך האָב געהאט עטלעכע פראבלעמען מיט די נייַע "HAVING", אלא ווי "WHERE", אָבער אַמאָל איך לייענען די באַמערקונגען דאָ (נאָך אַ האַלב שעה פון גרינדינג מיין ציין אין פראַסטריישאַן = P), איך גאַט עס ארבעטן נייסלי. דאנק איר ^ _ ^
דאַנקען אַ פּלאַץ אַרבעט גרויס
האַלטן אין מיינונג אַז אַ סעלעקטעד ויסזאָגונג ווי אַז וועט זיין זייער קאַמפּיוטישאַנאַלי טיף און דעריבער פּאַמעלעך. אויב איר האָבן אַ פּלאַץ פון די פֿראגן, דאָס קען זיין גאַנץ געשווינד.
א פיל ווייניקער טיף צוגאַנג איז צו לויפן אַ ערשטער (גרויס) אויסקלייַבן ניצן אַ קוואַדראַט געגנט דיפיינד דורך אַ קאַלקיאַלייטיד דיסטאַנסע, ד"ה "סעלעקטירן * פֿון טיש נאָמען ווו ברייט צווישן לאַט1 און לאַט2 און לאַנדזשאַטוד צווישן לאָן1 און לאָן2". lat1 = טאַרגעטאַטיטודע - לאַטדיפף, לאַט2 = טאַרגעטאַטיטודע + לאַטדיף, ענלעך מיט לאָן. לאַטדיף ~= דיסטאַנסע / 111 (פֿאַר קילאמעטער), אָדער דיסטאַנסע / 69 פֿאַר מייל זינט 1 גראַד פון ברייט איז ~ 111 קילאמעטער (קליין ווערייישאַן זינט ערד איז אַ ביסל אָוואַל, אָבער גענוג פֿאַר דעם צוועק). לאָנדיף = דיסטאַנסע / (אַבס (קאָס (דעג2ראַד (ברייט)) * 111)) - אָדער 69 פֿאַר מייל (איר קענען אַקשלי נעמען אַ ביסל גרעסערע קוואַדראַט אין סדר צו רעכענען ווערייישאַנז). דערנאָך נעמען די רעזולטאַט פון דעם און קאָרמען עס אין די ריידיאַל סעלעקטירן. נאָר טאָן ניט פאַרגעסן צו נעמען אין חשבון די קאָואָרדאַנאַץ פון די גרענעץ - ד"ה די קייט פון פּאַסיק לאַנדזשאַטוד איז -180 צו +180 און די קייט פון פּאַסיק ברייט איז -90 צו +90 - אין פאַל דיין לאַדיפף אָדער לאָנדיף לויפט אַרויס דעם קייט . באַמערקונג אַז אין רובֿ קאַסעס דאָס קען נישט זיין אָנווענדלעך ווייַל עס בלויז אַפעקץ חשבונות איבער אַ שורה דורך די פּאַסיפיק אָקעאַן פון פלאָקן צו פלאָקן, כאָטש עס ינטערסעקט טייל פון טשוקאָטקאַ און טייל פון אַלאַסקאַ.
וואָס מיר דערגרייכן מיט דעם איז אַ באַטייטיק רעדוקציע אין די נומער פון פונקטן קעגן וואָס איר מאַכן דעם כעזשבן. אויב איר האָבן אַ מיליאָן גלאבאלע פונקטן אין די דאַטאַבייס פונאנדערגעטיילט בעערעך יוואַנלי און איר ווילן צו זוכן אין 100 קילאמעטער, דיין ערשטער (שנעל) זוכן איז פון אַ שטח פון 10000 סק. שטח שטח פון וועגן 20 ם סק קילאמעטער), וואָס מיטל אַז איר לויפן די קאָמפּלעקס דיסטאַנסע כעזשבן 500 מאל פֿאַר דעם אָנפֿרעג אַנשטאָט פון אַ מיליאָן מאָל.
מינערווערטיק גרייַז אין דעם בייַשפּיל ... דאָס וואָלט זיין ין 50 קילאמעטער (ניט 100) זינט מיר קוקן אין די "ראַדיוס" פון אונדזער ... קוואַדראַט.
פאַנטאַסטיש עצה! איך אַקטשאַוואַלי געארבעט מיט אַ דעוועלאָפּער וואָס געשריבן אַ פֿונקציע וואָס פּולד די ין קוואַדראַט און דערנאָך אַ רעקורסיווע פֿונקציע וואָס געמאכט 'סקווערז' אַרום די פּערימעטער צו אַרייַננעמען און ויסשליסן די רוען פונקטן. דער רעזולטאַט איז געווען אַן ינקרעדאַבלי שנעל רעזולטאַט - ער קען אָפּשאַצן מיליאַנז פון פונקטן אין מיקראָסעקאָנדס.
מיין צוגאַנג אויבן איז באשטימט 'גרוי' אָבער טויגעוודיק. א דאנק, נאכאמאהל!
דאַג,
איך האָבן געפרוווט צו נוצן mysql און php צו אָפּשאַצן צי אַ לאַנג פונט איז ין אַ פּאָליגאָן. צי איר וויסן אויב דיין דעוועלאָפּער פרייַנד ארויס ביישפילן ווי צו ויספירן דעם אַרבעט. אָדער טאָן איר וויסן קיין גוטע ביישפילן. דאַנקען אין שטייַגן.
הי אַלעמען, דאָס איז מיין פּראָבע סקל ויסזאָגונג:
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, און עס אַרבעט, אָבער נישט מיט אים ...
פאַרבייַטן "WHERE דיסטאַנסע" מיט "HAVING distance".
אַרבעט ווי אַ כיין, דאַנקען דאָוגלאַס!
דאָס איז גרויס, אָבער עס איז פּונקט ווי די פייגל פליען. עס וואָלט זיין גרויס צו פּרובירן צו ינקאָרפּערייט די Google מאַפּס אַפּי צו דעם עפעס (אפֿשר ניצן ראָודז עטק.) נאָר צו געבן אַ געדאַנק מיט אַ אַנדערש פאָרעם פון טראַנספּערטיישאַן. איך נאָך האָבן נאָך צו מאַכן אַ סימיאַלייטיד אַנילינג פונקציע אין PHP וואָס וואָלט זיין ביכולת צו פאָרשלאָגן אַן עפעקטיוו לייזונג צו די טראַוואַלינג פאַרקויפער פּראָבלעם. אָבער איך טראַכטן אַז איך קען זיין ביכולת צו רייוז עטלעכע פון דיין קאָד צו טאָן דאָס.
היי דאָוגלאַס,
דאַנקען דיר אַזוי פיל פֿאַר דעם אַרטיקל - איר נאָר געראטעוועט מיר אַ פּלאַץ פון צייט.
נעמען קעיר,
נמרוד @ישראל
גוט אַרטיקל! איך געפֿונען אַ פּלאַץ פון אַרטיקלען דיסקרייבינג ווי צו רעכענען די ווייַטקייט צווישן צוויי פונקטן, אָבער איך איז געווען טאַקע קוקן פֿאַר די SQL סניפּ.
דאַנקען אַ פּלאַץ אַרבעט גוט
דאַנקען דיר פיל פֿאַר דעם פאָרמולע. עס שייווד עטלעכע מאָל אויף אַ קראָם אָרט פּרויעקט וואָס איז געווען עסן ביי מיר.
אַ דאַנק אַ פּעקל. די קליין שורה פון קאָד געראטעוועט מיר עטלעכע היפּש צייט אין אַ קראָם אָרט פּרויעקט!
#1054 - אומבאַקאַנט זייַל 'ווייַטקייט' אין 'ווו פּונקט'
אַפּרווו
די זעלבע דא! וואָס איז די פּראָבלעם :-/? ווי צו סאָלווע די "ווייַטקייט" - קאָלום פּראָבלעם? הילף אונדז, ביטע!! 🙂
פּרוּווט ניצן HAVING אַנשטאָט WHERE
2 טעג פון פאָרשונג צו לעסאָף געפֿינען דעם בלאַט וואָס סאַלווז מיין פּראָבלעם. עס קוקט ווי איך בעסער בוסט אויס מיין WolframAlpha און באַרשט זיך מיין מאטעמאטיק. די ענדערונג פון WHERE צו HAVING האט מיין שריפט אין ארבעטן סדר. אדאנק
אַנשטאָט פון WHERE פּונקט נוצן:
מיט דיסטאַנסע <50
דאַנקען געאָרגי. איך האלטן באַקומען זייַל 'ווייַטקייט' ניט געפֿונען. אַמאָל איך טוישן די WHERE צו האָבן עס געארבעט ווי אַ כיין!
איך ווינטשן אַז דאָס איז געווען דער ערשטער בלאַט וואָס איך געפֿונען אויף דעם. נאָך טריינג פילע פאַרשידענע קאַמאַנדז, דאָס איז געווען דער בלויז איינער צו אַרבעטן רעכט, און מיט מינימאַל ענדערונגען צו פּאַסיק מיין אייגענע דאַטאַבייס.
דאַנק אַ פּלאַץ!
איך ווינטשן אַז דאָס איז געווען דער ערשטער בלאַט וואָס איך געפֿונען אויף דעם. נאָך טריינג פילע פאַרשידענע קאַמאַנדז, דאָס איז געווען דער בלויז איינער צו אַרבעטן רעכט, און מיט מינימאַל ענדערונגען צו פּאַסיק מיין אייגענע דאַטאַבייס.
דאַנק אַ פּלאַץ!
א גרויסן ש 'כח!
א גרויסן ש 'כח!
איך טאָן ניט טראַכטן די קאָד איז ווייזן אַרויף ענימאָר. אפשר איז עס Firefox?
איך נאָר טעסטעד ביידע אין פירעפאָקס און קראָום און עס איז אַפּירינג. פרובירט ווידער?
העלא. א גרויסן ש 'כח. דאָס אַרבעט ווי אַ כיין.
דאַנקען דיר דאָוגלאַס. דאָס אַרבעט גאנץ.
איך ווייס אז די פארמולע ארבעט, אבער איך קען נישט זען וואו מען נעמט אין חשבון די ראדיוס פון דער ערד. איינער קען מיר מסביר זיין, ביטע?
טים, פֿאַר אַ פול דערקלערונג פון די Haversine פאָרמולע (דאָס איז נישט קאָד), טשעק די וויקיפּעדיע ס אַרטיקל: http://en.wikipedia.org/wiki/Haversine_formula
שיין! דאָס האָט מיר גאָר געהאָלפֿן!
גרויס שטאָפּן דאָוגלאַס. האָבן איר געפרוווט צו באַקומען די ינטערסעקשאַן פונט געגעבן די לאנג / לאַט / בערינג פון צוויי פונקטן?
כ'האב דאס נאך נישט געטון, כאן!
דאנק איר דאָוגלאַס, די SQL קווערי איז פּונקט וואָס איך דארף, און איך געדאַנק איך וואָלט האָבן צו שרייַבן עס זיך. איר'ווע געראטעוועט מיר פון עפשער שעה פון ברייט לאַנדזשאַטוד לערנען ויסבייג!
איך באַקומען טעות אָנזאָג: אומבאַקאַנט זייַל 'דיסטאַנסע' אין 'ווו פּונקט' אויף די MySQL אָנפֿרעג.
פעטרוס, ביטע לייענען די אנדערע באַמערקונגען. עס אויס אַז עטלעכע מענטשן האָבן צו נוצן אַ אַנדערש סינטאַקס פֿאַר WHERE / HAVING.
דאנק איר פֿאַר דעם גרויס אַרטיקל! פּונקט טעסטעד די קאָד אויף מיין דב און געארבעט גרויס!
דאָוגלאַס, דאַנקען דיר פֿאַר דעם אַמייזינג קאָד. איך בין קראַקינג מיין קאָפּ ווי צו טאָן דאָס אויף מיין גפּס קהל טויער. איר האָט מיר געראטעוועט שעה.
גרויס צו הערן, אַש!
דאַנקען פֿאַר פּאָסטינג דעם נוציק אַרטיקל,
אָבער פֿאַר עטלעכע סיבה איך וואָלט ווי צו פרעגן
ווי צו באַקומען די דיסטאַנסע צווישן קאָאָרדס ין mysql db און קאָאָרדס ינסערטאַד צו פפּ דורך באַניצער?
פֿאַר מער קלאר באַשרייַבן:
1. באַניצער מוזן אַרייַנלייגן [שייַן] פֿאַר סעלינג ספּעסיפיעד דאַטן פֿון דב און באַניצער זיך ס קאָאָרדס
2. די פפּ טעקע באַקומען די ציל דאַטן (קאָאָרדס) ניצן [שייַן] און רעכענען די ווייַטקייט צווישן באַניצער און ציל פונט
אָדער קענען נאָר באַקומען דיסטאַנסע פון די קאָד אונטן?
$qry = “SELECT *,(((acos(sin((“.$לאטיטודע.”*pi()/180)) * sin((`ברייט`*pi()/180))+cos((“. $לאטיטודע."*פּי()/180)) * קאָס((`ברייט`*פּי()/180)) * קאָס(((“.$לאָנגיטודע."- `לאָנגיטודע`)*פּי()/180) )))*180/pi())*60*1.1515*1.609344) ווי דיסטאַנסע FROM `MyTable` WHERE ווייַטקייט>= ".$דיסטאַנסע." >>>>קען איך "אַרויסנעמען" די דיסטאַנסע פון דאָ?
א דאנק, נאכאמאהל,
טימי ש
ניט קיין ענין, איך האָבן געפֿונען ווי די "פונקציע" אַרבעט אין פפּ
$dis=getDistanceBetweenPointsNew($userLati, $userLongi, $lati, $longi, $unit = 'Km')
א גרויסן ש 'כח!!
גוט, אַלץ איך האָבן געפרוווט איז נישט ארבעטן. איך מיינען, וואָס איך האָבן אַרבעט, אָבער די דיסטאַנסאַז זענען וועג אַוועק.
קען ווער עס יז זען וואָס איז פאַלש מיט דעם קאָד?
אויב (יססעט ($_POST['submitted'])){$z = $_POST['zipcode']; $ר = $_POST['ראַדיוס']; עקאָו "רעזולטאטן פֿאַר ".$ז; $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. שטאָט, ז1. שטאַט פֿון 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. י1 / 57.2958) + קאָס (ז2.לאַט / 57.2958) * קאָס (מ.י1 / 57.2958) * קאָס (מ.קס1 / 57.2958 – ז2.לאָן / 57.2958) , 8) ר ") אָדער שטאַרבן (mysql_error ()); בשעת ($ ראָו = מיסקל_פעטש_אַררייַ ($ sql)) {$סטאָרע1 = $ראָוו['מקטנאַמע'].""; $ קראָם = $ רודערן ['LocAddSt'].""; $store .= $row['LocAddCity'].", ".$row['LocAddState']." ".$ראָוו['זיפּקאָדע']; $לאַטאַטודע1 = $רודערן['לאַט']; $לאָנגיטודע1 = $ראָוו['לאָן']; $לאטיטודע2 = $רודערן['י1']; $לאָנגיטודע2 = $ראָוו['קס1']; $סיטי = $ראָוו['שטאָט']; $שטאַט = $רודערן['שטאַט']; $דיס = באַקומען נעוו ($ ברייט1, $ לאָנגיטודע1, $ ברייט2, $ לאָנגיטודע2, $ אַפּאַראַט = 'מי'); // $דיס = דיסטאַנסע ($לאַט1, $לאָנ1, $לאַט2, $לאָנ2); $ וועריפיעד = $ רודערן ['וועראַפייד']; אויב ($ וועראַפייד == '1') {עקאָו ""; ווידערקאָל "".$סטאָר.""; echo $dis . "מייל (s) אַוועק"; ווידערקאָל ""; } אַנדערש {עקאָו "".$ קראָם.""; echo $dis . "מייל (s) אַוועק"; ווידערקאָל ""; } }}
מיין functions.php קאָד
פֿונקציע getnew ($ ברייט1, $ לאָנגיטודע1, $ ברייט2, $ לאָנגיטודע2, $ יוניט = 'מי') {$טהעטאַ = $לאָנגיטודע1 - $לאָנגיטודע2; $דיסטאַנסע = (זינד(דעג2ראַד($לאטיטודע1)) * זינד(דעג2ראַד($לאטיטודע2))) + (קאָס(דעג2ראַד($לאטיטודע1)) *קאָס(דעג2ראַד($לאטיטודע2)) *קאָס(דעג2ראַד($טעטאַ)) ); $ דיסטאַנסע = אַקאָס ($ דיסטאַנסע); $ דיסטאַנסע = ראַד2דעג ($ דיסטאַנסע); $ דיסטאַנסע = $ דיסטאַנסע * 60 * 1.1515; באַשטימען ($ אַפּאַראַט) { פאַל 'מי': ברעכן; פאַל 'קם': $דיסטאַנסע = $דיסטאַנסע * 1.609344; } צוריקקומען (קייַלעכיק ($ ווייַטקייט, 2)); }
דאנק איר אין שטייַגן
דאנק איר פֿאַר דעם אַרטיקל. אַרבעט גוט מיט מיין קאָד. 🙂
היי דאָוגלאַס, גרויס אַרטיקל. איך האָב געפֿונען דיין דערקלערונג פון די דזשיאַגראַפיקאַל קאַנסעפּס און די קאָד טאַקע טשיקאַווע. מייַן בלויז פאָרשלאָג וואָלט זיין צו אָרט און ינדענט די קאָד פֿאַר ווייַז (ווי סטאַקקאָווערפלאָוו, פֿאַר בייַשפּיל). איך פֿאַרשטיין אַז איר ווילן צו ראַטעווען פּלאַץ, אָבער קאַנווענשאַנאַל קאָד ספּייסינג / ינדענטיישאַן וואָלט מאַכן עס פיל גרינגער פֿאַר מיר, ווי אַ פּראָגראַמיסט, צו לייענען און דייסעקט. ממילא איז דאס א קליינע זאך. האַלטן די גרויס אַרבעט.
דאַנקען! איך'ווע מאַדאַפייד דעם פּאָסטן אַ ביסל ... אָבער די יקווייזשאַנז נעמען אַזוי פיל פּלאַץ און זענען אַזוי לאַנג אַז איך בין נישט זיכער אַז עס העלפּס צו פיל.
א גרויסען ש 'כח.
דאָ בשעת ניצן מיט פֿונקציע, מיר באַקומען איין טיפּ פון דיסטאַנסע
איך וועט נישט רעכענען די ווייַטקייט צווישן צוויי שטאַט
דאַנקען דיר אַזוי פיל ...
טהיס איך גוט קאָסינוס פאַנגקשאַנז. איך טאָן ניט וויסן מאַט, אָבער דאַנקען!
גרויס אַרבעט ... 🙂 (י)
עס סימז פאַסטער (mysql 5.9) צו נוצן צוויי מאָל די פאָרמולע אין די אויסקלייַבן און ווו:
$ פאָרמולע = "(((acos(sin((“.$ברייט..”*פּי()/180)) * זינד((`ברייט`*פּי()/180))+קאָס((“.$לאטיטודע. ”*פּי()/180)) * קאָס((`ברייט`*פּי()/180)) * קאָס(((“.$לאָנגיטודע."- `לאָנגיטודע`)*פּי()/180)))) *180/פּי())*60*1.1515*1.609344)";
$sql = 'סעלעקטירן *, '.$פאָרמולע.' ווי דיסטאַנסע פֿון טיש WHERE '..$formula.' <= '.$דיסטאַנסע;
דאַנקען ...
נישט ארבעטן אויב
"וואו דיסטאַנסע"
אַרבעט אויב
"מיט דיסטאַנסע"
אַ פּלאַץ פון דאַנקען פֿאַר דעם אַרטיקל. עס איז זייער נוציק.
PHP איז געווען ערשטער באשאפן ווי אַ פּשוט סקריפּטינג פּלאַטפאָרמע גערופֿן "פערזענלעכע היים בלאַט". נאָוואַדייַס PHP (די קורץ פֿאַר היפּערטעקסט פּרעפּראָסעססאָר) איז אַן אָלטערנאַטיוו פון די מיקראָסאָפט אַקטיווע סערווירער בלעטער (אַספּ) טעכנאָלאָגיע.
PHP איז אַן אָפֿן מקור סערווער זייַט שפּראַך וואָס איז געניצט פֿאַר קריייטינג דינאַמיש וועב זייַטלעך. עס קענען זיין עמבעדיד אין HTML. פפּ איז יוזשאַוואַלי געניצט אין קאַנדזשאַנגקשאַן מיט אַ MySQL דאַטאַבייס אויף לינוקס / יוניקס וועב סערווערס. עס איז מיסטאָמע די מערסט פאָלקס סקריפּטינג שפּראַך.
איך געפֿונען אויבן לייזונג נישט ארבעטן רעכט.
איך דארף טוישן צו:
$qqq = “SELECT *,(((acos(sin((“.$לאטיטודע.”*pi()/180)) * sin((`latt`*pi()/180))+cos((” . $לאטיטודע . "*פּי()/180)) * cos(('latt`*pi()/180)) * קאָס(((". $לאָנגיטודע . "- `לאָנגט`)*פּי()/180) )))*180/פּי())*60*1.1515) ווי דיסטאַנסע פֿון `רעגיסטרירן` ";
דאַנקען קופּענדראַ!
דאנק איר האר ראַקינג בישליימעס .. אָבער איך האָבן איין קשיא אויב איך ווילן צו רעזולטאַט אָן דעצימאַל פונט, וואָס קענען איך טאָן ..?
דאַנק אין שטייַגן.
העלא, ביטע איך וועט טאַקע דאַרפֿן דיין הילף אין דעם.
איך געמאכט אַ באַקומען בעטן צו מיין וועב סערווער
53.47792 = $ ברייט
-2.23389 = $ לענג
און 20 = די ווייַטקייט איך ווילן צו צוריקקריגן
אָבער מיט דיין פאָרמולע, עס ריטריווז אַלע ראָוז אין מיין דב
$רעזולטאטן = דב::סעלעקט(דב::רוי(“SELECT *,(((acos(sin((“.$לאטיטודע.”פּי()/180)) * זינד((לאַטפּי()/180))+קאָס((“.$לאטיטודע.”פּי()/180)) * קאָס((לאַטpi()/180)) * cos(((“.$longitude.”- lng)פּי()/180))))180/פּי())601.1515*1.609344) ווי דיסטאַנסע פֿון מאַרקערס מיט דיסטאַנסע>= ".$דיסטאַנסע));
[{"שייַן":1,"נאָמען":"פראַנקיע דזשאַני און לויגאָ אויך","אַדרעס":"939 W El Camino Real, Mountain View, CA","lat":37.386337280273,"lng":-122.08582305908, "דיסטאַנסע":16079.294719663}, {"יד":2,"נאָמען":"Amici's East Coast Pizzeria","address":"790 Castro St, Mountain View, CA","lat":37.387138366699,"lng": -122.08323669434,"דיסטאַנסע":16079.175940152}, {"יד":3,"נאָמען":"קאַפּ ס פּיצאַ בר & גרילל"," אַדרעס":"191 Castro St, Mountain View, CA","lat":37.393886566162, "lng":-122.07891845703,"דיסטאַנסע":16078.381373826},{"id":4,"name":"ראָונד טיש פּיצאַ: Mountain View"," אַדרעס":"570 N Shoreline Blvd, Mountain View, CA", "lat":37.402652740479,"lng":-122.07935333252,"דיסטאַנסע":16077.420540582},{"id":5,"נאָמען":"טאָני & אַלבאַ ס פּיצאַ & מאַקאַראָנען"," אַדרעס":"619 Mountain Escuela" View, CA,”,”lat”:37.394012451172,”lng”:-122.09552764893,”distance”:16078.563225154},{“id”:6,”name”:”Oregano's Wood-Fired Pizza”,”address”:”4546 El Camino Real, Los Altos, CA","lat":37.401725769043,"lng":-122.11464691162,"דיסטאַנסע":16077.937560795},{" שייַן": 7," נאָמען": "די באַרס און גרילז", "אַדרעס": "ווייטלי סטריט 24, מאַנטשעסטער", "לאַט": 53.485118865967, "לנג": -2.1828699111938, "דיסטאַנסע": 8038.7620112314}]
איך ווילן צו צוריקקריגן בלויז ראָוז מיט 20 מייל אָבער עס ברענגט אַלע ראָוז. ביטע וואָס בין איך טאן פאַלש
איך זוך אן ענליכע אנפראגע אבער איך האב א ביסל אויפגעהויבן - בקיצור, דאס איז צו גרופעס אלע קאארדינאַטעס אין 2 מייל פון יעדע קאארדינאט און דערנאך ציילן וויפיל קאארדינאַטעס אין יעדע גרופע און ארויסגעבן בלויז איין גרופע וואס האט די מערסטע קאארדינאַטעס – אפילו אויב איר האָבן מער ווי איין גרופּע צווישן גרופּעס וואָס האָבן די מערסט נומער פון קאָואָרדאַנאַץ - נאָר רעזולטאַט די טראַפ גרופּע פון די גרופּעס מיט די זעלבע גרעסטן נומער -
דאנק איר זייער פיל פֿאַר ייַנטיילונג.