【问题标题】:Geocoding address as soon as table in PostGIS is updatedPostGIS中的表格更新后的地理编码地址
【发布时间】:2014-10-27 17:43:42
【问题描述】:

我正在尝试使用 Python 对存储在 PostGIS 表中的地址列表进行地理编码。我想进行设置,以便每次更新表格并添加新地址时,都会自动对其进行地理编码(然后绘制在地图上)。我能想到的唯一方法是使用 plpythonu 创建一个地理编码函数,然后结合更新和触发器来获得我想要的。然而,plpythonu 的行为真的很奇怪(我可能稍后会在这里问这个问题,但现在我正在寻找替代解决方案而不是弄清楚 plpythonu)。

我想不出另一种方法来设置条目,以便在将条目输入数据库后立即对其进行地理编码?有人可以给我一些关于从哪里开始寻找的想法吗?

【问题讨论】:

    标签: python sql gis postgis


    【解决方案1】:

    你有点回答了你的问题。使用 database trigger 在插入或更新行时对其进行修改。首先,使用geopy Python 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();
    

    【讨论】:

    • 问题是谷歌地理编码器在plpgsql中不起作用。您可以创建自己的地理编码器,但出于项目特定的原因,我真的不想使用老虎地理编码器或提名。我试过了,就像你建议从 plpythonu 工作一样,但 plpythonu 不起作用。我的 plpythonu 版本是针对 Python 3.2 编译的。 Pip install geopy (或任何其他模块),或手动安装 geopy 由于我无法理解的原因不起作用(它们在 2.7 和 3.4 中工作正常)。我想我希望除了常识/简单的方法之外还有一个我想不到的答案。
    • 你的回答很好。我实际上建议他在 gis.stackexchange 上的一个类似问题上使用触发器,但我决定这个问题是在没有足够的研究/给我找一个工具/给我的 codez 阵营。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多