Fonction JavaScript WKB à WKT


10

Il s'avère que json n'est pas si bon pour transporter des données binaires. Mais avec HTML5, XHR2 est désormais capable de transférer les blobs proprement. Je cherche à transférer la géométrie binaire (pour économiser la bande passante) et à la décoder sur le client.

En vain, j'ai parcouru le Web pour une fonction basée sur javascript WKB (Well-known Binary) vers WKT (Well-known Text) . Avant de réinventer la roue, quelqu'un connaît-il des solutions open source?


Btw, vous ne devez pas utiliser de blobs mais arraybuffer.
Nicklas Avén

Réponses:


11

Il semble qu'une nouvelle bibliothèque d'analyse JS WKB mieux prise en charge soit apparue depuis.

https://github.com/cschwarz/wkx

J'ai pu l'utiliser pour convertir WKB directement à partir de postgres en objets JS qui peuvent être mappés dans le navigateur. Vous devrez inclure https://github.com/cschwarz/wkx/blob/master/dist/wkx.js dans votre page Web pour que cela fonctionne.

// 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
Hé, OP ici. Question posée il y a 1,5 ans. Impressionnant!
Jordan Arseno

7

La seule solution pure javascript que j'ai trouvée jusqu'à présent (et je n'ai pas essayé) est https://github.com/thejefflarson/wkb.js . Ce n'est qu'un analyseur WKB incomplet (il convertit WKB en un objet js que vous pouvez transformer en WKT)

Une manière alternative à wkb du côté javascript peut être le twkb expérimental (pas un standard pour le moment) http://blog.jordogskog.no/2013/05/05/mapservice-from-websocket-with-twkb/ mais il nécessite pour jouer avec une version PostGIS personnalisée (donc vraiment pas pour les débutants)


3

Une autre possibilité pourrait être d'utiliser TopoJSON au lieu de GeoOSON simple:

TopoJSON est une extension de GeoJSON qui code la topologie. Plutôt que de représenter les géométries de manière discrète, les géométries des fichiers TopoJSON sont assemblées à partir de segments de ligne partagés appelés arcs . TopoJSON élimine la redondance, offrant des représentations beaucoup plus compactes de la géométrie qu'avec GeoJSON; les fichiers TopoJSON typiques sont 80% plus petits que leurs équivalents GeoJSON.


3

Comme mentionné par ThomasG77, j'ai joué avec des données binaires dans ce format "twkb".

vous pouvez le voir en action ici (un exemple de websocket)

ou ici , une implémentation php.

Si vous souhaitez étudier l'analyse, consultez le fichier twkb.js. C'est un peu plus propre dans l'exemple twkb_node je pense.

Dans cet article de blog, vous trouverez un lien vers le code source de la partie PostGIS et une description du format.

J'ai fait quelques retouches depuis et vais bientôt mettre une nouvelle description sur github. J'ai une foi en twkb, mais il a besoin de plus de cerveaux pour devenir bon.

Vous pouvez bien sûr également analyser wkb mais vous ne gagnerez aucune bande passante par rapport à geojson gzippé. J'ai été surpris de voir à quel point cela était petit. Voir le deuxième lien et vérifier les tailles du geojson vs twkb. WKB est environ 2 à 6 fois plus grand que twkb.


0

Cette réponse ne concerne pas la fonction wkb to wkt.

Je dirais que vous ne devriez pas utiliser la conversion de wkt en wkb juste pour économiser de la bande passante - gzipping wkt (ou tout autre format que vous avez là-bas) sur le serveur devrait être plus que suffisant (et probablement plus efficace) et les navigateurs peuvent faire la décompression à la volée et hors de la boîte.

Regardez également les tableaux de prise en charge du navigateur pour XHTMLRequest2, car il n'est pas pris en charge dans certains navigateurs plus anciens, mais toujours utilisés.


0

GeoScript possède une API Javascript qui lit et écrit WKT et WKB. Les méthodes font partie de geom.io.


1
FIY uniquement dans un environnement shell avec des dépendances java (cf pom.xml sur github.com/tschaub/geoscript-js ) pas dans le navigateur
ThomasG77
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.