Avatar billede ewax Nybegynder
10. januar 2012 - 23:51 Der er 12 kommentarer og
1 løsning

Find koordinater indenfor given radius

Hej eksperter

Jeg er ved at lave en side hvor jeg har brug for at finde annoncer indenfor given radius x

Jeg har en database med alle postnumre og tilhørende koordinater i wgs84 format (googlemaps/gps)

Jeg har allerede en formel der kan udregne afstande mellem koordinater herfra http://www.movable-type.co.uk/scripts/latlong.html - hvis det kan være til inspiration


Har lavet en illustration af hvad jeg mangler her http://www.gratisimage.dk/image-D8A7_4F0CBEE4.jpg
De blå er registrerede koordinater i databasen kaldet hhv. "lat" og "lon", den lyseblå er det udvalgte koordinat der tages udgangspunkt i. Den pink cirkel er given scanning radius i kilometer


Er der nogen der har erfaringer med den slags eller rigtig gode til matematik/koordinatregning? :-)

På forhånd tak!
Avatar billede moddi100 Seniormester
11. januar 2012 - 00:23 #1
Du kan benytte nedenstående formel til at beregne afstanden mellem dig (det faste koordinat) og den angivne koordinat. Så tjekker du selvfølgelig bare om længden er større end radius:

Punkt A = (x1, y2)
Punkt B = (x2, y2)

Længde: = sqrt( (x2 - x1)^2 + (y2 - y1)^2 );
Avatar billede Slettet bruger
11. januar 2012 - 01:19 #2
Jeg plejer at bruge denne metode (java kode) som returnerer afstanden mellem to koordinater (din egen lokation og den du sammenligner med) i meter:
  double distance(double x1, double y1, double x2, double y2) {
    int r = 6371009;
    double dx = (x2 - x1) * Math.PI / 180;
    double dy = (y2 - y1) * Math.PI / 180;
    double mx = (x1 + x2) * Math.PI / 360;
    return r * (Math.sqrt(dx * dx + Math.pow(Math.cos(mx) * dy, 2)));
  }
Jeg har desværre glemt hvor jeg har det fra. Der findes mange måder at udregne afstanden på, og de er stort set alle sammen nogle tilnærmelser (inkl. den jeg har vist), men gode nok til de fleste formål.
Avatar billede olebole Juniormester
11. januar 2012 - 16:05 #3
<ole>

@tolamaps: Der er ingen grund til at bruge tilnærmelser, når man nu har en ligning, der præcist beskriver cirklen - og som i øvrigt er beskrevet i #1  =)

/mvh
</bole>
Avatar billede Slettet bruger
11. januar 2012 - 18:07 #4
@olebole
Den ligning virker kun i nogle helt specielle tilfælde. For det første afhænger radius af om du er tæt på polerne eller ækvator, og for det andet vil ligningen ikke kunne bruges hvis dine koordinater ikke ligger på samme breddegrad (og så lader vi selvfølgelig som om jorden er kuglerund). :)
Avatar billede olebole Juniormester
11. januar 2012 - 18:12 #5
Ahhhhh ... tilnærmelse i dén forstand. Ja, så har du fuldstændig ret. Jeg tænkte på todimensionel geometri ... sorry  *o)
Avatar billede moddi100 Seniormester
11. januar 2012 - 18:16 #6
Når vi ikke snakker om en større afstand end den definerede af spørger, tror jeg ikke det gør nogen forskel om du tager højde for jordens runding mm.

Men mon ikke det var på tide at få spørger på banen?
Avatar billede olebole Juniormester
11. januar 2012 - 18:24 #7
Det betyder absolut intet i spørgerens situation. Han skal angive en cirkaafstand fra en køber til en sælger, og da han i forvejen bruger en afstand i fugleflugt, skal der en meget stor afstand til, før resultatet bliver seriøst forstyrret af jordens krumning  =)
Avatar billede Slettet bruger
11. januar 2012 - 19:21 #8
Jamen hvis vi bliver på vores breddegrader, så har jeg sjusset mig frem til denne formel med udgangspunkt i cirklens ligning (den ser ud til at fungere med en tolerance på max et par meter, men det kan spørgen måske selv efterprøve):
Længde (km) = 62.8*Math.sqrt(3.1*(x2-x1)^2+(y2-y1)^2)
Avatar billede ewax Nybegynder
24. april 2012 - 13:29 #9
Jeg har ikke glemt jer :)

Jeg har pt. fået udarbejdet et script der arbejder sammen med min databas og udregner en firkant indenfor den givne afstand. det ville selvfølgelig blive mere nøjagtigt med en cirkel. Når jeg engang får tid vil jeg prøve at lave det om

Vil i have points for jeres hovedvridning? så opret et svar :)
Avatar billede moddi100 Seniormester
24. april 2012 - 19:58 #10
En firkant? Hvorfor ikke netop benytte dig af vores tidligere svar og få lavet en cirkel? Det er vel lige så let?
Avatar billede olebole Juniormester
24. april 2012 - 22:56 #11
Du kan oprette et prepared statement sådan:

$const = 6371; // Konstant for udregning i km. Skal ikke ændres
$lat = 12.5768655;
$lng = 55.7096303;
$radius = 20; // Afstand i km

$stmt = $db->prepare('SELECT `id`, `lat`, `lng`, round((?*acos(cos(radians(?)) * cos(radians(`lat`)) * cos(radians(`lng`) - radians(?)) + sin(radians(?)) * sin(radians(`lat`))))) AS dst FROM `orig_locations` HAVING dst<=?');
$stmt->bind_param('idddi', $const, $lng, $lat, $lng, $radius);

Så henter du de poster, der ligger inden for en radius på 20 km
Avatar billede olebole Juniormester
24. april 2012 - 22:57 #12
Avatar billede ewax Nybegynder
25. april 2012 - 09:31 #13
Jeg kigger på det når jeg skal gennem projektet igen, takker mange gange :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester