Funkcja WKB do WKT JavaScript

10

Okazuje się, że json nie jest tak dobry w transporcie danych binarnych. Ale dzięki HTML5 XHR2 jest teraz w stanie czysto przenosić obiekty BLOB . Chcę przenieść geometrię binarną (w celu zaoszczędzenia przepustowości) i zdekodować ją na kliencie.

Bezskutecznie przeszukałem sieć w poszukiwaniu funkcji WKB (dobrze znany plik binarny) do WKT (dobrze znany tekst) . Zanim ponownie wymyślę koło - czy ktoś zna jakieś rozwiązania typu open source?

Jordan Arseno
źródło
Przy okazji nie powinieneś używać obiektów blob, ale bufora tablic.
Nicklas Avén

Odpowiedzi:

11

Wygląda na to, że pojawiła się nowa i lepiej obsługiwana biblioteka parsująca JS WKB.

https://github.com/cschwarz/wkx

Byłem w stanie go użyć do konwersji WKB bezpośrednio z postgresu na obiekty JS, które można mapować w przeglądarce. Aby to działało, musisz dołączyć https://github.com/cschwarz/wkx/blob/master/dist/wkx.js na swojej stronie internetowej.

// 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
źródło
1
Cześć, OP tutaj. Zapytano o to 1,5 roku temu. Niesamowite!
Jordan Arseno,
7

Jedynym rozwiązaniem, które do tej pory znalazłem (a nie próbowałem), jest javascript, to https://github.com/thejefflarson/wkb.js . To tylko niekompletny parser WKB (konwertuje WKB na obiekt js, który można przekształcić w WKT)

Alternatywnym sposobem na wkb po stronie javascript może być eksperymentalny twkb (obecnie nie jest to standard) http://blog.jordogskog.no/2013/05/05/mapservice-from-websocket-with-twkb/, ale wymaga grać z niestandardową wersją PostGIS (więc naprawdę nie dla początkujących)

ThomasG77
źródło
3

Inną możliwością może być użycie TopoJSON zamiast zwykłego GeoJSON:

TopoJSON to rozszerzenie GeoJSON, które koduje topologię. Zamiast dyskretnie przedstawiać geometrie, geometrie w plikach TopoJSON są łączone ze wspólnych segmentów linii zwanych łukami . TopoJSON eliminuje nadmiarowość, oferując znacznie bardziej zwarte reprezentacje geometrii niż w przypadku GeoJSON; typowe pliki TopoJSON są o 80% mniejsze niż ich odpowiedniki GeoJSON.

blah238
źródło
3

Jak wspomniałem ThomasG77, bawiłem się danymi binarnymi w tym formacie „twkb”.

możesz to zobaczyć tutaj w akcji (przykład gniazda sieciowego)

lub tutaj implementacja php.

Jeśli chcesz przestudiować analizowanie, sprawdź plik twkb.js. Myślę, że jest to trochę czystsze w przykładzie twkb_node.

W tym poście na blogu można znaleźć link do kodu źródłowego części PostGIS oraz opis formatu.

Od tego czasu dokonałem przeróbek i wkrótce opublikuję nowy opis na github. Wierzę w twkb, ale potrzeba więcej mózgów, aby być dobrym.

Oczywiście możesz również parsować wkb, ale nie zyskasz przepustowości w porównaniu do gzipped geojson. Byłem zaskoczony, jak małe to się stało. Zobacz drugi link i sprawdź rozmiary geojson vs twkb. WKB jest około 2-6 razy większy niż twkb.

Nicklas Avén
źródło
0

Ta odpowiedź nie dotyczy funkcji wkb to wkt.

Powiedziałbym, że nie powinieneś używać konwersji z wkt do wkb tylko w celu zapisania pasma - gzipping wkt (lub inny format, który tam masz) na serwerze powinien być więcej niż wystarczający (i najprawdopodobniej - bardziej wydajny), a przeglądarki mogą rozpakować w locie i po wyjęciu z pudełka.

Zobacz także tabele obsługi przeglądarki dla XHTMLRequest2, ponieważ nie jest obsługiwane w niektórych starszych, ale wciąż używanych przeglądarkach.

mrówa
źródło
0

GeoScript ma JavaScript API, który odczytuje i zapisuje WKT i WKB. Metody są częścią geom.io.

Klewis
źródło
1
FIY tylko w środowisku powłoki z zależnościami java (por. Pom.xml na github.com/tschaub/geoscript-js ) nie w przeglądarce
ThomasG77