Ich möchte zunächst einmal eine Verbindung zu einem ESRI Shapefile mit der FDO API erstellen. Die Verbindung zu einer ESRI ArcSDE mit der FDO werde ich später aufzeigen.
Die Dokumentation von FDO gibt unter der Rubrik „Getting Started“ folgende Hinweise:
Write the Code to Connect to a Provider
Do the following:
- Get the list of installed providers
- Create a connection manager
- Create a connection
- Get the connection state
- Get the connection properties
- Get values for the connection properties
- Set the connection properties
- Open a connection
- Open a pending connection
Diese Auflistung werde ich etwas verkürzen. Die Stufen 5-6 kann man nämlich auch mit Hilfe der Dokumentation lösen. Interessant ist jedoch, dass man auch per Code die jeweiligen Verbindungseinstellungen und Möglichkeiten abrufen könnte.
Meine Agenda sieht folgendes vor:
- Get the list of installed providers
- Create a connection manager
- Create a connection
- Set the connection properties
- Open a connection
- Get the connection state
- Fetch Data
Und das wollen wir nun mit ein paar Code-Schnippsel füllen.
1. Get the list of installed providers
Mit den folgenden Zeilen kann man sich alle registrierten Provider anzeigen lassen.
//FDO Provider Registry IProviderRegistry FDORegistry = (IProviderRegistry)FeatureAccessManager.GetProviderRegistry(); ProviderCollection providers = FDORegistry.GetProviders(); string s = "Registered FDO Providers: n"; foreach (Provider p in providers) { s += "# " + p.DisplayName + "n"; } MessageBox.Show(s, "Registered FDO providers", MessageBoxButtons.OK, MessageBoxIcon.Information);
Hat alles geklappt, sollte man folgende MessageBox sehen:
Achtung: Dabei werden die Provider ausgegeben, wie sie in der Datei providers.xml
aufgelistet sind. Das bedeutet jedoch nicht, dass alle Provider und die Assemblies dafür auch wirklich vorhanden sind. Die Provider-Registry liest also nur das XML aus, ohne zu prüfen, ob die referenzierten DLLs auch existieren.
2. Create a connection manager / 3. Create a connection / 4. Set the connection properties / 5. Open a connection
Wir brauchen also erst einmal einen ConnectionManager
. Mit diesem erzeugen wir eine Verbindung mit der Angabe des entsprechenden Datenproviders als string
, z.B. "OSGeo.SHP.3.6"
.
//FDO Connection - ShapeFile example IConnectionManager connManager = FeatureAccessManager.GetConnectionManager(); IConnection conn = connManager.CreateConnection("OSGeo.SHP.3.6"); string shapeFile = @"D:\GISDATA\world_adm0.shp"; conn.ConnectionInfo.ConnectionProperties.SetProperty("DefaultFileLocation", shapeFile); OSGeo.FDO.Connections.ConnectionState connState = conn.Open();
Mit der Wahl des Datenproviders ändern sich die Möglichkeiten, die man bei den Verbindungseigenschaften (ConnectionProperties
) setzen kann. Eine Liste der Eigenschaften, die je nach Provider gesetzt werden müssen bzw. können findet man in der FDO Doku – The Open Source Providers ->Connection API. Bei ESRI Shapefile muss man mindestens "DefaultFileLocation"
oder "TemporaryFileLocation"
und den Pfad zum Shapefile angeben (s.o.).
In der letzten Zeile des obigen Code-Blocks merkt man spätestens beim Aufruf der Methode Open()
, ob die benötigten Datenprovider auch wirklich an der Stelle sind, wie sie in der Datei providers.xml
beschrieben wurden. Erst dann werden die DLLs samt Abhängigkeiten nämlich zur Laufzeit geladen.
6. Get the connection state
Den Status der Verbindung sollte man abrufen, um eine Fehlerquelle auszuschließen. Das geht auch recht einfach. Anschließend werden wir Daten aus der Datenquelle holen.
//FDO Check ConnectionState if (connState == OSGeo.FDO.Connections.ConnectionState.ConnectionState_Open) { //Fetch Data }
Wie man nun aus der FDO-Verbindung Daten herausbekommt (Punkt 7. Fetch Data) bespreche ich im dritten Teil…