From C, this is as simple as :
/* Create a session with default options */More interesting, you can use that capability in SQL with the ogr_geocode() function that has been added to the SQLite SQL dialect :
OGRGeocodingSessionH hSession = OGRGeocodeCreateSession(NULL);
/* Now query the service */
OGRLayerH hLayer = OGRGeocode(hSession, "Paris", NULL, NULL);
/* Use the result layer (the first feature is generally the most relevant) */
/* Cleanup */
OGRGeocodeFreeResult(hLayer);
OGRGeocodeDestroySession(hSession);
SELECT ST_Centroid(ogr_geocode('Paris'))
returns:
OGRFeature(SELECT):0POINT (2.342878767069653 48.85661793020374)
ogrinfo cities.csv -dialect sqlite -sql \
"SELECT *, ogr_geocode(city, 'country') AS country,
ST_Centroid(ogr_geocode(city)) FROM cities" \
--config OGR_GEOCODE_LANGUAGE en
returns:
OGRFeature(SELECT):0
id (Real) = 1
city (String) = Paris
country (String) = France
POINT (2.342878767069653 48.85661793020374)
OGRFeature(SELECT):1
id (Real) = 2
city (String) = London
country (String) = United Kingdom
POINT (-0.109369427546499 51.500506667319407)
[...]
OGRFeature(SELECT):6
id (Real) = 7
city (String) = Beijing
country (String) = People's Republic of China
POINT (116.391195 39.9064702)
For better efficiency, the results of geocoding queries are cached into a local datasource (by default, a simple SQLite database in the working directory, but the location can be overriden by a configuration option, and other formats - CSV or PostgreSQL - can be selected).
Reverse geocoding is also possible with OGRGeocodeReverse() or the ogr_geocode_reverse() SQL function :
SELECT ogr_geocode_reverse(-100,45,'country','zoom=3') AS country
returns :
OGRFeature(SELECT):0Note: the online services that you may use have generally Term of Uses that disallow bulk geocoding, so use the above capability with care.
country (String) = United States of America