Dołącz do pliku CSV, aby shapefile przy użyciu gdal / ogr?


11

Mam shapefile z kilku atrybutów, na przykład YEAR, COUNTYi AREA. Mam również plik CSV z większą liczbą pól, które chcę w pliku kształtu, np POPULATION. Zarówno plik kształtu, jak i plik CSV mają pole GISJOIN. Wiem jak dołączyć do QGIS. Ale w jaki sposób mogę na stałe połączyć i napisać do pliku shapefile przy użyciu ogr2ogrlub jednego z innych narzędzi w GDAL / OGR?


Czy twoja kompilacja GDAL / OGR ma obsługę spatialite lub sqlite?
BradHards

@BradHards: To tak nie wygląda. Jest to pakiet GDAL / OGR z Ubuntu 14.04.
Lincoln Mullen

Odpowiedzi:


23

Narzędzie ogr2ogr obsługuje ograniczoną składnię SQL . Możesz dołączyć swój plik CSV do pliku kształtu, używając czegoś takiego:

ogr2ogr -sql "select inshape.*, joincsv.* from inshape left join 'joincsv.csv'.joincsv on inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp inshape.shp

8
Oh gdal / ogr - nigdy nie przestajesz mnie zadziwiać ..
radek

@luke To jest genialne, ale jak mogę to zrobić, jeśli mój plik kształtu i plik csv znajdują się w folderze na komputerze ... gdzie muszę podać ścieżkę do tego folderu?

@Luke Mam, ALE zdecydowanie nie zrobiłem tego dobrze, ogr2ogr -sql "wybierz C: \ Path \ inshape. *, C: \ Pathjoincsv. * Z C: \ Path \ inshape left dołącz 'C: \ Path \ joincsv .csv'.joincsv na C: \ Path \ inshape.GISJOIN = joincsv.GISJOIN "shape_join.shp inshape.shp

4
ogr2ogr -sql "wybierz inshape. *, joincsv. * z inshape left dołącz 'ścieżka / do / joincsv.csv'.joincsv na inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp ścieżka / do / inshape.shp
user2856

Pojawia się następujący błąd: „Ostrzeżenie 1: Wartość 1060008100 pola inshape.MA funkcji 86 nie została pomyślnie zapisana. Prawdopodobnie z powodu zbyt dużej liczby w stosunku do szerokości pola” Jakieś pomysły, jak to rozwiązać?
RutgerH

7

Przyjęta odpowiedź jest naprawdę przydatna, ale okazało się, że była wolna w przypadku dużej bazy danych. Uważam, że ogranicza to również twoje opcje przy łączeniu danych.

Moja metoda polega teraz na ściągnięciu wszystkiego do SQLite (używając kombinacji csvkit i ogr2ogr):

csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv
ogr2ogr -append -f "SQLite" myjoindb.db myjoinshp.shp

Następnie dołącz do wszystkiego i stwórz z niego plik kształtu:

ogr2ogr -f "ESRI Shapefile" -sql "SELECT csv.*, shp.* FROM myjoinshp shp INNER JOIN myjoincsv csv ON csv.joinfield = shp.joinfield" joined_output.shp myjoindb.db

Hej, Eric, pojawia się błąd, że plik myjoindb.db już istnieje. Czy ten db drugiej linii powinien mieć taką samą nazwę jak pierwszy?
GIS Danny,

Ach, dobra uwaga, w drugiej linii będziesz chciał dodać -appendtam, aby ogr2ogrzezwolić na otwarcie istniejącej bazy danych SQLite i dodanie do niej. Zredagowałem odpowiedź, aby to pokazać.
Eric Brelsford,

Dzięki! Działa świetnie. Jeszcze jedno pytanie, mam nadzieję, że szybkie. W pierwszym wierszu mam geoidę polową, która dziwnie przekształca się w pływaki ujemne. To identyfikator spisu, który chcę traktować jako ciąg znaków, próbowałem owijać ciąg znaków cudzysłowami i to nie działało. Czy istnieje polecenie takie jak: csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)czy coś?
GIS Danny,

Co dziwne jest dołączyć zachodzi poprawnie na geoidy ale wyjście ma geoidy z -2147184982 zamiast co się do niego.
GIS Danny,

Wygląda na geoidto, że jest konwertowany na liczbę, ale liczba jest tak duża, że ​​przelewa się i staje się ujemna. Sprawdź dokumentację pod kątem csvsql , możesz spróbować określić tabelę, w której wyraźnie mówisz, że geoidjest łańcuchem, w przeciwnym razie --no-inferencemoże pomóc.
Eric Brelsford,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.