Avatar billede philip1804 Nybegynder
23. oktober 2005 - 14:51 Der er 10 kommentarer og
1 løsning

Afstand, 10 nærmeste

Jeg har i en MySql database 60.000 koordinat-sæt gemt under Longitude og Latitude.

Jeg ønsker at finde de 10 koordinat-sæt der ligger tættest på et givent koordinat-sæt. Har fået at vide at det kan gøres i SQL så forespørgelsen returnere dem, men har ingen anelse om hvordan. Nogen der kan hjælpe?

Hvis det er point der skal til kan i få alle jeg har… Bare i vil hjælpe. :)
Avatar billede jaw Nybegynder
23. oktober 2005 - 14:54 #1
Hvordan er dine grader gemt? Som 10N17 eller som 1017N eller hvordan? Og nærmest i forhold til et punkt du angiver hvordan?

Og du må ikke give mere end 200 point pr. spørgsmål :)
Avatar billede philip1804 Nybegynder
23. oktober 2005 - 14:57 #2
Kan se ud som dette:
Longitude: -74.4301
Latitude: 39.378

Ja det er i forhold til et punkt jeg angiver.
Avatar billede jaw Nybegynder
23. oktober 2005 - 16:45 #3
Måske:
SELECT * FROM tabel ORDER BY ABS(`longitude-felt` - 74) LIMIT 10

Den vil burde give dig de 10 rækker, hvor breddegraden er tættest på 74 (+/N).
Avatar billede erikjacobsen Ekspert
23. oktober 2005 - 16:54 #4
Afstand baseret på længde- og breddegrad kræver en lidt mere indviklet formel. Fx. http://www.geocities.com/mvarc/repeater/repeater_distance.html
Den kan sagtens skrives i mysql, der har sin, cos og arccos (hedder acos) indbygget.
Er der mange punkter i tabellen, vil det tage lang tid. Så kan en opdeling i områder evt. komme på tale.
Avatar billede philip1804 Nybegynder
23. oktober 2005 - 17:10 #5
Tak for formlerne, men det jeg virkelig gerne vil have er mysql kode eksempler..
Avatar billede erikjacobsen Ekspert
23. oktober 2005 - 17:14 #6
Formlen i det tidligere link glemte vist lige jordens radius. Den her skulle være bedre.
Du skal bare bruge en passende formel i WHERE-delen i din SELECT-sætning. Bemærk dog at trigonometriske funktioner i mysql tager radianer og du har grader.
Avatar billede philip1804 Nybegynder
23. oktober 2005 - 17:17 #7
"Den her skulle være bedre"? hvilken?
Avatar billede erikjacobsen Ekspert
23. oktober 2005 - 17:30 #8
Avatar billede philip1804 Nybegynder
26. oktober 2005 - 10:31 #9
Tak for hjælpen, det kom til at virke med følgende kode. så smid et svar...

$distance = (200/6378); //200 km
$query = "SELECT * ACOS( COS(
RADIANS( hi_hotels.Latitude ) ) * COS( RADIANS( hi_hotels.Longitude )
) * COS( RADIANS( $hotel[Latitude] ) ) * COS( RADIANS(
$hotel[Longitude] ) ) + COS( RADIANS(  hi_hotels.Latitude ) ) * SIN(
RADIANS( hi_hotels.Longitude ) ) * COS( RADIANS( $hotel[Latitude] ) )
* SIN( RADIANS( $hotel[Longitude] ) ) + SIN( RADIANS(
hi_hotels.Latitude ) ) * SIN( RADIANS( $hotel[Latitude] ) ) )
AS Distance
FROM hi_hotels
ORDER BY Distance ASC LIMIT 0 , 10";
Avatar billede erikjacobsen Ekspert
26. oktober 2005 - 11:21 #10
Ingen point til mig, tak.

Fx. kan      COS( RADIANS( $hotel[Latitude] ) )    udregnes på forhånd i PHP - jeg ved ikke om det sparer noget særligt.
Avatar billede philip1804 Nybegynder
17. marts 2006 - 10:21 #11
hmm, så lukker jeg den selv :S
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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