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.

