2016-04-26 9 views
0

Ich habe eine Tabelle mit dem Straßennetz von Chicago, und ich habe auch eine Tabelle der Verbrechen in Chicago begangen. Ich versuche, K-Means-Cluster für die Verbrechen zu schaffen, indem ich sie dem Clusterzentrum zuweise, das die kürzeste Straßenentfernung entfernt ist.Postgis ST_Split keine Straßen durch alle Punkte teilen

Erstens interpolierte ich alle Verbrechen auf die nächste Straße. So weit, ist es gut. Nun, was ich versuche zu tun ist, jede Straße durch alle Verbrechenspunkte, die darauf fallen, zu teilen, so dass ich dann eine Netzwerktopologie mit pgrouting und Route von einem Verbrechen Ort zum anderen erstellen kann.

Problem ist, die ST_Split-Funktion scheint nicht die meisten Straßen zu teilen und ich habe keine Ahnung warum. Wenn ich eine Million Verbrechenspunkte habe, sollten die Straßen in eine große Anzahl von Segmenten aufgeteilt werden, aber ich bekomme nur ungefähr tausend Reihen mehr als in der ursprünglichen Straßennetzwerk-Tabelle. Dies ist der Befehl, den ich bin mit:

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; 

Ich verwende Postgis Version 2.2.2 so die Tatsache, dass ich Spaltung von Multipoints ist kein Problem ..

Jede mögliche Hilfe würde geschätzt !

+0

Vielleicht verwenden Sie ST_Snap, um die Punktwurzeln auf den Straßen einzufangen, damit sie sich sauber teilen. –

+0

Sie haben recht, es scheint so zu funktionieren. Ich nahm an, dass die Interpolation der Verbrechen mit ST_Closest_Point genug wäre. Vielen Dank! – Ponsietta

Antwort

0

Wie bereits erwähnt, erfordern einige Funktionen wie alle Overlay-Operatoren und ST_Split exaktes Noding, um wie erwartet zu funktionieren. Dies bedeutet, dass störende Gleitkommadifferenzen von Geometrieüberlagerungen sehr nahe beieinander liegende Punkte aus verschiedenen Geometrien aufweisen (in der Größenordnung von < 1e-12), aber nicht exakt.

Verwenden Sie ST_Snap, um genaues Noding einer Geometrie auf einer anderen zu erhalten, wodurch Funktionen wie ST_Split wie erwartet funktionieren.

+0

Vielen Dank für die Antwort :) – Ponsietta