WKB zu WKT JavaScript Funktion

10

Es stellt sich heraus, dass json beim Transport von Binärdaten nicht so gut ist . Mit HTML5 ist XHR2 nun in der Lage , Blobs sauber zu übertragen. Ich möchte binäre Geometrie übertragen (um Bandbreite zu sparen) und sie auf dem Client dekodieren.

Ohne Erfolg habe ich das Web nach einer Javascript-basierten WKB-Funktion (Well- Not Binary) bis WKT (Well-Text) durchsucht. Kennt jemand Open-Source-Lösungen, bevor ich das Rad neu erfinde?

Jordan Arseno
quelle
Übrigens sollten Sie keine Blobs verwenden, sondern Arraybuffer.
Nicklas Avén

Antworten:

10

Es sieht so aus, als wäre seitdem eine neue und besser unterstützte JS WKB-Parsing-Bibliothek erschienen.

https://github.com/cschwarz/wkx

Ich konnte damit WKB direkt von Postgres in JS-Objekte konvertieren, die im Browser zugeordnet werden können. Sie müssen https://github.com/cschwarz/wkx/blob/master/dist/wkx.js in Ihre Webseite aufnehmen, damit dies funktioniert.

// Required imports (works in browser, too)
var wkx = require('wkx');
var buffer = require('buffer');

// Sample data to convert
var wkbLonlat = '010100000072675909D36C52C0E151BB43B05E4440';

// Split WKB into array of integers (necessary to turn it into buffer)
var hexAry = wkbLonlat.match(/.{2}/g);
var intAry = [];
for (var i in hexAry) {
  intAry.push(parseInt(hexAry[i], 16));
}

// Generate the buffer
var buf = new buffer.Buffer(intAry);

// Parse buffer into geometric object
var geom = wkx.Geometry.parse(buf);

// Should log '-73.700380647'
console.log(geom.x)

// Should log '40.739754168'
console.log(geom.y)
Talos
quelle
1
Hey, OP hier. Gefragt vor 1,5 Jahren. Genial!
Jordan Arseno
7

Die einzige Lösung, die ich bisher gefunden habe (und die ich nicht ausprobiert habe), ist https://github.com/thejefflarson/wkb.js . Es ist nur ein unvollständiger WKB-Parser (er konvertiert WKB in ein js-Objekt, das Sie in WKT transformieren können).

Ein alternativer Weg zu wkb auf Javascript-Seite kann das experimentelle twkb sein (derzeit kein Standard) http://blog.jordogskog.no/2013/05/05/mapservice-from-websocket-with-twkb/, aber es erfordert mit einem benutzerdefinierten PostGIS-Build zu spielen (also wirklich nicht für Anfänger)

ThomasG77
quelle
3

Eine andere Möglichkeit könnte darin bestehen, TopoJSON anstelle von einfachem GeoJSON zu verwenden:

TopoJSON ist eine Erweiterung von GeoJSON, die die Topologie codiert. Anstatt Geometrien diskret darzustellen, werden Geometrien in TopoJSON-Dateien aus gemeinsam genutzten Liniensegmenten zusammengefügt, die als Bögen bezeichnet werden . TopoJSON eliminiert Redundanz und bietet viel kompaktere Darstellungen der Geometrie als bei GeoJSON. Typische TopoJSON-Dateien sind 80% kleiner als ihre GeoJSON-Entsprechungen.

blah238
quelle
3

Wie von ThomasG77 erwähnt, habe ich mit Binärdaten in diesem "Twkb" -Format gespielt.

Sie können es hier in Aktion sehen (ein Websocket-Beispiel)

oder hier eine PHP-Implementierung.

Wenn Sie das Parsen studieren möchten, überprüfen Sie die Datei twkb.js. Im Beispiel twkb_node ist es meiner Meinung nach etwas sauberer.

In diesem Blog-Beitrag finden Sie einen Link zum Quellcode des PostGIS-Teils und eine Beschreibung des Formats.

Ich habe seitdem einige Überarbeitungen vorgenommen und werde Github bald neu beschreiben. Ich glaube an Twkb, aber es braucht mehr Verstand, um gut zu werden.

Sie können natürlich auch wkb analysieren, aber Sie erhalten keine Bandbreite im Vergleich zu gezipptem Geojson. Ich war überrascht, wie klein das wurde. Sehen Sie sich den zweiten Link an und überprüfen Sie die Größe des Geojson vs Twkb. WKB ist ungefähr 2-6 mal größer als Twkb.

Nicklas Avén
quelle
0

Bei dieser Antwort geht es nicht um die Funktion von wkb zu wkt.

Ich würde sagen, Sie sollten die Konvertierung von wkt nach wkb nicht nur zum Speichern der Bandbreite verwenden - das Zippen von wkt (oder eines anderen Formats, das Sie dort haben) auf dem Server sollte mehr als ausreichend (und höchstwahrscheinlich - effizienter) sein und Browser können das Entpacken durchführen on the fly und out of the box.

Sehen Sie sich auch die Browser-Unterstützungstabellen für XHTMLRequest2 an, da diese in einigen älteren, aber noch verwendeten Browsern nicht unterstützt werden.

mrówa
quelle
0

GeoScript verfügt über eine Javascript-API, die WKT und WKB liest und schreibt. Die Methoden sind Teil von geom.io.

klewis
quelle
1
FIY nur in einer Shell-Umgebung mit Java-Abhängigkeiten (vgl. Pom.xml unter github.com/tschaub/geoscript-js ) nicht im Browser
ThomasG77