Łączenie warstw z odpowiednimi elementami za pomocą Topologii PostGIS

24

Obecnie używam rozszerzenia topologii PostGIS, ale mam pewne trudności ze zrozumieniem, jak działa struktura:

Jednym z kluczowych punktów jest użycie „warstw”: jak rozumiem, atrybuty cech powinny być przechowywane w tabeli poza schematem topologii (o nazwie topo_actualname) i zarejestrowane jako warstwa tej topologii AddTopoGeometryColumn.

Jednakże, istnieje prosty sposób, aby dołączyć atrybuty (przechowywane w tabeli Layer) z odpowiednich funkcji (w elementach node, facelub edge_data)?

Teraz robię to:

SELECT whatever
FROM layer_tb l
     JOIN topo_topologyname.edge_data e ON (l.topo).id=edge_id;

Ale layerwydaje mi się, że cała koncepcja jest raczej bezużyteczna, jeśli muszę znać zarówno nazwę schematu topologii, jak i nazwę warstwy, aby uzyskać potrzebne informacje.

W rzeczywistości wydaje mi się, że rozumiem, że topokolumna na warstwie ma wystarczającą ilość informacji, aby wiedzieć, gdzie jest odpowiednia topologia, a ponadto topologyschemat przechowuje odniesienie do każdej tabeli warstw dla każdej topologii.

Czy istnieje krótki / prosty / właściwy sposób łączenia informacji? Szukałem czegoś w funkcjach rozszerzenia topologii , ale nie znalazłem nic przydatnego.

Davide
źródło
3
Jestem trochę zagubiony w tym, jak powinieneś wykorzystać topologie, ale to może pomóc. Można rzucić TopoGeometrybezpośrednio do geometrii: SELECT whatever, ST_AsText(topogeom::geometry) FROM layer_tb. Chodzi o to, że jeśli krawędzie zostaną później podzielone, wydaje się, że geometria może się w rezultacie zmienić.
jpmc26,
1
To, czego chcesz, to narzędzia lub operacje na danych, takie jak przecinanie, łączenie lub scalanie. QGIS działa z post GIS i jest bezpłatny i ma takie narzędzia. Operacje znajdują się w warstwie i są łączone podczas scalania warstw w oparciu o te typy operacji.
lewis

Odpowiedzi:

1

Odwzorowanie atrybutów na topologię nie jest bezpośrednie . Związek jest coś takiego dla węzła:

your_topogeom -> (topogeom_id) relation table (element_id)-> (node_id) node

Zatem twoja instrukcja select będzie wyglądać mniej więcej tak:

SELECT whatever
FROM layer_tb l
INNER JOIN relation AS r ON (((l.mytopogeom).id , (l.mytopogeom).layer_id)) = (r.topogeo_id, r.layer_id  )
INNER JOIN edge_data AS e ON (r.element_id = e.edge_id)
MappaGnosis
źródło