Jeśli podoba Ci się Python, możesz użyć GeoPy API w połączeniu z powiązaniami GDAL Python lub Fiona i stworzyć bardzo prosty skrypt do konwersji adresów na punktowy plik kształtu.
Spowoduje to geolokalizację pliku o nazwie „adres_do_geokodu”, tworząc wyjściowy plik kształtów o nazwie „my_output.shp” w folderze my_output:
import os
from geopy import geocoders
from osgeo import ogr, osr
def geocode(address):
g = geocoders.GoogleV3()
place, (lat, lng) = g.geocode(address)
print '%s: %.5f, %.5f' % (place, lat, lng)
return place, lat, lng
def parse_file(filepath, output_shape):
# create the shapefile
drv = ogr.GetDriverByName("ESRI Shapefile")
if os.path.exists(output_shape):
drv.DeleteDataSource(output_shape)
ds = drv.CreateDataSource(output_shape)
# spatial reference
sr = osr.SpatialReference()
sr.ImportFromProj4('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
lyr = ds.CreateLayer(output_shape, sr, ogr.wkbPoint)
# fields
featDefn = lyr.GetLayerDefn()
fld_id = ogr.FieldDefn('id', ogr.OFTInteger)
fld_address = ogr.FieldDefn('ADDRESS', ogr.OFTString)
fld_address.SetWidth(255)
lyr.CreateField(fld_id)
lyr.CreateField(fld_address)
print 'Shapefile %s created...' % ds.name
# read text addresses file
i = 0
f = open(filepath, 'r')
for address in f:
try:
print 'Geocoding %s' % address
place, lat, lng = geocode(address)
point = ogr.Geometry(ogr.wkbPoint)
point.SetPoint(0, lng, lat)
feat = ogr.Feature(lyr.GetLayerDefn())
feat.SetGeometry(point)
feat.SetField('id', i)
feat.SetField('ADDRESS', address)
lyr.CreateFeature(feat)
feat.Destroy()
i = i + 1
except:
print 'Error, skipping address...'
parse_file('addresses_to_geocode', 'my_output')
Plik powinien zawierać tylko wiersz dla jednego adresu, na przykład:
Via Benedetto Croce 112, Rome, Italy
Via Aristide Leonori 46, Rome, Italy
Viale Marconi 197, Rome, Italy
Tutaj korzystam z Google API, ale GeoPy jest bardzo prosty, aby przejść do różnych API, takich jak Yahoo !, GeoNames lub MapPoint .