Page 1 of 2 1 2 LastLast
Results 1 to 15 of 24

Thread: Berekenen afstand tussen 2 adressen

  1. #1
    Senior Member Kwak's Avatar
    Join Date
    Oct 2001
    Location
    Hasselt - Belgi?½
    Posts
    155

    Berekenen afstand tussen 2 adressen

    Hallo,

    Voor mijn (Firemonkey) applicatie wil ik een functie inbouwen die automatisch het aantal km berekend tussen 2 adressen.
    Heeft iemand hier reeds ervaring mee?

    Via Google kom ik uit bij 'Distance Matrix Service van Google', maar ik vind geen concrete voorbeelden in Delphi.

    Alvast bedankt voor jullie reacties!

  2. #2
    Bedoel je de rij-afstand, of de hemelsbrede afstand? Wanneer je bijvoorbeeld op Funda of Marktplaats zoekt naar adressen binnen een bepaalde afstand, wordt volgens mij gekeken naar de absolute afstand tussen twee postcodegebieden. Daarvoor kun je het centrum van het postcodegebied nemen en met de stelling van pythagoras de afstand daartoe berekenen.

    Die tabellen met postcodegebieden zijn in beheer van PostNL, denk ik, maar ik weet niet of deze redelijk algemene lijst nog geld kost.

    Als je de afstand van adres naar adres wilt weten, afgelegd over de weg, dan heb je een uitgebreide wegenkaart nodig, of je moet inderdaad gebruik maken van een dienst zoals die van Google. Die api staat zo te zien redelijk uitgebreid gedocumenteerd. Het aanroepen en verwerken ervan is een kwestie van aanroepen met een TIdHTTP. Het resultaat krijg je terug in XML of in JSON. Om XML te parsen heeft Delphi al wat tools aan boord. Voor JSON zijn er prima gratis libraries te vinden.

    Ik heb geen concrete ervaring met deze api, maar wel haast al bovenstaande deeloplossingen toegepast. Waar loop je vast?
    1+1=b

  3. #3
    Interessante vraag, het antwoord wil ik ook wel weten !

    Geen idee of dit werkt, maar

    http://theroadtodelphi.wordpress.com...functionality/

    Lx
    Minstens ?®?®n hobby naast programmeerwerk is echt noodzakelijk

  4. #4
    Google is (weer eens) je grootste vriend . Het artikel stuurt een webbrowser aan, maar als je alleen de gegevens wilt kun je die simpelweg in XML (of JSON) opvragen.

    Deze URL

    http://maps.googleapis.com/maps/api/...s&sensor=false

    Geeft je dit resultaat:

    HTML Code:
    <DistanceMatrixResponse>
    <status>OK</status>
    <origin_address>Amsterdam, Nederland</origin_address>
    <destination_address>Parijs, Frankrijk</destination_address>
    <row>
    <element>
    <status>OK</status>
    <duration>
    <value>17690</value>
    <text>4 uur 55 min.</text>
    </duration>
    <distance>
    <value>506976</value>
    <text>507 km</text>
    </distance>
    </element>
    </row>
    </DistanceMatrixResponse>
    De uitleg vind je hier: https://developers.google.com/maps/d...istancematrix/
    Marcel

  5. #5
    Senior Member Kwak's Avatar
    Join Date
    Oct 2001
    Location
    Hasselt - Belgi?½
    Posts
    155
    Dank voor de info! De info van Marcel is de nagel op de kop en hiermee moet het zeker lukken.

  6. #6
    Leuk minimal oplossing inderdaad ! Dank Marcel, geweldige link
    Minstens ?®?®n hobby naast programmeerwerk is echt noodzakelijk

  7. #7
    Senior Member Kwak's Avatar
    Join Date
    Oct 2001
    Location
    Hasselt - Belgi?½
    Posts
    155
    EN het werkt perfect!
    Ik geef ook nog even mijn gebruikte code mee

    Code:
    procedure TKlanten.Button6Click(Sender: TObject);
    var
      lHTTP: TIdHTTP;
      myurl,StrJson, status : string;
      LJsonObj  : TJSONObject;
      LRows, LElements, LItem : TJSONValue;
    
    begin
      myurl := 'http://maps.googleapis.com/maps/api/distancematrix/json?origins='+ GemeenteEdit.Text + '_' + RemoveNumbers(AdresEdit.Text)+ '&destinations='+ MasterDM.QParameters.FieldByName('basis_gemeente').AsString + '_' + RemoveNumbers(MasterDM.QParameters.FieldByName('basis_adres').AsString)  +'&sensor=false';
      lHTTP := TIdHTTP.Create(nil);
      StrJson := lHTTP.Get(myurl);
      LJsonObj := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StrJson),0) as TJSONObject;
      try
         LRows:=LJsonObj.Get('rows').JsonValue;
         LElements:=TJSONObject(TJSONArray(LRows).Get(0)).Get('elements').JsonValue;
         LItem :=TJSONObject(TJSONArray(LElements).Get(0)).Get('status').JsonValue;
         status := LItem.Value;
         if status = 'OK' then
         Begin
         MasterDM.CDSContacten.Edit;
         LItem :=TJSONObject(TJSONArray(LElements).Get(0)).Get('distance').JsonValue;
         MasterDM.CDSContacten.FieldByName('aantalkm').AsString := RemoveAlpha((TJSONObject(LItem).Get('text').JsonValue.Value));
         LItem :=TJSONObject(TJSONArray(LElements).Get(0)).Get('duration').JsonValue;
         MasterDM.CDSContacten.FieldByName('tijdschatting').AsString := '('+ (TJSONObject(LItem).Get('text').JsonValue.Value)+')';
         End else
         ShowMessage('Het adres werd niet terug-gevonden! Gelieve de km manueel in te geven.');
      finally
         LJsonObj.Free;
      end;

  8. #8
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ik denk alleen wel dat je de URL nog moet safe-encoden, want je krijgt waarschijnlijk problemen
    als, bijvoorbeeld, de gemeente "Heist op den berg" of "Bergen op zoom" heet.

    Vergeet overigens ook niet om je TIdHTTP instantie (lHTTP) weer vrij te geven.

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  9. #9
    Kans is groot dat TIdHTTP slim genoeg is om dat voor je te doen.
    1+1=b

  10. #10
    Lol.. ik was net aan het pielen

    Delphi 7.0 en Indy voorbeeld:

    Delphi Code:
    1. unit Unit1;
    2.  
    3. interface
    4.  
    5. uses
    6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    7.   Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
    8.   IdTCPClient, IdHTTP;
    9.  
    10. type
    11.   TForm1 = class(TForm)
    12.     Memo1: TMemo;
    13.     butTest: TButton;
    14.     IdHTTP1: TIdHTTP;
    15.     edStad1: TEdit;
    16.     edStad2: TEdit;
    17.     Label1: TLabel;
    18.     Label2: TLabel;
    19.     procedure butTestClick(Sender: TObject);
    20.   private
    21.     { Private declarations }
    22.   public
    23.     function GetDistance(Adr1,Adr2: string; mode: string): string;
    24.     { Public declarations }
    25.   end;
    26.  
    27. var
    28.   Form1: TForm1;
    29.  
    30. implementation
    31.  
    32. {$R *.dfm}
    33.  
    34. function TForm1.GetDistance(Adr1,Adr2: string; mode: string): string;
    35. var sURL,sMainURL,sOrig,sDest: string;
    36. begin
    37.   sOrig:=Adr1;
    38.   sDest:=Adr2;
    39.   sMainURL:='http://maps.googleapis.com/maps/api/distancematrix/xml';
    40.   sURL:=sMainURL+'?'+'origins='+sOrig+'&'+'destinations='+sDest+'&'+'sensor=false';
    41.   sURL:=sURL+'&'+'mode='+mode;
    42.   Result:=idHTTP1.Get(sUrl);
    43. end;
    44.  
    45. function MetersFromGMapsXML(s: string): double;
    46. var p: integer;
    47. begin
    48.   Result:=-1.0;
    49.   try
    50.     p:=pos('<distance>',s); delete(s,1,p);
    51.     p:=pos('<value>',s);    delete(s,1,p);
    52.     p:=pos('</value>',s);
    53.     Result:=strtofloat(trim(copy(s,7,p-7)));
    54.   except
    55.     if pos('igin_address><',s)>0 then form1.memo1.text:='Fout in vertrek-adres.';
    56.     if pos('tion_address><',s)>0 then form1.memo1.text:='Fout in bestemming.';
    57.   end;
    58. end;
    59.  
    60. procedure TForm1.butTestClick(Sender: TObject);
    61. var s,Adr1,Adr2: string;
    62. var d: double;
    63. begin
    64.   Adr1:=edStad1.Text; Adr2:=edStad2.Text;
    65.  
    66.   memo1.clear;
    67.   s:=GetDistance(Adr1,Adr2,'walking');
    68.   d:=MetersFromGMapsXML(s);
    69.   if d>0 then memo1.lines.add('De loopafstand tussen '+Adr1+' en '+Adr2+' is '+
    70.                                format('%5.2f km',[d/1000.0]));
    71.   s:=GetDistance(Adr1,Adr2,'bicycling');
    72.   d:=MetersFromGMapsXML(s);
    73.   if d>0 then memo1.lines.add('De fietsafstand tussen '+Adr1+' en '+Adr2+' is '+
    74.                                format('%5.2f km',[d/1000.0]));
    75.   s:=GetDistance(Adr1,Adr2,'driving');
    76.   d:=MetersFromGMapsXML(s);
    77.   if d>0 then memo1.lines.add('De rijdafstand tussen '+Adr1+' en '+Adr2+' is '+
    78.                                format('%5.2f km',[d/1000.0]));
    79. end;
    80.  
    81. end.
    Attached Thumbnails Attached Thumbnails Click image for larger version. 

Name:	Untitled.jpg 
Views:	177 
Size:	27.8 KB 
ID:	6373   Click image for larger version. 

Name:	Untitled2.jpg 
Views:	180 
Size:	28.7 KB 
ID:	6374   Click image for larger version. 

Name:	Untitled3.jpg 
Views:	171 
Size:	19.7 KB 
ID:	6375  
    Minstens ?®?®n hobby naast programmeerwerk is echt noodzakelijk

  11. #11
    Waarom loopafstand als je ook kunt vliegen?

  12. #12
    Quote Originally Posted by Benno View Post
    Waarom loopafstand als je ook kunt vliegen?
    Daarvoor kan je een grootcirkelafstand uitrekenen (bijv met de haversine formule)...

  13. #13
    Met deze oplossing werkt het prima, maar de afstand wijkt wel iets af t.o.v. de afstand die wordt berekend in Google Maps zelf.
    Dus dat is wel vreemd.
    Bijvoorbeeld een adres in Zutphen naar een adres in Amsterdam is 1 km korter (118 km) met deze oplossing dan in GoogleMaps (119 km).
    Heeft iemand anders hiet ook last van?

  14. #14
    Quote Originally Posted by WIZZkit View Post
    Bijvoorbeeld een adres in Zutphen naar een adres in Amsterdam is 1 km korter (118 km) met deze oplossing dan in GoogleMaps (119 km).
    Misschien een afronding. De Api geeft precies km met twee achter de komma. De Google Maps geeft volgens mij alleen maar hele kilometers.

  15. #15

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •