Función JavaScript de WKB a WKT


10

Resulta que json no es tan bueno transportando datos binarios. Pero con HTML5, XHR2 ahora es capaz de transferir blobs limpiamente. Estoy buscando transferir geometría binaria (para ahorrar ancho de banda) y decodificarla en el cliente.

En vano, he buscado en la web una función WKB (Binario conocido) basada en JavaScript a WKT (Texto conocido) . Antes de reinventar la rueda, ¿alguien conoce alguna solución de código abierto?


Por cierto, no debes usar blobs sino arraybuffer.
Nicklas Avén

Respuestas:


11

Parece que desde entonces apareció una biblioteca de análisis JS WKB nueva y mejor compatible.

https://github.com/cschwarz/wkx

He podido usarlo para convertir WKB directamente de postgres en objetos JS que se pueden asignar en el navegador. Deberá incluir https://github.com/cschwarz/wkx/blob/master/dist/wkx.js en su página web para que esto funcione.

// 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
Hola, OP aquí. Preguntado esto hace 1,5 años. ¡Increíble!
Jordan Arseno

7

La única solución de javascript puro que he encontrado hasta ahora (y no probé) es https://github.com/thejefflarson/wkb.js . Es solo un analizador de WKB incompleto (convierte WKB en un objeto js que puede transformar en WKT)

Una forma alternativa de wkb en javascript puede ser el twkb experimental (no es un estándar en este momento) http://blog.jordogskog.no/2013/05/05/mapservice-from-websocket-with-twkb/ pero requiere jugar con una compilación personalizada de PostGIS (así que realmente no es para principiantes)


3

Otra posibilidad podría ser usar TopoJSON en lugar de GeoJSON simple:

TopoJSON es una extensión de GeoJSON que codifica la topología. En lugar de representar geometrías discretamente, las geometrías en los archivos TopoJSON se unen a partir de segmentos de línea compartidos llamados arcos . TopoJSON elimina la redundancia, ofreciendo representaciones de geometría mucho más compactas que con GeoJSON; Los archivos TopoJSON típicos son 80% más pequeños que sus equivalentes GeoJSON.


3

Como mencionó ThomasG77, he estado jugando con datos binarios en este formato "twkb".

puedes verlo en acción aquí (un ejemplo de websocket)

o aquí , una implementación de php.

Si desea estudiar el análisis, verifique el archivo twkb.js. Es un poco más limpio en el ejemplo twkb_node, creo.

En esta publicación de blog puede encontrar un enlace al código fuente de la parte de PostGIS y alguna descripción del formato.

He revisado un poco desde entonces y pronto pondré una nueva descripción en github. Creo en twkb, pero necesita más cerebro para recuperarse.

Por supuesto, también puede analizar wkb, pero no obtendrá ancho de banda en comparación con geojson comprimido. Me sorprendió lo pequeño que se volvió. Vea el segundo enlace y verifique los tamaños de geojson vs twkb. WKB es aproximadamente 2-6 veces más grande que twkb.


0

Esta respuesta no se trata de la función wkb to wkt.

Yo diría que no debería usar la conversión de wkt a wkb solo para ahorrar ancho de banda: gzipping wkt (u otro formato que tenga allí) en el servidor debería ser más que suficiente (y muy probablemente más eficiente) y los navegadores pueden descomprimir sobre la marcha y fuera de la caja.

Mire también las tablas de soporte del navegador para XHTMLRequest2, ya que no es compatible con algunos navegadores más antiguos pero aún utilizados.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.