piątek, 22 kwietnia 2011

ArcGIS/ArcSDE + PostgreSQL/PostGIS

Od kilku dni walczę z postawieniem serwera ArcSDE na bazie PostgreSQL. Serwer który dostałem miał domyślnie zainstalowany. Najpierw zainstalowałem najnowszy PostgreSQL 9 który obsługuje procesory 64 bitowe ale...

PostGIS dla Windows+PostgreSQL 9. Esri obsługuje tylko PostgreSQL 8.3.8, 8.4.1. Poniważ 8.3.8 obsługuje domyślne kodowanie Win1250, a mi ze wzlędu na CSW od deegree.org zależy na UTF zmuszony zostałem do zainstalowania wersji 8.4.1. Nie znajdziesz jej łatwo, ale gdy poszukasz to komplet znajdziesz pod adresami:
PostgreSQl 8.4.1
PostGIS 1.4.0

W ten sposób mamy komplet, który jest oficjalnie wspierany przez Esri. Jestem prawie pewien, że postawiłbym ten serwer na nowszym np. PostgreSQL 8.4.7, ale gdy pytasz o cokolwiek w esri to pytają o wersję bazy i niech tylko jeden numerek się różni to już wysyłają Cię na drzewo.


PostgreSQL 8.4.1 nie połączysz z ArcSDE za pomocą standardowego kreatora. Musisz użyć sporo komend w linii poleceń. Wszystko jest czytelnie opisane na stronach esri

Creating a geodatabase in PostgreSQL 8.4.1 on Windows

Postępowałem zgodnie z poleceniami, z tą różnicą, że poleceń SQL nie chciało mi się ręcznie klepać więc bazę i użytkowników utworzyłem za pomocą PgAdmin. Druga różnica to taka, że mi zależało, żeby baza była utworzona na szablonie PostGIS, żeby potem można było ewentualnie używać jej przez inne edytory typu Quantum GIS i żeby sam ArcGIS umiał czytać warstwy utworzone przez inne edytory (zmienna GEOMETRY_STORAGE = "PG_GEOMETRY"). Dlatego:

Tworzenie bazy w PgAdmin

Utworzyłem użytkownika 'sde' i 'umgdy' oraz table space 'sde'
Utowrzyłem nową bazę na szablonie 'template_postgis', z właścicielem 'sde' i tablespace 'sde'
Utworzyłem schematy 'sde' i 'umgdy' dla edytorów odpowiednio z właścicielami 'sde' i 'umgdy' (ArcSDE na PostgreSQL wymaga aby dla każdej nazwy użytkownika był utworzony schemat o takiej samej nazwie).
Nadałem odpowiednie uprawnienia do schematów i do tabel systemowych PostGIS (w oknie poleceń SQL):



grant all privileges on schema public to sde;
grant all privileges on schema public to umgdy;
GRANT USAGE ON SCHEMA sde TO public;
grant all privileges on table public.geometry_columns to sde;
grant all privileges on table public.geometry_columns to umgdy;
grant all privileges on table public.spatial_ref_sys to sde;
grant all privileges on table public.spatial_ref_sys to umgdy;

Na koniec należy utworzyć bazy systemowe ArcSDE używając wiersza poleceń:

sdesetup -o install -d POSTGRESQL -D arcgis -u sde -p <haslo> -s<server_name>

gdy serwer jest na lokalnej maszynie można ominąć parametr -s<server_name>

Konfiguracja usług sieciowych

Należy otworzyć notatnik jako adminstrator i dodać do plików

C:\Program Files (x86)\ArcGIS\ArcSDE\pgexe\etc\services.sde
C:\Windows\System32\drivers\etc\services

linijkę:

esri_sde_pg_arcgis 5151/tcp #ArcSDE for PostgreSQL with 'arcgis' database


Autoryzacja licencji

Żeby odpalić kreatora ArcSDE trzeba skopiować pliki z folderu

c:\Program Files (x86)\ArcGIS\ArcSDE\pgexe\pg841_st_lib

do folderów

C:\Program Files (x86)\PostgreSQL\8.4\lib - tu wiadomo
c:\bin - taka niedoróbka programistów z esri, szuka w domyślym folderze nie wiedzieć czemu

Start > All Programs > ArcGIS > ArcSDE > ArcSDE for PostgreSQL Post Installation

uruchamiając kreatora jako administrator i wybierając opcję 'Custom'. Dalej należy wybrać tylko Authorize ArcSDE, wpisać dane, dalej, dalej, dalej...


Instalacja usług sieciowych


Najłatwiej utworzyć plik BAT i wpisać:

sdeservice -o create -d postgresql,postgresql-8.4 -p <hasło> -i esri_sde_pg_arcgis

sdeservice -o register -r ADMIN_DATABASE -v arcgis -d postgresql -p <hasło> -i esri_sde_pg_arcgis

sdemon -o start -i esri_sde_pg_arcgis -p <hasło>

pause


---

esri_sde_pg_arcgis - to nazwa usługi
arcgis - to nazwa bazy danych



Sprawdzenie funkcjonowania ArcSDE

Najpierw na serwerze w linii komend trzeba wpisać:

sdeservice -o list

odpowiedź może wyglądać tak:

SDE service Information
--------------------------------------------------------------------
RDBMS: PostgreSQL
Name: ArcSde Service(esri_sde_pg_arcgis)
SDEHOME: C:\Program Files (x86)\ArcGIS\ArcSDE\pgexe\
Datasource: UMGIS
Admin_database: arcgis
Version: 10.0
Status: SERVICE_RUNNING


Ustawienie natywnego zapisu geometrii



ArcSDE domyślnie używa geometrii ST_GEOMETRY, którą rozumie tylko Esri, inne produkty zazwyczaj nie potrafią jej odczytać i traktują takie warstwy jak zwykłe tabele. Dlatego postanowiłem zmienić domyślny typ geometrii na PostGIS. W tym celu zmieniłem zmienną:

DEFAULTS .GEOMETRY_STORAGE = "PG_GEOMETRY"

za pomocą wiersza poleceń:


sdedbtune -o alter -i <service_name> -k DEFAULTS -P GEOMETRY_STORAGE -v "PG_GEOMETRY" -s <server_name> -D postgis -u sde -p <ArcSDE_admin_password>


Przy czym ja na swojej lokalnej maszynie ominąłem -s <server_name>.

Za pomocą polecenia

sdedbtune -o list -D <db_name> -u <user_name:sde> -p haslo012 -i <service_name>

sprawdziłem, że zmienna faktycznie została zmieniona więc przystąpiłem do testowego rysowania. Oczywiście nie ma co liczyć na to, że zadziałało...

Przy tworzeniu nowej warstwy wyświetlał się błądinvalid SRID CONTEXT: SQL statement "SELECT AddGeometryColumn('','', $1 , $2 , $3 ,$4 , $5 )"

Działo się tak dla Feature Dataset dla których był ustawiony układ współrzędnych 1992. Jednak gdy dodawałem Feature Class bezpośrednio w bazie przy ustawionym Unknown Coordinate System warstwa się dodawała. Sprawdziłem w Quantum GIS 1.6 - była widoczna jako "bez geometrii". Postanowiłem sprawdzić z drugiej strony - dodałem warstwę w QGis i sprawdziłem czy widać ją w ArcCatalog'u - widać ale też bez geometrii. Skoro mimo wszystko nie udało mi się połączyć do wspólnej pracy tych dwóch narzędzi to stwiedziłem, że wróce do standardowego dla Esri ustawienia GEOMETRY_STORAGE = "ST_GEOMETRY".


Literatura:
ArcGIS and the PostGIS geometry type
Feature classes in a geodatabase in PostgreSQL
Use ArcSDE with SQL Server 2008 R2 Express to enable a 10 GB storage limit
Adding users to an ArcSDE geodatabase