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?

Jordan Arseno
la 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)
Talos
la source
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)

ThomasG77
la source
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.

blah238
la source
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.

Nicklas Avén
la source
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.

mrówa
la source
0

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

klewis
la source
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