Google has some powerful APIs. One of them is the Maps API which is capable of geocoding an address to longitude and latitude information.
It is pretty easy to use this functionality from Delphi. All you need is TIdHttp and a JSON library. (I'm using the Delphi Web Utils)
The Google API returns a JSON structure with a couple of fields. However, I just grab the longitude and latitude information as well as the location_type, to determine the quality of the coordinates.
I used this and TGoMaps to create a simple application which takes a list of addresses, geocodes them and displays them on a GoogleMap.
Source and binary are available here.
TAddress uses TStringCase from the previous post.
It is pretty easy to use this functionality from Delphi. All you need is TIdHttp and a JSON library. (I'm using the Delphi Web Utils)
TLocationType = (ltRooftop, ltRangeInterpolated, ltGeometricCenter, ltApproximate); TAddress = class private fAddress : string; fLatitude: double; fLongitude: double; fLocationType: TLocationType; public constructor Create(aAddress : string; aHttp : TIdHttp = nil); property Address : string read fAddress write fAddress; property Latitude : double read fLatitude; property Longitude : double read fLongitude; property LocationType : TLocationType read fLocationType; procedure Geocode(aHttp : TIdHttp); end;
The Google API returns a JSON structure with a couple of fields. However, I just grab the longitude and latitude information as well as the location_type, to determine the quality of the coordinates.
procedure TAddress.GeoCode(aHttp: TIdHttp); var url : string; jo, location, geometry : TJSONObject; sc : TStringCase; begin url := TIdURI.URLEncode('http://maps.google.com/maps/api/geocode/json?address='+fAddress+'&sensor=false'); jo := TJSONObject.create(aHttp.Get(url)); if jo.getString('status') = 'OK' then begin geometry := jo.getJSONArray('results').getJSONObject(0).getJSONObject('geometry'); location := geometry.getJSONObject('location'); fLongitude := location.getDouble('lng'); fLatitude := location.getDouble('lat'); sc := TStringCase.Create; try sc.addEntry('ROOFTOP',procedure begin fLocationType := ltRooftop; end); sc.addEntry('RANGE_INTERPOLATED',procedure begin fLocationType := ltRangeInterpolated; end); sc.addEntry('GEOMETRIC_CENTER',procedure begin fLocationType := ltGeometricCenter; end); sc.addEntry('APPROXIMATE',procedure begin fLocationType := ltApproximate; end); finally sc.switch(geometry.getString('location_type')); end; sc.Free; end else raise Exception.Create(jo.getString('status')); jo.Free; end;
I used this and TGoMaps to create a simple application which takes a list of addresses, geocodes them and displays them on a GoogleMap.
Source and binary are available here.
TAddress uses TStringCase from the previous post.