J'ai une donnée de points le long des rues, je voudrais transformer ces points en simples lignes colorées. Y a-t-il des pointeurs sur le nom de ce problème ou des algorithmes qui peuvent m'aider à résoudre ce problème?
J'espérais utiliser des PostGIS
fonctions pour ce faire, mais je suis ouvert aux suggestions, il s'agit de données d'un .shp
fichier.
Edit1: Mise à jour de l'image pour démontrer la solution idéale de ce problème.
Tracer la ligne serait uniquement basé sur la distance entre ces points, il n'y a rien d'autre que je puisse utiliser pour les regrouper. Idéalement, ce serait des points à une distance maximale spécifiée le long de la ligne projetée? Et par ligne projetée, je veux dire trouver le premier point puis le plus proche, puis projeter une ligne et vérifier s'il y a des points sur cette ligne à une distance maximale de ceux qui sont déjà sur la ligne.
Réponses:
La
Vous pouvez utiliser une requête récursive pour explorer le voisin le plus proche de chaque point à partir de chaque fin de ligne détectée que vous souhaitez créer.
Prérequis : préparez un calque postgis avec vos points et un autre avec un seul objet Multi-linestring contenant vos routes. Les deux couches doivent être sur le même CRS. Voici le code de l'ensemble de données de test que j'ai créé, veuillez le modifier si nécessaire. (Testé sur postgres 9.2 et postgis 2.1)
Voici les étapes :
Générer pour chaque point la liste de tous les voisins et leur distance qui répondent à ces trois critères.
La distance ne doit pas dépasser un rapport défini par l'utilisateur de la distance du plus proche voisin (cela devrait mieux s'adapter à la numérisation irrégulière que la distance fixe)Cette partie était en fait trop difficile à mettre en œuvre, collée à un rayon de recherche fixeAppelons ce tableau "le graphique"
Sélectionnez le point de fin de ligne en vous joignant au graphique et en ne gardant que le point qui a exactement une entrée dans le graphique.
Appelons ce tableau "eol" (fin de ligne)
facile? que la récompense pour avoir fait un grand graphique mais les choses qui tiennent le coup deviendront folles à la prochaine étape
Configurer une requête récursive qui passera des voisins aux voisins à partir de chaque eol
Appelons cette table "recurse_eol"
Conserver uniquement la ligne la plus longue pour chaque point de départ et supprimer tous les chemins exacts en double Exemple: les chemins 1, 2, 3, 5 et 5, 3, 2, 1 sont la même ligne découverte par ses deux "fins de ligne" différentes
Vérifie manuellement les erreurs restantes (points isolés, lignes qui se chevauchent, rue de forme étrange)
Mis à jour comme promis, je n'arrive toujours pas à comprendre pourquoi parfois une requête récursive ne donne pas exactement le même résultat en commençant à partir de l'éol opposé d'une même ligne, donc certains doublons peuvent rester dans la couche résultat à partir de maintenant.
N'hésitez pas à demander, je comprends totalement que ce code ait besoin de plus de commentaires. Voici la requête complète:
la source
Comme le souligne @FelixIP, la première étape consiste à trouver les points qui composeront chaque ligne. Vous pouvez le faire en appelant ST_ClusterWithin avec votre distance de séparation maximale:
Ensuite, vous devrez utiliser une heuristique pour construire une ligne à travers tous les points de chaque cluster. Par exemple, si vous pouvez supposer que les lignes souhaitées sont monotones Y, vous pouvez trier les points dans chaque cluster et les alimenter dans ST_MakeLine . Combiner tout cela ressemblerait à ceci:
la source