Função WKB para WKT JavaScript


10

Acontece que o json não é tão bom no transporte de dados binários. Mas com o HTML5, o XHR2 agora é capaz de transferir blobs de maneira limpa. Estou procurando transferir geometria binária (para economizar largura de banda) e decodificá-la no cliente.

Sem sucesso, procurei na Web uma função WKB (Well-known Binary) baseada em javascript para WKT (Texto conhecido) . Antes de reinventar a roda - alguém está ciente de alguma solução de código aberto?


Btw, você não deve usar blobs, mas arraybuffer.
Nicklas Avén

Respostas:


11

Parece que uma nova e melhor suportada biblioteca de análise JS WKB apareceu desde então.

https://github.com/cschwarz/wkx

Consegui usá-lo para converter o WKB diretamente do postgres em objetos JS que podem ser mapeados no navegador. Você precisará incluir https://github.com/cschwarz/wkx/blob/master/dist/wkx.js na sua página da Web para que isso 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
Ei, OP aqui. Perguntou isso há 1,5 anos. Impressionante!
Jordan Arseno 06/02

7

A única solução de javascript puro que encontrei até agora (e não tentei) é https://github.com/thejefflarson/wkb.js . É apenas um analisador WKB incompleto (ele converte WKB em um objeto js que você pode transformar em WKT)

Uma maneira alternativa de wkb no lado do javascript pode ser o twkb experimental (não é um padrão no momento) http://blog.jordogskog.no/2013/05/05/mapservice-from-websocket-with-twkb/, mas requer para jogar com uma compilação PostGIS personalizada (realmente não para iniciantes)


3

Outra possibilidade pode ser usar o TopoJSON em vez do GeoJSON simples:

TopoJSON é uma extensão do GeoJSON que codifica topologia. Em vez de representar discretamente as geometrias, as geometrias nos arquivos TopoJSON são costuradas a partir de segmentos de linhas compartilhados chamados arcos . O TopoJSON elimina a redundância, oferecendo representações muito mais compactas da geometria do que com o GeoJSON; arquivos TopoJSON típicos são 80% menores que seus equivalentes GeoJSON.


3

Como mencionado por ThomasG77, eu tenho jogado com dados binários neste formato "twkb".

você pode vê-lo em ação aqui (um exemplo de websocket)

ou aqui , uma implementação php.

Se você deseja estudar a análise, verifique o arquivo twkb.js. É um pouco mais limpo no exemplo twkb_node, eu acho.

Em este post pode encontrar link para o código-fonte da parte PostGIS e alguns descrição do formato.

Fiz algumas reformulações desde então e em breve colocarei uma nova descrição no github. Eu acredito em twkb, mas ele precisa de mais inteligência para melhorar.

Obviamente, você também pode analisar o wkb, mas não terá largura de banda em comparação com o geojson compactado com gzip. Fiquei surpreso com o quão pequeno isso ficou. Veja o segundo link e verifique os tamanhos do geojson vs twkb. WKB é cerca de 2-6 vezes maior que twkb.


0

Esta resposta não é sobre a função wkb to wkt.

Eu diria que você não deve usar a conversão de wkt para wkb apenas para salvar a largura de banda - gzipping wkt (ou outro formato existente) no servidor deve ser mais do que suficiente (e provavelmente - mais eficiente) e os navegadores podem descompactar na mosca e fora da caixa.

Consulte também as tabelas de suporte ao navegador para XHTMLRequest2, pois ele não é suportado em alguns navegadores mais antigos, mas ainda usados.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.