Gebruiker:Michiel1972/Navigatie nabijgelegen locaties

Voor een locatie (plaats) A met bekende geografische coördinaten kan een cirkel worden getoond met een zekere straal r rond middelpunt A waarin maximaal k (circa 24) andere wikilinks naar nabijgelegen artikelen met coördinaten worden geplaatst in de juiste verhoudingen.

Aanpak bewerken

  • Lijst met artikelen met coördinaten
  • Start met straal van r km (8 km gebruikt voor Amerikaanse plaatseen)
  • Herhaal voor elk artikel
latitude:= strtoint(latdeg) + (strtoint(latmin)/60) + (strtoint(latsec)/3600);
longitude:= -1*(strtoint(londeg) + (strtoint(lonmin)/60) + (strtoint(lonsec)/3600));

graadlat:= 1852*60;           //afst per graad in m
latdist:=  8000/graadlat;     //zoekafst k uitgedrukt in graden Z en N

radlatitude:=latitude/57.29578;
radlongitude:=longitude/57.29578;

graadlon:=abs((3.1415/180)*cos(radlatitude)*6378000);
londist:=8000/graadlon;

N1:=latitude+(zoekfactor*latdist);   //Grenzen vierkant
Z1:=latitude-(zoekfactor*latdist);
E1:=longitude+(zoekfactor*londist);
W1:=longitude-(zoekfactor*londist);
  • Zoek nu de k plaatsen die binnen het vierkant valt; ga de gehele lijst af
latitude2:= strtoint(latdeg2) + (strtoint(latmin2)/60) + (strtoint(latsec2)/3600);
longitude2:= -1*(strtoint(londeg2) + (strtoint(lonmin2)/60) + (strtoint(lonsec2)/3600));

radlatitude2:=latitude2/57.29578;
radlongitude2:=longitude2/57.29578;


if  (latitude2>Z1) and
    (latitude2<N1) and
    (longitude2<E1) and
    (longitude2>W1) and
    (strtitel<>strtitel2) //niet hetzelfde artikel opnemen
      then
       begin
       afstand:=round((arccos(cos(radlatitude)*cos(radlongitude)*cos(radlatitude2)*cos(radlongitude2)   + cos(radlatitude)*sin(radlongitude)*cos(radlatitude2)*sin(radlongitude2) + sin(radlatitude)*sin(radlatitude2)) * 6378000)/1000);

       if afstand <= 8*zoekfactor then   //valt in circelvorm van  8km  x factor
           begin
           found:=true;
           inc(foundnr);
            
           //bewaar gevonden plaats
            .. =...

           if foundnr=24 then
              begin
              //stop maar, max bereikt

              break; //einde van loop
              end;

           end;  



  • Indien gevonden plaatsen in opgegeven schaal, bereken x en y op scherm.
  • Foundnrgrens is minimaal aantal plaatsen dat is gevonden en op scherm kan worden getoond (circa 5 als minimum.)
if (found=true) and (foundnr>foundnrgrens) then
  begin

  for teller:=1 to foundnr do  //voor alle gevonden plaatsen berekenx en y
     begin
     xplaats[teller]:=0.05 -0.9*((longitude-(zoekfactor*londist)-lonplaats[teller]) /(zoekfactor*londist*2));
     yplaats[teller]:=0.05 +0.9*((latitude+(zoekfactor*latdist)-latplaats[teller]) /(zoekfactor*latdist*2));

     end;
  • Indien niets gevonden, of te weinig plaatsen, vergroot straal r met een factor.
foundnr:=0;
inc(zoekfactor);     //dubbele afstand. Doe net zo vaak tot je wel wat vind
           
if zoekfactor=20 then  //20x8km=160km, maximale range
             begin
             //stop maar , forget this one

             inc(loopi);  //next line in mainloop
             zoekfactor:=1;
             end;


Symbolen bewerken

Stel dat ik dit voor locaties in Amsterdam ga doen. En als kernwoorden de categorienaam gebruik ( bouwwerk, metro, brug, tunnel, weg, straat, gracht). Zie [1]

type symbool opm
plaats<20.000   omvang afh van inwoners
plaats>20.000  
landmark (object)  
opp. water