Функция WKB в WKT JavaScript

10

Оказывается, JSON не так хорош в передаче двоичных данных. Но с HTML5, XHR2 теперь способен чисто передавать двоичные объекты . Я ищу для передачи двоичной геометрии (чтобы сохранить пропускную способность) и декодировать ее на клиенте.

Безрезультатно, я искал в Интернете функцию WKB (общеизвестный бинарный код ) на основе JavaScript в WKT (общеизвестный текст) . Прежде чем я изобрету колесо - кто-нибудь знает какие-либо решения с открытым исходным кодом?

Джордан Арсено
источник
Кстати, вы не должны использовать BLOB-объектов, а массива буферов.
Никлас Авен

Ответы:

11

Похоже, с тех пор появилась новая, лучше поддерживаемая библиотека синтаксического анализа JS WKB.

https://github.com/cschwarz/wkx

Я смог использовать его для преобразования WKB напрямую из postgres в объекты JS, которые можно отображать в браузере. Вам нужно будет включить https://github.com/cschwarz/wkx/blob/master/dist/wkx.js на свою веб-страницу, чтобы это работало.

// 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
Эй, ОП здесь. Спросил об этом 1,5 года назад. Потрясающие!
Джордан Арсено
7

Единственное решение, которое я нашел на чистом javascript (и я не пробовал), это https://github.com/thejefflarson/wkb.js . Это только неполный анализатор WKB (он преобразует WKB в объект js, который можно преобразовать в WKT)

Альтернативным способом использования wkb на стороне javascript может быть экспериментальный twkb (на данный момент не является стандартным) http://blog.jordogskog.no/2013/05/05/mapservice-from-websocket-with-twkb/, но для этого требуется играть с пользовательской сборкой PostGIS (так что на самом деле не для начинающих)

ThomasG77
источник
3

Другой возможностью может быть использование TopoJSON вместо простого GeoJSON:

TopoJSON - это расширение GeoJSON, которое кодирует топологию. Вместо того, чтобы представлять геометрии дискретно, геометрии в файлах TopoJSON сшиваются вместе из общих отрезков, называемых дугами . TopoJSON устраняет избыточность, предлагая гораздо более компактные представления геометрии, чем с GeoJSON; типичные файлы TopoJSON на 80% меньше, чем их эквиваленты GeoJSON.

blah238
источник
3

Как упомянул ThomasG77, я играл с двоичными данными в этом формате «twkb».

Вы можете увидеть это в действии здесь (пример websocket)

или здесь , реализация PHP.

Если вы хотите изучить синтаксический анализ, проверьте файл twkb.js. Я думаю, это немного чище в примере twkb_node.

В этой записи блога вы можете найти ссылку на исходный код части PostGIS и описание формата.

С тех пор я сделал некоторые переделки и вскоре добавлю новое описание на github. Я верю в twkb, но для этого нужно больше мозгов.

Конечно, вы также можете анализировать wkb, но вы не получите никакой пропускной способности по сравнению с gzipped geojson. Я был удивлен, насколько маленьким это стало. Посмотрите вторую ссылку и проверьте размеры geojson vs twkb. WKB примерно в 2-6 раз больше, чем twkb.

Никлас Авен
источник
0

Этот ответ не о функции wkb to wkt.

Я бы сказал, что вам не следует использовать преобразование из wkt в wkb просто для сохранения пропускной способности - gzipping wkt (или другого имеющегося у вас формата) на сервере должно быть более чем достаточно (и, скорее всего, более эффективно), а браузеры могут разархивировать на лету и из коробки.

Посмотрите также таблицы поддержки браузеров для XHTMLRequest2, поскольку они не поддерживаются в некоторых старых, но все еще используемых браузерах.

mrówa
источник
0

GeoScript имеет Javascript API, который читает и записывает WKT и WKB. Методы являются частью geom.io.

klewis
источник
1
FIY только в среде оболочки с Java-зависимостями (см. Pom.xml на github.com/tschaub/geoscript-js ), а не в браузере
ThomasG77