2014-10-27 64 views
-1

我正嘗試使用Python對我在PostGIS中的表中存儲的地址列表進行地理編碼。我想設置一些內容,以便每次更新表格並添加新地址時,都會自動進行地理編碼(然後繪製在地圖上)。我能想到的唯一方法就是使用plpythonu創建地理編碼功能,然後使用更新和觸發器的組合來獲得我想要的結果。然而,plpythonu的表現真的很奇怪(後面我可能會問這個問題,但現在我正在尋找替代解決方案,而不是找出plpythonu)。儘快更新PostGIS中的表格的地理編碼地址

我想不出另一種設置方法,所以一旦輸入到數據庫中就會進行地理編碼?有人能給我一些關於從哪裏開始尋找的想法嗎?

回答

2

你排序解答你的問題。使用插入或更新時修改行的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,與addressgeom領域。

CREATE TRIGGER mytable_geocode_address 
    BEFORE INSERT OR UPDATE 
    ON mytable 
    FOR EACH ROW 
    EXECUTE PROCEDURE geocode_address_trigger(); 
+0

問題是,谷歌地理編碼器不能在plpgsql中工作。您可以創建自己的地理編碼器,但我真的不希望使用虎地理編碼器或nominatim爲特定項目的原因。我嘗試過,像你建議從plpythonu工作,但plpythonu不會工作。我的plpythonu版本是針對Python 3.2編譯的。 Pip安裝geopy(或任何其他模塊),或手動安裝geopy不能工作的原因,我不明白(他們在2.7和3.4工作正常)。我想我希望除了這種常識/簡單的做法之外還有一個我無法想到的答案。 – 2014-10-28 02:36:07

+0

您的回答非常好。我實際上建議他在gis.stackexchange上的類似問題上使用觸發器,但是決定的問題是沒有足夠的研究/找到我的工具/給我的代碼陣營。 – 2014-10-28 08:17:39