Chcę utworzyć sieć drogową do użytku z pgRouting przy użyciu danych OpenStreetMap. Załadowałem plik kształtu z GeoFabrik do tabeli Postgres (z włączonym PostGIS). Jednak jednym z moich problemów było to, że drogi nie zawsze kończą się na skrzyżowaniach, dlatego postanowiłem je wszystkie podzielić na każdym skrzyżowaniu lub skrzyżowaniu.
Aby zidentyfikować wszystkie skrzyżowania, w których drogi przecinały się lub przecinały, użyłem następującego SQL
(podobnego do poprzedniego pytania):
CREATE TABLE split_points as
SELECT DISTINCT
ST_GeometryN(ST_Intersection(a.geom, b.geom),1) as geom
FROM
roads as a,
roads as b
WHERE
ST_Touches(a.geom, b.geom)
OR
ST_Crosses(a.geom, b.geom)
AND a.gid != b.gid
GROUP BY
ST_Intersection(a.geom, b.geom);
Chcę teraz podzielić drogi za pomocą tych punktów. Zastosowałem następujące podejście:
CREATE TABLE split_roads as
SELECT
ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))).geom) As geom,
generate_series(1,ST_NumGeometries((ST_Split(g.geom, blade.geom)))) as gid
FROM
split_points as blade,
roads as g
WHERE
ST_Intersects(g.geom, blade.geom);
Problem z tym podejściem dzielonym polega na tym, że oprócz wszystkich podzielonych elementów pozostaje pełna długość drogi. Aby usunąć te nierozdzielone geometrie drogi, które zostały uwzględnione, użyłem ST_Equals()
funkcji do ich zidentyfikowania i usunięcia:
DELETE FROM split_roads USING roads
WHERE ST_Equals(split_roads.geom, roads.geom)
Jednak to podejście nie usuwa wszystkich oryginalnych nieoświetlonych geometrii (chociaż usuwa niektóre z nich). Czy istnieje lepsze podejście do usuwania (lub ogólnie), aby mieć tylko podzielone geometrie w tabeli?
.geom
mówisz? Nie mogę tego zauważyć!ERROR: function st_geomfromewkb(geometry_dump) does not exist LINE 4: ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))))... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Odpowiedzi:
Nie jest to prawdziwe rozwiązanie twojego problemu, ale spróbuj osm2po ... tworzy idealny kod SQL do routingu w pgrouting: http://osm2po.de/
źródło
osm2pgrouting
ale wymaga więcej pamięci niż mój serwer i kończy się bez ukończenia.osm2po
to literówka. Czy instalacja Ubuntu jest prosta?Prosta odpowiedź: nie. Nie powinieneś tego robić w ten sposób.
Z plików kształtów dróg OSM nie można rozróżnić skrzyżowań i przejazdów / przejazdów podziemnych. Utworzysz skrzyżowania, które w rzeczywistości nie istnieją, jeśli podzielisz wszystkie pozornie przecinające się drogi.
Musisz zabrudzić sobie ręce oryginalnym plikiem OSM, jeśli nie chcesz używać istniejących narzędzi, takich jak osm2pgrouting (gdzie sieć jest wystarczająco mała) lub osm2po.
źródło
O twoim ogólnym problemie z użyciem pgRouting: Myślę, że @Uffer, @GisStudent i inni, którzy pokazują, jak używać „OSC i tym podobnych”, mają rację. Postępuj zgodnie ze wskazówkami „najlepszych praktyk” i „standardów” ...
O twoim pytaniu: „podziel drogi na poszczególne segmenty na skrzyżowaniach” lub „jak usunąć wszystkie oryginalne nieoświetlone geometrie”. Mogę pomóc, jeśli pokażesz tutaj swoje wyniki, krok po kroku ...
Pierwszy krok: analiza topologii
źródło
Kolejne „nierealne rozwiązanie twojego problemu”, ale nasz konwerter OSM dzieli się na skrzyżowaniach podczas konwersji OSM na SHP. Jest w ten sposób bardziej wydajny, ponieważ może porównywać identyfikatory węzłów, zamiast wykonywać obliczenia geometryczne.
źródło
Jednym ze sposobów rozwiązania tego algorytmu byłoby dodanie punktu początkowego i końcowego każdej całej drogi do zestawu „skrzyżowań”, aby mieć pewność, że każdy odcinek znajduje się między dwoma skrzyżowaniami.
źródło