【问题标题】:How to find all street intersections in my city using Postgis如何使用 Postgis 查找我所在城市的所有街道交叉口
【发布时间】:2017-08-02 22:29:25
【问题描述】:

嗨,我必须找到所有街道交叉口,我在下面编写了代码,但它返回了重复的行。有谁知道为什么或知道如何纠正它!感谢您的帮助。

DROP TABLE IF EXISTS toto;

CREATE TABLE toto(
gid serial primary key,
nom_voie1 varchar(50),
nom_voie2 varchar(50),
geom_inter geometry(Geometry,4326)
);

CREATE INDEX ON toto using gist (geom_inter);

INSERT INTO toto(nom_voie1, nom_voie2, geom_inter)
SELECT a.nom_voie, b.nom_voie, ST_Intersection(a.geom, b.geom)
FROM reseau_routier AS a , reseau_routier AS b 
WHERE ST_Intersects(a.geom,b.geom) 
  AND ST_Touches(a.geom, b.geom) 
  AND a.gid < b.gid 
  AND a.nom_voie <> b.nom_voie; 

【问题讨论】:

  • 我有同样的问题,即使我添加了 DISTINCT !!!

标签: postgresql geolocation geometry geospatial postgis


【解决方案1】:

由于reseau_routier 上的JOIN,您被重复了。

您可以删除重复的:

INSERT INTO toto(nom_voie1, nom_voie2, geom_inter)
SELECT a.nom_voie, b.nom_voie, ST_Intersection(a.geom, b.geom)
FROM reseau_routier AS a , reseau_routier AS b 
WHERE ST_Intersects(a.geom,b.geom) 
  AND ST_Touches(a.geom, b.geom) 
  AND a.gid < b.gid 
  AND a.nom_voie <> b.nom_voie
GROUP BY  a.nom_voie, b.nom_voie, ST_Intersection(a.geom, b.geom);

但是这些重复是格式错误的查询的标志。有了完整的数据样本,就可以更轻松地为您提供完美的查询。

【讨论】:

    【解决方案2】:

    使用显式连接而不是隐式连接

    INSERT INTO toto(nom_voie1, nom_voie2, geom_inter)
    SELECT a.nom_voie, b.nom_voie, ST_Intersection(a.geom, b.geom)
    FROM reseau_routier AS a
    JOIN reseau_routier AS b on ST_Intersects(a.geom,b.geom)
      AND a.gid < b.gid 
      AND a.nom_voie <> b.nom_voie; 
    

    【讨论】:

      【解决方案3】:
      SELECT DISTINCT a.nom_voie, b.nom_voie, ST_Intersection(a.geom, b.geom)
      

      【讨论】:

        猜你喜欢
        • 2014-11-03
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多