J'essaie d'identifier où les routes se croisent et de faire un point à cette intersection, avec le nombre de routes qui forment l'intersection répertoriée.
Je me demandais s'il y avait un moyen d'utiliser ST_NumPoints pour y parvenir, mais je n'arrive pas à comprendre ce que je devrais faire. Ce que j'ai fait, c'est de créer une table de points où les lignes se croisent en utilisant le code suivant:
CREATE TABLE test_points as
SELECT
ST_Intersection(a.geom, b.geom),
a.gid
FROM
roads as a,
roads as b
WHERE
ST_Touches(a.geom, b.geom);
Si je lance cela sur un échantillon de routes, j'obtiens la grille de points suivante (les routes sont illustrées):
Si j'inspecte l'un des points, je constate qu'il y a plusieurs points empilés les uns sur les autres:
Le GID ici est l'ID de la route, mais je ne comprends pas pourquoi il y a beaucoup de points. Je peux comprendre que 4 points soient comptés pour une intersection routière centrale, mais il y a 12 points énumérés ici. Existe-t-il une meilleure façon d'effectuer ce calcul dans PostGIS?
COUNT()
telles queCOUNT(ST_Touches(..))
etCOUNT(ST_Intersection(..))
mais cela ne semble pas fonctionner comme toutes les valeurs12
.C'est un peu plus compliqué que vous ne le pensez. En effet, il n'existe aucun bon moyen d'analyser les relations pour plus de paires. Vous ne pouvez pas mettre trois lignes dans une fonction et demander si toutes se croisent.
Mais, au moins une approche pourrait être de trouver d'abord les croisements, puis de vérifier le nombre de routes qui se touchent à chaque croisement (tout peut être fait dans la même requête).
Si vos routes se connectent parfaitement les unes aux autres et qu'aucune route ne passe par un croisement, vous pouvez faire quelque chose comme ceci (non testé):
édité avec une clause de groupe oublié (toujours non testé):
Si les routes ne sont pas connectées correctement et / ou que certaines routes passent par un croisement, c'est plus compliqué.
HTH
Nicklas
la source
distinct_crosspoints ,roads
par mon nom de table (roads_test
)? J'ai essayé cela, mais j'ai eu une erreur d'geom
être ambigu.Si la ligne A (id 1) croise la ligne B (id 2), c'est un point d'intersection dont nous avons besoin. Mais la ligne B coupe également la ligne A au même point. Mais nous n'avons pas besoin de ce point deux fois. Voilà pourquoi j'utilise
a.gid < b.gid
au lieu dea.gid != b.gid
la source