У меня есть данные точек на улицах, я хотел бы превратить эти точки в простые цветные линии. Любые указатели, как эта проблема может быть названа или какие-либо алгоритмы, которые могут помочь мне решить эту проблему?
Я надеялся использовать PostGIS
функции для этого, но я открыт для предложений, это данные из .shp
файла.
Edit1: обновил изображение, чтобы продемонстрировать идеальное решение этой проблемы.
Рисование линии будет основано исключительно на расстоянии между этими точками, и я ничего не смогу использовать для их группировки. В идеале это были бы точки на максимально указанном расстоянии вдоль проектируемой линии? И под проекционной линией я имею в виду найти 1-ю точку, затем следующую, ближайшую к ней, затем спроецировать линию и проверить, есть ли какие-либо точки на этой линии на максимальном расстоянии от любой из тех, которые уже находятся на линии.
Ответы:
Вы можете использовать рекурсивный запрос для исследования ближайшего соседа каждой точки, начиная с каждого обнаруженного конца линий, которые вы хотите построить.
Предварительные условия : подготовьте слой postgis с вашими точками, а другой - с одним объектом с несколькими линиями, содержащим ваши дороги. Два слоя должны быть на одном CRS. Вот код для созданного тестового набора данных, пожалуйста, измените его при необходимости. (Проверено на postgres 9.2 и postgis 2.1)
Вот шаги :
Создайте для каждой точки список всех соседей и их расстояния, которые соответствуют трем критериям.
Расстояние не должно превышать определяемое пользователем отношение расстояния от ближайшего соседа (это должно лучше соответствовать нерегулярной оцифровке, чем фиксированное расстояние)Эта часть была на самом деле слишком трудна для реализации, привязана к фиксированному радиусу поискаДавайте назовем эту таблицу "граф"
Выберите точку конца линии, присоединившись к графику и сохранив только ту точку, которая имеет ровно одну запись на графике.
Давайте назовем эту таблицу "eol" (конец строки)
легко? что награда за создание отличного графика, но на следующем шаге сумасшедшие вещи сойдут с ума
Настройте рекурсивный запрос, который будет циклически переходить от соседей к соседям, начиная с каждого eol
Давайте назовем эту таблицу "recurse_eol"
Оставьте только самую длинную линию для каждой начальной точки и удалите каждый точный повторяющийся путь. Пример: пути 1,2,3,5 И 5,3,2,1 - это одна и та же линия, обнаруженная с помощью двух разных «концов линии»
Вручную проверяет оставшиеся ошибки (изолированные точки, перекрывающиеся линии, странные улицы)
Обновленный, как и было обещано, я до сих пор не могу понять, почему иногда рекурсивный запрос не дает точно такой же результат при запуске с противоположного eol той же строки, поэтому некоторый дубликат может остаться в результирующем слое на данный момент.
Не стесняйтесь спрашивать, я полностью понимаю, что этот код нуждается в большем количестве комментариев. Вот полный запрос:
источник
Как указывает @FelixIP, первый шаг - найти точки, которые будут составлять каждую линию. Вы можете сделать это, вызвав ST_ClusterWithin с вашим максимальным разделительным расстоянием:
Затем вам нужно будет использовать некоторую эвристику, чтобы построить линию через все точки в каждом кластере. Например, если вы можете предположить, что нужные линии являются Y-монотонными, вы можете отсортировать точки в каждом кластере и передать их в ST_MakeLine . Объединяя все это, выглядело бы так:
источник