· 

MapGuide OS Layer aus BricsCAD erzeugen

Motivation

Um in einer MapGuide Karte Layer darzustellen müssen diese zunächst angelegt werden. Da ich mit PostGIS arbeite, beziehen sich die nachfolgenden Ausführungen auch ganau darauf. Für Layerdefinitionen müssen diverse Optionen eingestellt werden. Unter anderem sind das

  • Die Feature Class, also die Datenbankverbindung.
  • Das Filterkriterium, also die Eigenschaft, nach der in der PostGIS DB gesucht wird.
  • Der Maßstabs-Bereich, also der Zoom-Bereich, in welchem der Layer in der Karte angezeigt wird.
  • Die grafische Ausgestaltung.

Mit MapGuide Maestro lassen sich recht einfach Layer für eine Karte definieren. Hat man jedoch hunderte Layer, wird das schnell zur Strafarbeit. Darum verwende ich VBA, um diese Arbeit ein wenig zu automatisieren.

Da sich Punktobjekte und lineare bzw. flächige Objekte in der Layerstruktur grundsätzlich unterscheiden gibt es dafür auch verschiedene Routinen.

Alle sind in im Makro mg_konfig_pg_neu.dvb gespeichert.

Linienlayer

Mit der VBA-Routine start_mg_linlayer_konf() werden die Definitionen von Linien- und Flächenlayern aus einer BricsCAD DWG generiert. Die Ergebnisse werden als XML File lokal auf dem Rechner abgelegt. Folgende Einstellungen sind vorzunehmen.

Generelle Einstellungen

  • mstabAuswahl - Boolean - gibt an, ob der Maßstab aus einer Variablen oder interaktiv gesetzt werden sol
  • postGisName - String - Name der PostGIS Datenbank (lokal)
  • mgDbVerbindung - String - Mapguide Feature Source für den Layer. Z.B.: "Library://datenbankverbindung/postgis.FeatureSource"
  • fiLter - String - da nur in der Datenbank abgelegte Layer berücksichtigt werden hier der Filterwert für den Layernamen. Z.B. "'S-%'" für alle Strom-Layer
  • dbThema - String - Namensteil der DB-Tabelle. Z.B. "str" für agmg_str....

Einstellungen für Linienlayer

  • dbSubThema - String - DB Unterthema, also "leitung" für agmg_strleitung
  • mgMassStab - String - Zielmaßstab des Layers. Z.B. "2005" wenn der Layer von 1:1 bis 1:2500 dargestellt werden soll
  • acadLinienDicke - Real - für die MapGuide Linienstärke
  • xmlZiel - String - Lokaler Pfad im dem die Layerdefinition gespeichert werden soll
  • Suffix - String - wird an den Dateinamen gehängt. "_lin" für alles Linien ausser Bemaßung, "_mas_lin" für Maße

Programmablauf

  • Schritt 1:
    Selektion aller in der Linientabelle (also im Beispiel agmg_strleitung) gespeicherten BricsCAD Layer.
  • Schritt 2:
    Prüfung, ob dieser Layer auch in der DWG enthalten ist. Wenn ja, dann weiter mit Schritt 3 sonst Ausgabe einer Meldung.
  • Schritt 3:
  • Abfrage des Zielmaßstabs für die MapGuide Layerdefinition.
  • Schritt 4:
  • Suchen aller DWG-Eigenschaften und Speichern der XML-Layerdefinition.

Ergebnis

So sieht z.B. eine Layerdefinition aus. Grün sind die Komponenten, welche aus dem Programm bzw. der DWG gelesen werden. Das spart eine Menge Handarbeit.

 

<VectorLayerDefinition>
    <ResourceId>Library://datenbankverbindung/postgis.FeatureSource</ResourceId>
    <Watermarks />
    <FeatureName>public:agmg_strleitung</FeatureName>
    <FeatureNameType>FeatureClass</FeatureNameType>
    <Filter>layer = 'S-NK-HAS'</Filter>
    <PropertyMapping>
      <Name>ltg_id</Name>
      <Value>ltg_id</Value>
    </PropertyMapping>
    <PropertyMapping>
      <Name>ag_id</Name>
      <Value>ag_id</Value>
    </PropertyMapping>
    <PropertyMapping>
      <Name>ag_key</Name>
      <Value>ag_key</Value>
    </PropertyMapping>
    <PropertyMapping>
      <Name>layer</Name>
      <Value>layer</Value>
    </PropertyMapping>
    <PropertyMapping>
      <Name>linetype</Name>
      <Value>linetype</Value>
    </PropertyMapping>
    <PropertyMapping>
      <Name>constantwidth</Name>
      <Value>constantwidth</Value>
    </PropertyMapping>
    <Geometry>graphik</Geometry>
    <VectorScaleRange>
      <MaxScale>5005</MaxScale>
      <LineTypeStyle>
        <LineRule>
          <LegendLabel />
          <Filter>layer = 'S-NK-HAS'</Filter>
          <LineSymbolization2D>
            <LineStyle>Solid</LineStyle>
            <Thickness>0</Thickness>
            <Color>FFDF7FFF</Color>
            <Unit>Meters</Unit>
            <SizeContext>MappingUnits</SizeContext>
          </LineSymbolization2D>
        </LineRule>
      </LineTypeStyle>
      <AreaTypeStyle>
        <AreaRule>
          <LegendLabel />
          <Filter>layer  =  'S-NK-HAS'</Filter>
          <AreaSymbolization2D>
            <Stroke>
              <LineStyle>Solid</LineStyle>
              <Thickness>0</Thickness>
              <Color>FFDF7FFF</Color>
              <Unit>Meters</Unit>
              <SizeContext>MappingUnits</SizeContext>
            </Stroke>
          </AreaSymbolization2D>
        </AreaRule>
      </AreaTypeStyle>
    </VectorScaleRange>
  </VectorLayerDefinition>

Textlayer

Mit der VBA-Routine start_mg_textlayer_konf() werden die Definitionen von Textlayern aus einer BricsCAD DWG generiert. Die Ergebnisse werden als XML File lokal auf dem Rechner abgelegt.

Layerdefinition aus BricsCAD nach MapGuide exportieren

Wenn die Layer erfolgreich als XML Dateien gespeichert wurden kann man start_mg_layer_zu_mgos() starten. Diese VBA-Routine benötigt folgende Parameter:

  • libName - Der Name einer Library im MapGuide Verzeichnis. Z.B. Library://testprojekt/layer.
  • verzeichnisName - Name des lokalen Verzeichnisses, in dem die XML Dateien mit den Layerdefinitionen abgelegt sind.
  • lFilter - Filter auf den Namen der XML-Datei. Z.B. lFilter = "G-H-"

 

Layerdefinitionen aus BricsCAD nach MapGuide exportiert
Layerdefinitionen aus BricsCAD nach MapGuide exportiert

Kommentar schreiben

Kommentare: 0