Функція WKB до WKT JavaScript


10

Виявляється, json не так добре переносить двійкові дані. Але за допомогою HTML5 XHR2 тепер здатний чисто переносити краплі . Я хочу передати бінарну геометрію (щоб зберегти пропускну здатність) і розшифрувати її на клієнті.

Безрезультатно, я прошу в Інтернеті функцію WKB (добре відомий бінарний) на основі WKT (добре відомий текст) . Перш ніж переосмислити колесо - хтось знає про рішення з відкритим кодом?


До речі, ви не повинні використовувати краплі, а масив.
Nicklas Avén

Відповіді:


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 (так що насправді не для початківців)


3

Іншою можливістю може бути використання TopoJSON замість простого GeoJSON:

TopoJSON - це розширення GeoJSON, що кодує топологію. Замість того, щоб геометрично представляти геометрії, геометрії у файлах TopoJSON зшиваються з сегментів спільного рядка, званих дугами . TopoJSON виключає надмірність, пропонуючи набагато більш компактні зображення геометрії, ніж GeoJSON; типові файли TopoJSON на 80% менше, ніж їх еквіваленти GeoJSON.


3

Як згадував ThomasG77, я грав у бінарних даних у цьому форматі "twkb".

ви можете побачити його в дії тут (приклад веб-розетки)

або тут , 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, оскільки він не підтримується у деяких старих, але все ще використовуваних браузерах.


0

GeoScript має Javascript API, який читає і записує WKT і WKB. Методи є частиною geom.io.


1
БІЛЬШЕ тільки в середовищі оболонки з java залежностями (cf pom.xml на github.com/tschaub/geoscript-js ), а не в браузері
ThomasG77
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.