Projekt Linie Plus: GeoJSON-Import-Modul

Das Projekt Linie Plus basiert auf dem von Stadtkreation entwickelten WordPress-Theme My Transit Lines. Auf der Website können Nah-/Schienenverkehrsinteressierte Vorschläge für Bahn- und Buslinien einzeichnen und beschreiben. Das Theme und die Linie-Plus-Community warten ungeduldig auf Version 2.0, deren Release aber noch nicht terminiert ist.

Der neueste Release des Themes ist Version 1.10. Dort wurde eine GeoJSON-Importfunktion integriert, was nicht trivial war, da das Theme noch die Uralt-Version 2.X von OpenLayers verwendet – was wiederum beim Sprung auf Version 2.X natürlich sofort geändert wird. Bei der Programmierung des Themes in 2014 war kein praktikabler Weg gefunden worden, GeoJSON als Format in Verbindung mit den Zeichentools von OpenLayers 2.X zur Speicherung der von den Usern eingezeichneten Linien- und Punktdaten mit dem name-Attribut der Bahnhöfe/Haltestellen zu verwenden. So fiel die Wahl damals auf Well-known text (WKT) als Format, wodurch die Namensattribute aber in einem separaten Datenbankfeld kommasepariert abgespeichert werden müssen, da WKT im Gegensatz zu GeoJSON keine Möglichkeit bietet, neben Geometrie- auch Attributdaten abzuspeichern.

So wie die vor einigen Jahren integrierte Exportfunktion eine Umwandlung der WKT-Daten aus der Datenbank in GeoJSON beinhaltet, war bei der Importfunktion nun der umgekehrte Weg nötig. Die OpenLayers-Funktion wies Bugs auf, was eine eigene Funktion zum Parsen erforderte. Diese bezieht nur Point-, LineString- und MultiLineString-Featuers mit ein, da das Projekt keine Arbeit mit Polygonen vorsieht. Der aktuelle und noch zu optimierende Stand der Funktion sieht wie folgt aus:

// parse GeoJSON to WKT. Selfmade! TODO: Simplify & cleanup.
let WKTFeatures = 'GEOMETRYCOLLECTION(';
let firstFeature = true;
console.log(newGeoJSON.length);
for(let i = 0; i < newGeoJSON.length; i++) {
  if(!firstFeature) WKTFeatures += ',';
  if(newGeoJSON[i].geometry.type == 'Point') WKTFeatures += 'POINT(' + newGeoJSON[i].geometry.coordinates[0] + ' ' + newGeoJSON[i].geometry.coordinates[1] + ')';
  if(newGeoJSON[i].geometry.type == 'LineString') {
    WKTFeatures += 'LINESTRING(';
    let firstLineStringPart = true;
    for(let j = 0;j < newGeoJSON[i].geometry.coordinates.length;j++) {
      if(!firstLineStringPart) WKTFeatures += ',';
      WKTFeatures += newGeoJSON[i].geometry.coordinates[j][0] + ' ' + newGeoJSON[i].geometry.coordinates[j][1];
      firstLineStringPart = false;
    }
    WKTFeatures += ')';
  }
  if(newGeoJSON[i].geometry.type == 'MultiLineString') {
    WKTFeatures += 'MULTILINESTRING(';
    let firstLineString = true;
    for(let j = 0;j < newGeoJSON[i].geometry.coordinates.length;j++) {
      if(!firstLineString) WKTFeatures += ',';
      WKTFeatures += '(';
      let firstLineStringPart = true;
      for(let k = 0;k < newGeoJSON[i].geometry.coordinates[j].length;k++) {
        if(!firstLineStringPart) WKTFeatures += ',';
        WKTFeatures += newGeoJSON[i].geometry.coordinates[j][k][0] + ' ' + newGeoJSON[i].geometry.coordinates[j][k][1];
        firstLineStringPart = false;
      }
      WKTFeatures += ')';
      firstLineString = false;
    }
    WKTFeatures += ')';
  }
  firstFeature = false;
}
WKTFeatures += ')';

Quelle: https://github.com/winnewoerp/my-transit-lines/blob/master/js/my-transit-lines.js, Zeilen 810-845

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.