Funzione JavaScript da WKB a WKT


10

Risulta che json non è così bravo nel trasporto di dati binari. Ma con HTML5, XHR2 è ora in grado di trasferire i BLOB in modo pulito. Sto cercando di trasferire la geometria binaria (per risparmiare larghezza di banda) e decodificarla sul client.

Inutilmente, ho cercato nel web una funzione da WKB (ben noto binario) a WKT (ben noto testo) basata su javascript . Prima di reinventare la ruota: qualcuno è a conoscenza di soluzioni open source?


A proposito, non dovresti usare BLOB ma arraybuffer.
Nicklas Avén,

Risposte:


11

Sembra che da allora sia apparsa una nuova libreria di analisi JS WKB meglio supportata.

https://github.com/cschwarz/wkx

Sono stato in grado di usarlo per convertire WKB direttamente da Postgres in oggetti JS che possono essere mappati nel browser. Dovrai includere https://github.com/cschwarz/wkx/blob/master/dist/wkx.js nella tua pagina web affinché funzioni.

// 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)

1
Ehi, OP qui. Chiesto questo 1,5 anni fa. Eccezionale!
Jordan Arseno,

7

L'unica soluzione pura soluzione javascript che ho trovato finora (e non ho provato) è https://github.com/thejefflarson/wkb.js . È solo un parser WKB incompleto (converte WKB in un oggetto js che puoi trasformare in WKT)

Un modo alternativo di wkb sul lato javascript può essere il twkb sperimentale (non uno standard al momento) http://blog.jordogskog.no/2013/05/05/mapservice-from-websocket-with-twkb/ ma richiede giocare con una build PostGIS personalizzata (quindi non per i principianti)


3

Un'altra possibilità potrebbe essere quella di utilizzare TopoJSON invece del semplice GeoJSON:

TopoJSON è un'estensione di GeoJSON che codifica la topologia. Piuttosto che rappresentare discretamente le geometrie, le geometrie nei file TopoJSON sono cucite insieme da segmenti di linea condivisi chiamati archi . TopoJSON elimina la ridondanza, offrendo rappresentazioni della geometria molto più compatte rispetto a GeoJSON; i file tipici TopoJSON sono più piccoli dell'80% rispetto ai loro equivalenti GeoJSON.


3

Come accennato da ThomasG77, ho giocato con i dati binari in questo formato "twkb".

potete vederlo in azione qui (un esempio websocket)

o qui , un'implementazione php.

Se vuoi studiare l'analisi, controlla il file twkb.js. Penso che sia un po 'più pulito nell'esempio di twkb_node.

In questo post del blog è possibile trovare un collegamento al codice sorgente della parte PostGIS e una descrizione del formato.

Da allora ho apportato alcune modifiche e presto inserirò una nuova descrizione su Github. Credo nel twkb, ma ha bisogno di più cervelli per diventare bravo.

Ovviamente puoi anche analizzare wkb ma non otterrai alcuna larghezza di banda rispetto al geojson gzip. Sono stato sorpreso da quanto piccolo fosse. Vedi il secondo link e controlla le dimensioni del geojson vs twkb. WKB è circa 2-6 volte più grande di twkb.


0

Questa risposta non riguarda la funzione da wkb a wkt.

Direi che non dovresti usare la conversione da wkt a wkb solo per salvare bandwith - gzipping wkt (o altro formato che hai lì) sul server dovrebbe essere più che sufficiente (e molto probabilmente - più efficiente) e i browser possono fare decompressione al volo e fuori dalla scatola.

Guarda anche le tabelle di supporto del browser per XHTMLRequest2, poiché non è supportato in alcuni browser meno recenti, ma ancora utilizzati.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.