| 

.NET C# Java Javascript Exception

Antwort #A1532 zur Frage #F405: Effizient mit einer großen Menge von GPS-Koordinaten umgehen

Diese Antwort hat bisher 4 Versionen. Frage #F405: Effizient mit einer großen Menge von GPS-Koordinaten umgehen - Antwort #A1532


Version 4
05.11.2009 17:20:13
Dies ist die aktuelle Version
wenn die aktuelle Vergleichsposition stets variabel ist, kommmst du um Rechnerei nicht herum.
Aber lass doch einfach die Datenbank rechnen.

die notwendige formel lautet:
r * arccos[sin(lat1/57.2958) * sin(lat2/57.2958) + cos(lat1/57.2958) * cos(lat2/57.2958) * cos(lng2/57.2958 -lng1/57.2958)]

wobei r der erdradius ist, also
r=3437,75 seemeilen
r=6378,16 kilometer
r=3963,2 meilen

jenachdem was du für eine einheit "herausbekommen" möchtest.

ich geme mal davon aus, du hast eine datenbanktabelle [hier a] in der du lat und lng Werte gespeichert hhast
probier es mal damit (getestet auf mysql, aber sicher auch auf andere DBs portierbar):

@set lat1 = [deine GPS-Lat-Variable]
@set lng1 = [deine GPS-Lng-Variable]
@set max_dist = [der maximale Umkreis]
@set max_treffer = [maximale anzahl treffer]

select a.* , round((6378.16 * acos(((sin(@lat1 / 57.2958) * sin(a.lat / 57.2958)) + ((cos(@lat1 / 57.2958) * cos(a.lat / 57.2958)) * cos((a.lng / 57.2958) - (@lng1 / 57.2958))))),2) AS `entf_km`
from a
where (6378.16 * acos(((sin(@lat1 / 57.2958) * sin(a.lat / 57.2958)) + ((cos(@lat1 / 57.2958) * cos(a.lat / 57.2958)) * cos((a.lng / 57.2958) - (@lng1 / 57.2958))))) < @max_dist
order by entf_km asc
limit @max_treffer



Ich hoffe, ich hab mich nicht mit den klammern versehen.
MiW 1,0k 7
Version 3
05.11.2009 17:20:13
wenn die aktuelle Vergleichsposition stets variabel ist, kommmst du um Rechnerei nicht herum.
Aber lass doch einfach die Datenbank rechnen.

die notwendige formel lautet:
r * arccos[sin(lat1/57.2958) * sin(lat2/57.2958) + cos(lat1/57.2958) * cos(lat2/57.2958) * cos(lng2/57.2958 -lng1/57.2958)]

wobei r der erdradius ist, also
r=3437,75 seemeilen
r=6378,16 kilometer
r=3963,2 meilen

jenachdem was du für eine einheit "herausbekommen" möchtest.

ich geme mal davon aus, du hast eine datenbanktabelle [hier a] in der du lat und lng Werte gespeichert hhast
probier es mal damit (getestet auf mysql, aber sicher auch auf andere DBs portierbar):

@set lat1 = [deine GPS-Lat-Variable]
@set lng1 = [deine GPS-Lng-Variable]
@set max_dist = [der maximale Umkreis]
@set max_treffer = [maximale anzahl treffer]

select select a.* , round((6378.16 * acos(((sin(@lat1 / 57.2958) * sin(a.lat / 57.2958)) + ((cos(@lat1 / 57.2958) * cos(a.lat / 57.2958)) * cos((a.lng / 57.2958) - (@lng1 / 57.2958))))),2) AS `entf_km`
from a
where (6378.16 * acos(((sin(@lat1 / 57.2958) * sin(a.lat / 57.2958)) + ((cos(@lat1 / 57.2958) * cos(a.lat / 57.2958)) * cos((a.lng / 57.2958) - (@lng1 / 57.2958))))) < @max_dist
order by entf_km asc
limit @max_treffer



Ich hoffe, ich hab mich nicht mit den klammern versehen.
MiW 1,0k 7
Version 2
05.11.2009 17:18:37
wenn die aktuelle Vergleichsposition stets variabel ist, kommmst du um Rechnerei nicht herum.
Aber lass doch einfach die Datenbank rechnen.

die notwendige formel lautet:
r * arccos[sin(lat1/57.2958) * sin(lat2/57.2958) + cos(lat1/57.2958) * cos(lat2/57.2958) * cos(lng2/57.2958 -lng1/57.2958)]

wobei r der erdradius ist, also
r=3437,75 seemeilen
r=6378,16 kilometer
r=3963,2 meilen

jenachdem was du für eine einheit "herausbekommen" möchtest.

ich geme mal davon aus, du hast eine datenbanktabelle [hier a] in der du lat und lng Werte gespeichert hhast
probier es mal damit (getestet auf mysql, aber sicher auch auf andere DBs portierbar):

@set lat1 = [deine GPS-Lat-Variable]
@set lng1 = [deine GPS-Lng-Variable]
@set max_dist = [der maximale Umkreis]
@set max_treffer = [maximale anzahl treffer]

select select a.* , round((6378.16 * acos(((sin(@lat1 / 57.2958) * sin(a.lat / 57.2958)) + ((cos(@lat1 / 57.2958) * cos(a.lat / 57.2958)) * cos((a.lng / 57.2958) - (@lng1 / 57.2958))))),2) AS `entf_km`
from a
where (6378.16 * acos(((sin(@lat1 / 57.2958) * sin(a.lat / 57.2958)) + ((cos(@lat1 / 57.2958) * cos(a.lat / 57.2958)) * cos((a.lng / 57.2958) - (@lng1 / 57.2958))))) < @max_dist
limit @max_treffer



Ich hoffe, ich hab mich nicht mit den klammern versehen.
MiW 1,0k 7
Version 1
05.11.2009 17:17:56
wenn die aktuelle vergelcihposition stets variabel ist, kommmst du um Rechnerei nicht herum.
Aber lass doch einfach die Datenbank rechnen.

die notwendige formel lautet:
r * arccos[sin(lat1/57.2958) * sin(lat2/57.2958) + cos(lat1/57.2958) * cos(lat2/57.2958) * cos(lng2/57.2958 -lng1/57.2958)]

wobei r der erdradius ist, also
r=3437,75 seemeilen
r=6378,16 kilometer
r=3963,2 meilen

jenachdem was du für eine einheit "herausbekommen" möchtest.

ich geme mal davon aus, du hast eine datenbanktabelle [hier a] in der du lat und lng Werte gespeichert hhast
probier es mal damit (getestet auf mysql, aber sicher auch auf andere DBs portierbar):

@set lat1 = [deine GPS-Lat-Variable]
@set lng1 = [deine GPS-Lng-Variable]
@set max_dist = [der maximale Umkreis]
@set max_treffer = [maximale anzahl treffer]

select select a.* , round((6378.16 * acos(((sin(@lat1 / 57.2958) * sin(a.lat / 57.2958)) + ((cos(@lat1 / 57.2958) * cos(a.lat / 57.2958)) * cos((a.lng / 57.2958) - (@lng1 / 57.2958))))),2) AS `entf_km`
from a
where (6378.16 * acos(((sin(@lat1 / 57.2958) * sin(a.lat / 57.2958)) + ((cos(@lat1 / 57.2958) * cos(a.lat / 57.2958)) * cos((a.lng / 57.2958) - (@lng1 / 57.2958))))) < @max_dist
limit @max_treffer



Ich hoffe, ich hab mich nicht mit den klammern versehen.
MiW 1,0k 7