你排序解答你的問題。使用插入或更新時修改行的database trigger。首先,使用Python的geopy
3模塊做一個簡單的地址地理編碼包裝函數:
CREATE OR REPLACE FUNCTION geocode_address(address text)
RETURNS geometry AS
$BODY$import geopy
from geopy.geocoders import Nominatim
geolocator = Nominatim()
location = geolocator.geocode(address)
if location:
return 'SRID=4326;POINT(%r %r)' % (location.longitude, location.latitude)
$BODY$ LANGUAGE plpython3u VOLATILE COST 1000;
測試出來:
SELECT ST_AsText(geocode_address('175 5th Avenue NYC'));
...應該返回POINT(-73.9366879 40.814044)
。
現在你可以在任何地方使用的功能,包括該觸發功能:
CREATE OR REPLACE FUNCTION geocode_address_trigger() RETURNS trigger AS
$BODY$BEGIN
NEW.geom := geocode_address(NEW.address);
RETURN NEW;
END;$BODY$ LANGUAGE plpgsql VOLATILE COST 100;
然後應用觸發功能來mytable
,與address
和geom
領域。
CREATE TRIGGER mytable_geocode_address
BEFORE INSERT OR UPDATE
ON mytable
FOR EACH ROW
EXECUTE PROCEDURE geocode_address_trigger();
問題是,谷歌地理編碼器不能在plpgsql中工作。您可以創建自己的地理編碼器,但我真的不希望使用虎地理編碼器或nominatim爲特定項目的原因。我嘗試過,像你建議從plpythonu工作,但plpythonu不會工作。我的plpythonu版本是針對Python 3.2編譯的。 Pip安裝geopy(或任何其他模塊),或手動安裝geopy不能工作的原因,我不明白(他們在2.7和3.4工作正常)。我想我希望除了這種常識/簡單的做法之外還有一個我無法想到的答案。 – 2014-10-28 02:36:07
您的回答非常好。我實際上建議他在gis.stackexchange上的類似問題上使用觸發器,但是決定的問題是沒有足夠的研究/找到我的工具/給我的代碼陣營。 – 2014-10-28 08:17:39