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?

Lincoln Mullen
źródło
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
użytkownik2856
źródło
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
Eric Brelsford
źródło
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,