ST_AsBinary() în MySQL

Transformă o geometrie în formatul binar standard WKB („Well-Known Binary”), folosit la schimbul de date.

Sintaxă
ST_AsBinary(geometrie [, optiuni])
ST_AsWKB(geometrie [, optiuni])

Ce face ST_AsBinary()

WKB este forma binară standard a unei geometrii, înțeleasă de PostGIS, QGIS sau bibliotecile de hărți. ST_AsBinary() și sinonimul ei ST_AsWKB() returnează acești octeți; ca să-i vezi, folosește HEX().

Un punct în WKB are 21 de octeți: 1 octet pentru ordinea octeților (01 = little-endian), 4 octeți pentru tip (01000000 = punct) și câte 8 octeți pentru fiecare coordonată. Formatul intern MySQL este același WKB precedat de 4 octeți cu SRID-ul, de aceea are 25 de octeți. WKB nu conține SRID-ul.

Ca la ST_AsText(), pentru SRID 4326 se poate alege ordinea axelor cu 'axis-order=long-lat'. Dacă scrii WKB în ordinea long-lat și îl citești înapoi fără aceeași opțiune, latitudinea și longitudinea se inversează.

Parametri

Parametru Descriere
geometrie Valoarea spațială.
optiuni Opțional: ordinea axelor, de exemplu 'axis-order=long-lat'.

Ce returnează

Un șir binar (WKB).

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

CREATE TABLE orase (
  id INT PRIMARY KEY,
  nume VARCHAR(20),
  loc POINT NOT NULL SRID 4326,
  SPATIAL INDEX (loc)
);

INSERT INTO orase VALUES
  (1, 'Iași',        ST_GeomFromText('POINT(47.1585 27.6014)', 4326)),
  (2, 'Cluj-Napoca', ST_GeomFromText('POINT(46.7712 23.6236)', 4326)),
  (3, 'București',   ST_GeomFromText('POINT(44.4268 26.1025)', 4326)),
  (4, 'Timișoara',   ST_GeomFromText('POINT(45.7489 21.2087)', 4326)),
  (5, 'Constanța',   ST_GeomFromText('POINT(44.1598 28.6348)', 4326));

Exemplul 1: Octeții unui punct

SELECT HEX(ST_AsBinary(Point(1, 2))) AS wkb,
       LENGTH(ST_AsWKB(Point(1, 2))) AS octeti_wkb,
       LENGTH(Point(1, 2)) AS octeti_intern;

Rezultat

+--------------------------------------------+------------+---------------+
| wkb                                        | octeti_wkb | octeti_intern |
+--------------------------------------------+------------+---------------+
| 0101000000000000000000F03F0000000000000040 |         21 |            25 |
+--------------------------------------------+------------+---------------+

Exemplul 2: Dus și întors: aceeași ordine a axelor la scriere și la citire

SELECT nume,
       ST_AsText(ST_GeomFromWKB(ST_AsWKB(loc), 4326)) AS refacut,
       ST_AsText(ST_GeomFromWKB(ST_AsWKB(loc, 'axis-order=long-lat'), 4326)) AS ordine_amestecata
FROM orase
WHERE id = 1;

Rezultat

+-------+------------------------+------------------------+
| nume  | refacut                | ordine_amestecata      |
+-------+------------------------+------------------------+
| Iași  | POINT(47.1585 27.6014) | POINT(27.6014 47.1585) |
+-------+------------------------+------------------------+

Greșeli frecvente

  • Crezi că WKB păstrează SRID-ul. Nu îl păstrează: când citești înapoi cu ST_GeomFromWKB(), dă SRID-ul ca al doilea argument.

Comenzi înrudite

  • ST_GeomFromWKB(): Creează o geometrie de orice tip din reprezentarea ei binară WKB, opțional cu SRID.
  • ST_AsText(): Transformă o geometrie în text WKT, ușor de citit: POINT(1 2), LINESTRING(…), POLYGON(…).
  • HEX() și UNHEX(): HEX() transformă un număr sau un text în hexazecimal; UNHEX() face conversia inversă.