Zastanawiam się, jak można przechowywać ogromne zbiory danych chmury punktów skanowanych laserowo w PostGIS, mając na uwadze aspekt czasowy ich przetwarzania. Wiem, Point
w PostGIS istnieje obiekt geometrii . Ale o ile wiem, zapisuje każdy punkt w nowym tupelu, co może sprawić, że wyszukiwanie dowolnego punktu będzie bardzo powolnym procesem, jeśli zgromadzonych zostanie kilka milionów lub więcej z nich.
Znalazłem artykuł HSR Universtiy of Applied Sciences Rapperswill, omawiający ten temat. Sugeruje to trzy sposoby przechowywania takich danych: Whole data in one tupel
, Each point in one tupel
lub Splitting Data into Blocks
które odwołują info-stoły, trzymając wystaje z każdego bloku. Ponieważ trzeci sposób wydaje się najbardziej przydatny do lokalizowania przechowywanych punktów, zastanawiam się, czy ktoś już zrobił z nim jakieś doświadczenia?
Artykuł można znaleźć tutaj: http://wiki.hsr.ch/Datenbanken/files/pgsql_point_cloud.pdf
Wreszcie natknąłem się na projekt na github, który wydaje się zajmować sposobami chmury punktów w PostgeSQL. Niestety niewiele informacji na ten temat w sieci. Więc to samo pytanie tutaj: czy ktoś już ma z tym jakieś doświadczenia? Czy nadaje się do takich celów?
Projekt można znaleźć tutaj: https://github.com/pramsey/pointcloud
Z przyjemnością usłyszę o innych sugestiach, pomysłach lub doświadczeniach, jeśli takie istnieją. Ale muszę przyznać, że preferowane są rozwiązania niekomercyjne.
źródło
Odpowiedzi:
W twoim pytaniu jest dużo. Krótka odpowiedź brzmi: tak, w PostGIS można całkowicie przechowywać dane z ogromnej chmury punktów i wykorzystywać je do przetwarzania. Stworzyliśmy tak pełny system, który to robi.
Ten film jest trochę nieaktualny ze względu na swoje liczby, ale mieliśmy TB danych mobilnych / naziemnych i lotniczych w postgis dostępnych za pośrednictwem pytona do przetwarzania w zapleczu oraz z interfejsem internetowym umożliwiającym przeglądanie i pobieranie danych 3D. https://vimeo.com/39053196
To naprawdę sprowadza się do tego, jak zdecydujesz się przechowywać dane w PostGIS i jak będziesz mieć do nich dostęp. Dobrym rozwiązaniem dla danych lotniczych może być połączenie danych w jakiś sposób i wykorzystanie wydajności dla wielu punktów. Jednak jeśli pracujesz z danymi mobilnymi lub naziemnymi, gdzie gęstość punktów może wynosić między 500-30000 + punktów na metr kwadratowy, to podejście nie działa. Następnie sprowadza się do spojrzenia na sprzęt i oczekiwaną liczbę równoczesnych użytkowników. Szczegóły na ten temat można znaleźć w niektórych naszych artykułach http://www.mendeley.com/profiles/conor-mc-elhinney/
źródło
(Odpowiedź jest oparta na powyższych komentarzach moich i innych; naprawdę tego nie testowałem)
Przechowuj punkty jako MultiPointZM. Najlepszy rozmiar siatki prawdopodobnie będzie zależał od wzorców dostępu i trzeba na tym trochę przetestować. Zwykła siatka z indeksem przestrzennym powinna sprawić, że zapytania będą dość szybkie. Jeśli dostęp do 3D jest ważny, MultiPointZM może być oparty na blokach 3D (1) zamiast siatki płaszczyzny 2D, a następnie (jeśli masz PostGIS> = 2.0), możesz użyć &&& do szybkich zapytań 3D.
Można również przechowywać wzór siatki w osobnej tabeli, co może być przydatne np. Podczas aktualizacji danych i sprawdzania, czy bloki MultiPointZM pozostają w swoich granicach po edycji itp.
Przechowywanie znaczników czasu lub innych danych byłoby możliwe tylko dla bloku na raz, ale niektóre dane binarne / kategorie mogłyby być przechowywane przez dezagregację każdego bloku według atrybutu, jeśli nie ma zbyt wielu kategorii i / lub atrybutów.
Jeśli w końcu będziesz musiał przechowywać dane jako osobny PointZM, to klucz obcy w tabeli siatki + indeks B-drzewa sprawi, że ładowanie tylko określonych punktów (prawdopodobnie) będzie znacznie szybsze niż tylko bezpośrednie przejście do tabeli, nawet w przestrzeni indeks.
(1) Jeśli zakres wartości Z jest niewielki (w końcu to droga), prawdopodobnie nie ma to sensu.
źródło