Apa perbedaan antara POINT (X, Y) dan GeomFromText (“POINT (XY)”)?

17

Saya ingin menyimpan beberapa posisi geometris di basis data MySQL saya. Untuk ini saya menggunakan tipe data TITIK. Hampir di mana-mana saya membaca bahwa fungsi tersebut GeomFromTextharus digunakan untuk memasukkan data dalam tabel.

Namun, saya menemukan bahwa itu POINT(X,Y)juga berhasil. Saya tidak menemukan deskripsi mengapa GeomFromTextharus digunakan POINT.

Misalnya saya memiliki hubungan sederhana berikut:

CREATE TABLE Site (
    SiteID      BIGINT UNSIGNED,
    Position    POINT
);

Dan saya bisa memasukkan nilai menggunakan dua varian berikut:

INSERT INTO Site (
    1,
    GeomFromText( 'POINT(48.19976 16.45572)' )
);

INSERT INTO Site (
    2,
    POINT(48.19976, 16.45572)
);

Ketika saya melihat tabel ( SELECT * FROM Site) saya melihat gumpalan biner yang sama untuk lokasi, dan ketika saya melihat koordinat ( SELECT *, AsText(Position) FROM Site) saya juga melihat nilai yang sama.

Jadi mengapa GeomFromText harus digunakan? Apakah ada (diketahui) perbedaan kinerja antara kedua varian ini? Bagaimana ini diselesaikan di sistem basis data selain MySQL?

ComSubVie
sumber
Saya tidak tahu apakah ada perbedaan kinerja (saya rasa tidak, tapi itu hanya dugaan). Tetapi pendekatan kedua akan lebih sederhana ketika mengkonversi nilai lintang dan bujur dari tabel lain. INSERT INTO Site (Position) SELECT POINT(latitude, longitude) FROM tmplebih sederhana dari...SELECT GeomFromText(CONCAT('POINT(',latitude,' ',longitude,')' )) ...
ypercubeᵀᴹ
Saya juga menemukan varian kedua yang jauh lebih mudah dibangun, itu sebabnya saya bertanya-tanya bahwa biasanya yang pertama digunakan hampir di mana-mana di mana saya telah melihat ekstensi spasial MySQL digunakan.
ComSubVie
Saya baru saja mencoba memasukkan 10.000.000 lokasi dalam tabel di atas (pada host saya) menggunakan kedua varian dan tidak mendeteksi perbedaan kinerja yang dapat diukur.
ComSubVie
Silakan pertimbangkan untuk mengevaluasi kembali ini mengingat MySQL 8+ dan untuk anak cucu: dba.stackexchange.com/a/227049/2639
Evan Carroll

Jawaban:

16

Ada dua format biner berbeda terkait dengan ekstensi spasial MySQL, format "biner terkenal" (WKB) dari standar, dan GEOMETRYtipe data internal MySQL .

Sebelum ke MySQL 5.1.35, fungsi seperti POINT()tidak mengembalikan tipe data internal MySQL; mereka mengembalikan WKB ... jadi sebelum itu, Anda harus melakukan ini:

INSERT INTO t1 (pt_col) VALUES (GeomFromWKB(Point(1,2)));

Tapi sekarang, seperti dalam contoh Anda, ini berfungsi:

INSERT INTO t1 (pt_col) VALUES(Point(1,2));

Untuk kredit pengembang, ketika mereka berubah Point()dan fungsi yang serupa untuk (lebih waras) mengembalikan GEOMETRYobjek, mereka mengizinkan GeomFromWKB()dan fungsi serupa untuk benar-benar menerima data WKB atau MySQL Geometry sebagai input meskipun fungsi dimaksudkan untuk menerima WKB sebagai input.

Fakta bahwa metode 1 bekerja (meskipun secara teknis salah) pada server yang lebih baru dan metode 2 tidak bekerja sama sekali sebelum MySQL 5.1.35 mungkin menjelaskan mengapa contoh ditulis menggunakan pendekatan yang Anda lihat - untuk hindari masalah sepenuhnya. Kalau tidak ... Saya tidak punya apa-apa, di sini.

Menggabungkan dan kemudian mem-parsing teks tampaknya secara intuitif lebih lambat dan lebih rentan kesalahan daripada fungsi yang menerima variabel yang tepat sebagai input, jadi saya tidak bisa memikirkan alasan apa pun untuk membuat string gabungan dan menggunakan fungsi berbasis teks.

http://dev.mysql.com/doc/refman/5.1/en/creating-spatial-values.html#gis-wkb-functions

http://dev.mysql.com/doc/relnotes/mysql/5.1/en/news-5-1-35.html

Michael - sqlbot
sumber
1
Terima kasih, menarik bahwa ini hanya disebutkan sebagai "catatan kaki" dalam catatan rilis dan tidak ada dalam dokumentasi. Jadi saya akan tinggal jauh dari metode berbasis teks.
ComSubVie
1
Mengapa 5 tahun kemudian MySQL docs masih memberikan contoh penggunaan fungsi ST_GeomFromText () saat memasukkan? Apakah jawaban ini masih relevan? Agak membingungkan .. dev.mysql.com/doc/refman/5.7/en/populating-spatial-columns.html
Matt Kieran
1
@MattKieran WKB dan WKT adalah format standar dan terbuka untuk mengekspresikan data geospasial. Contoh-contoh menggunakannya karena aplikasi geospasial yang berorientasi standar mungkin sudah menyimpan data dalam format ini, memungkinkan MySQL untuk menerima geometri eksternal sebagai argumen tunggal ST_GeomFromText()dan fungsi konversi yang serupa daripada memerlukan aplikasi eksternal untuk menggunakan fungsi SQL asli yang membangun objek geometri, yang ditemukan dalam Referensi Fungsi Spasial . Dokumen dapat diatur dengan lebih baik.
Michael - sqlbot
Juga @MattKieran jawaban ini hanya masih relevan dalam arti bahwa itu menjelaskan mengapa contoh yang lebih lama dapat ditulis bertentangan dengan apa yang ditunjukkan oleh dokumen, alasan mengapa MySQL bekerja dengan ketidakcocokan tipe yang tampak jelas yang menggunakan fungsi dengan cara ini sepertinya mengindikasikan. Ketiga metode - fungsi SQL asli, WKB (biner), atau WKT (teks) - valid. Apa yang tidak diperlukan lagi adalah mengonversi nilai pengembalian fungsi asli dari WKB, karena jenis pengembaliannya tidak lagi WKB seperti tahun-tahun yang lalu.
Michael - sqlbot
4

MySQL 8+

Bagi anak cucu satu-satunya hal yang penting adalah itu

  • Point(X,Y)adalah konstruktor untuk angka-angka dengan presisi dan tidak memerlukan konversi terlebih dahulu ke teks sehingga lebih cepat. Ini juga dijamin akan KEMBALI POINTATAU GAGAL . Ini membuatnya sangat diketik jika Anda ingin memikirkannya seperti itu.
  • Konstruk teks Terkenal (WKT) : ini selalu lebih lambat, karena mereka memerlukan langkah tambahan untuk mem-parsing teks Terkenal (WKT) . Catatan dalam versi yang lebih lama ini dapat ditemukan tanpa ST_awalan; jika tersedia, gunakan versi dengan ST_awalan. Gunakan konstruktor WKT hanya jika input Anda sudah teks Terkenal. Jika tidak, gunakan Point(x,y)konstruktor di atas.
    • ST_GeomFromText(wkt, srid)dapat mengembalikan jenis spasial APAPUN yang didukung oleh MySQL dan dapat diwakili oleh WKT. Ini membuatnya diketik longgar jika Anda ingin memikirkannya seperti itu.
    • ST_PointFromText(wkt, srid)POINT-constructor yang sangat diketik dari teks terkenal.

Kejelasan

Melewatkan pelajaran sejarah, TIDAK PERNAH lakukan GeomFromText(Point(x,y)). Itu mengerikan, tidak didukung, dan tidak berdokumen.

Evan Carroll
sumber
-1

Dengan GeomFromText atau fungsi * FromText lainnya, Anda dapat menentukan SRID . Saya tidak berpikir Anda bisa melakukannya sebaliknya.

PointFromText('POINT(lat lng)', 4326)
fromvega
sumber
Ini harus menjadi POINT(lng lat)sebaliknya yaituPOINT(lat lng)
Zishan
MySQL tidak menggunakan SRID. Jadi itu tidak berguna. Jika Anda membutuhkan SRID, migrasi ke PostgreSQL / PostGIS.
Evan Carroll
1
MySQL 8 memang menggunakan SRID. Bahkan, saya mengalami masalah dengan DB MySQL bermigrasi dari 5,7 ke 8 justru karena SRID.
cmoran92