2016-04-26 2 views
0

У меня есть таблица, содержащая уличную сеть Чикаго, и у меня также есть таблица преступлений, совершенных в Чикаго. Я пытаюсь создать кластеры k-средств для совершения преступлений, назначив их центру кластера, который является самым коротким расстоянием.Postgis ST_Split не раскалывает дороги по всем пунктам

Во-первых, я применил все преступления на ближайшей дороге. Все идет нормально. Теперь то, что я пытаюсь сделать, - это разделить каждую дорогу на все точки преступления, которые попадают на нее, чтобы затем создать сетевую топологию, используя pgrouting и маршрут из одного места преступления в другое.

Проблема в том, что функция ST_Split не разбивает большинство дорог, и я понятия не имею, почему. Учитывая, что у меня есть миллион преступных пунктов, дороги должны быть разделены на большое количество сегментов, но я получаю около тысячи строк больше, чем в исходной таблице уличной сети. Это команда, я использую:

CREATE TABLE algorithms.crime_network AS 
    SELECT road.id AS road_id, (ST_Dump(ST_Split(road.geom, road.crime_points))).geom 
    FROM (SELECT r.geom as geom, r.gid id, ST_Multi(ST_Collect(c.geom)) AS crime_points FROM public.transportation r INNER JOIN chicago_data.interpolated_crimes c ON c.road_id = r.gid GROUP BY r.gid) AS road; 

Я использую PostGIS версии 2.2.2 поэтому тот факт, что я Расщепление за счет многочисленных это не проблема ..

Любая помощь будет оценена !

+0

Возможно использование ST_Snap для привязки точек vertecies на дорогах, так что они чисто расщепляются. –

+0

Вы правы, похоже, что так работает. Я предположил, что интерполировать преступления было бы достаточно, используя ST_Closest_Point. Спасибо! – Ponsietta

ответ

0

Как отмечалось, некоторые функции, такие как все операторы наложения и ST_Split, требуют точного кодирования для выполнения, как ожидалось. Это означает, что раздражающие различия в плавающей запятой геометрических наложений будут иметь вершины из разных геометрий очень близко друг к другу (порядка < 1e-12), но не точно.

Используйте ST_Snap, чтобы получить точное определение одной геометрии на другом, что поможет функциям типа ST_Split работать как ожидалось.

+0

Большое спасибо за ответ :) – Ponsietta

Смежные вопросы