Jeśli masz możliwość sterownika PostGIS w pakiecie rgdal, to jest tylko kwestia utworzenia ciągu połączenia i korzystania z niego. Tutaj łączę się z moją lokalną bazą danych gis
przy użyciu domyślnych poświadczeń, więc moje DSN jest raczej proste. Konieczne może być dodanie hosta, nazwy użytkownika lub hasła. Zobacz dokumentację gdal, aby uzyskać informacje.
> require(rgdal)
> dsn="PG:dbname='gis'"
Jakie tabele są w tej bazie danych?
> ogrListLayers(dsn)
[1] "ccsm_polygons" "nongp" "WrldTZA"
[4] "nongpritalin" "ritalinmerge" "metforminmergev"
Uzyskać jeden:
> polys = readOGR(dsn="PG:dbname='gis'","ccsm_polygons")
OGR data source with driver: PostgreSQL
Source: "PG:dbname='gis'", layer: "ccsm_polygons"
with 32768 features and 4 fields
Feature type: wkbMultiPolygon with 2 dimensions
Co mam
> summary(polys)
Object of class SpatialPolygonsDataFrame
Coordinates:
min max
x -179.2969 180.7031
y -90.0000 90.0000
Is projected: NA
proj4string : [NA]
Data attributes:
area perimeter ccsm_polys ccsm_pol_1
Min. :1.000 Min. :5.000 Min. : 2 Min. : 1
1st Qu.:1.000 1st Qu.:5.000 1st Qu.: 8194 1st Qu.: 8193
Median :1.000 Median :5.000 Median :16386 Median :16384
Mean :1.016 Mean :5.016 Mean :16386 Mean :16384
3rd Qu.:1.000 3rd Qu.:5.000 3rd Qu.:24577 3rd Qu.:24576
Max. :2.000 Max. :6.000 Max. :32769 Max. :32768
W przeciwnym razie możesz użyć funkcji bazy danych R i bezpośrednio przeszukać tabele.
> require(RPostgreSQL)
Loading required package: RPostgreSQL
Loading required package: DBI
> m <- dbDriver("PostgreSQL")
> con <- dbConnect(m, dbname="gis")
> q="SELECT ST_AsText(the_geom) AS geom from ccsm_polygons LIMIT 10;"
> rs = dbSendQuery(con,q)
> df = fetch(rs,n=-1)
Zwraca geometrię elementu, w df$geom
której będziesz musiał przekonwertować na sp
obiekty klasy (SpatialPolygons, SpatialPoints, SpatialLines), aby cokolwiek zrobić. Pomaga w tym funkcja readWKT w rgeos.
Rzeczy, na które należy uważać, to zwykle takie rzeczy, jak kolumny bazy danych, których nie można zmapować na typy danych R. Do zapytania możesz dołączyć SQL, aby wykonywać konwersje, filtrowanie lub ograniczanie. To powinno wystartować.
rgadl
? Jestem w Ubuntu 13.04 ...readOGR
użycie metody sql zamiast pełnej tabeli?where
klauzuli i przekazanie jej do OGR wydaje się proste,setAttributeFilter
ale wszystko to musi zostać wykonane w kodzie C i C ++ ...Jeśli masz dane w Postgis, nie eksportuj ich do pliku kształtu. Z mojego punktu widzenia jest to pewien krok wstecz.
Możesz wysłać zapytanie do bazy danych Postgis z poziomu R, używając instrukcji SQL, importując je jako ramki danych i, ponieważ znasz R, wykonaj wszystkie potrzebne dane geostatystyczne. Wierzę, że możesz również wyeksportować swój wynik geostatystyczny z powrotem do postgis.
Korzystając z SQL z funkcjami Postgis, możesz także wykonywać wszelkiego rodzaju analizy przestrzenne, takie jak operacje nakładania, odległości itp.
Do tworzenia map użyłbym QGIS , oprogramowania OpenSource GIS, które może bezpośrednio czytać postgis (o ile wiem, że był to początkowy cel projektu), a nadchodząca wersja 2.0 zawiera wiele funkcji do tworzenia świetnie wyglądających map .
źródło
Nowo wprowadzony pakiet sf (następca sp) zapewnia funkcje
st_read()
ist_read_db()
. Po tym samouczku i z mojego doświadczenia jest szybszy niż wspomniane już sposoby. Ponieważ pewnego dnia sf prawdopodobnie zastąpi sp, warto teraz zajrzeć;)możesz również uzyskać dostęp do bazy danych za pomocą RPostgreSQL:
Dzięki
st_write()
niemu możesz przesyłać dane.źródło
Możesz korzystać ze wszystkich narzędzi jednocześnie dla każdego kroku swojego rozwiązania.
Możemy udzielić bardziej szczegółowej odpowiedzi, jeśli podasz nam więcej szczegółów na temat swojego problemu
źródło
Wybrałbym także kombinację rgdal i RPostgreSQL. Zatem taki sam kod jak @Guillaume, z wyjątkiem tryCatch, który obsługuje więcej wierszy, pseudolosowej nazwy tabeli i użycia niezalogowanej tabeli dla lepszej wydajności. (Uwaga dla siebie: nie możemy użyć tabeli TEMP, ponieważ nie jest widoczna z readOGR)
Stosowanie:
Ale wciąż jest to boleśnie powolne:
W przypadku małego zestawu wielokątów (6 obiektów, 22 pola):
część postgis:
część readOGR:
źródło
Dostępny jest teraz pakiet RPostGIS , który może importować geom PostGIS do R za pomocą zapytań SQL.
źródło
Możesz także łączyć rgdal i RPostreSQL. Ta przykładowa funkcja tworzy tymczasową tabelę z RPostgreSQL i wysyła ją do readOGR w celu uzyskania wyniku obiektu przestrzennego. Jest to naprawdę nieefektywne i brzydkie, ale działa całkiem dobrze. Pamiętaj, że zapytanie musi być zapytaniem SELECT, a użytkownik musi mieć dostęp do zapisu do bazy danych.
Możesz to nazwać:
źródło
Jeśli zwrócisz zapytanie z „ST_AsText (geom) jako geomwkt” i pobierzesz wynik do danych, możesz użyć:
Wciąż boleśnie powolne .... 1 sekunda na 100 geomów na teście.
źródło
Geotuple - https://github.com/rhansson/geotuple to aplikacja internetowa, która łączy R-Server i PostGIS (za pomocą RPostgreSQL)
źródło