如何使用Postgis查找我所在城市的所有街道交叉口

时间:2017-03-12 23:51:43

标签: postgresql geolocation geometry geospatial postgis

  

嗨,我必须找到所有的街道交叉点,我写下面的代码,但它返回重复的行。有没有人知道为什么或khnows如何纠正它!谢谢你的帮助。

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; 

enter image description here

3 个答案:

答案 0 :(得分:1)

由于JOIN上的reseau_routier,您正在重复。

您可以删除重复的:

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);

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

答案 1 :(得分:1)

使用显式连接而不是隐含

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; 

答案 2 :(得分:0)

<?php 

$star = 1;
$json_data = '{"1": "1", "2": "1"}';
$array_data = json_decode($json_data, true);
if(array_key_exists($star, $array_data)) {
    $value = $array_data[$star];
    if ($value !== false) {
        $array_data[$star] = (string)((int)$value + 1);
    }

}

echo json_encode($array_data);

?>