Saya memiliki tabel PostGIS dengan dua kolom geometri, keduanya didefinisikan dengan SRID 4326. Saya dapat menyisipkan ke dalam tabel tanpa masalah, menggunakan INSERT
pernyataan berikut (di mana lng
dan lat
nilai-nilai diteruskan secara terprogram):
INSERT INTO pad_meta (
uuid, created, updated, name, origin, radius, area, expiry, creator
) VALUES (
$1, now(), now(), $2, ST_GeomFromText('POINT(lng, lat)', 4326), $3,
ST_Buffer(ST_GeomFromText('POINT(lng, lat)', 4326), $4), $5, $6
)
Tetapi ketika saya meminta persimpangan dengan menggunakan ST_Intersects, tergantung pada nilai titik yang saya dapatkan ERROR: Operation on mixed SRID geometries
.
Misalnya, kueri ini berfungsi:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 46.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
Dan ini salah:
SELECT * FROM pad_meta where ST_Intersects(
'POINT(-122.334172173172 47.602634395263560)'::geometry, area::geometry
) ORDER BY created DESC;
Catatan, mereka adalah query yang identik kecuali nilai bujur. Saya telah bereksperimen dengan nilai yang berbeda, tetapi tidak mengidentifikasi titik transisi yang jelas antara kueri yang berfungsi dan tidak.
Saya pikir saya pada dasarnya salah paham tentang sesuatu. Untuk saat ini, saya telah memecahkan / memperbaiki / mengatasi masalah dengan memformat ulang kueri untuk digunakan ST_GeomFromText
dan secara spesifik menentukan SRID:
SELECT * FROM pad_meta where ST_Intersects(
ST_GeomFromText('POINT(-122.334172173172 47.602634395263560)', 4326), area
) ORDER BY created DESC;
Tapi sejujurnya saya tidak begitu mengerti apa perbedaannya, atau apakah ini benar-benar solusi.
Pertanyaan saya adalah: Mengapa saya mendapatkan kesalahan hanya untuk nilai tertentu, dan apa cara yang tepat untuk memformat kueri ini?
Berikut ini adalah definisi tabel saya untuk referensi:
CREATE TABLE IF NOT EXISTS pad_meta (
uuid CHAR(32),
created TIMESTAMP,
updated TIMESTAMP,
name VARCHAR(128),
origin GEOMETRY(Point, 4326),
radius INTEGER,
area GEOMETRY(Polygon, 4326),
expiry TIMESTAMP,
creator CHAR(32),
PRIMARY KEY (uuid)
);
Saya juga telah memverifikasi bahwa hanya ada satu jenis SRID di geometry_columns:
SELECT f_table_name, f_geometry_column, srid FROM geometry_columns;
f_table_name | f_geometry_column | srid
--------------+-------------------+------
pad_meta | origin | 4326
pad_meta | area | 4326
Bantuan / saran dihargai. Terima kasih! (Catatan: Saya juga telah melihat pertanyaan ini , tetapi karena saya sudah secara eksplisit mendefinisikan SRID geometri saya ketika memasukkan ke dalam tabel, sepertinya bukan itu yang terjadi.)
SRID=4326
(seperti yang Anda lakukan di atas) cara yang tepat untuk mengatur SRID untuk sisa pernyataan? (sebagai lawan menggunakanST_GeomFromText
hanya karena saya tidak tahu bagaimana lagi menentukan SRID ...?) apakah ada cara untuk menetapkan SRID default untuk permintaan? Tampaknya agak verbose untuk secara eksplisit mengaturnya setiap kali. sekali lagi terima kasih!geography
tipe, yang selalu 4326. Juga, ada beberapa cara untuk menentukan SRID.Beberapa pengamatan yang dapat membantu: Satu,
Point(Double, Double)
adalah fungsi asli PostgreSQL yang Anda paksakan untuk tipe data PostGIS.ST_MakePoint(double x, double y)
akan membuat geometri yang tepat. Juga, dalam pertanyaan Anda, Anda sepertinya merujuk pada argumen kedua sebagai bujur. Urutan yang tepat adalahx, y
, yang sesuai denganLongitude, Latitude
. Membalikkannya dapat mengembalikan hasil yang tidak terduga tanpa membuang pengecualian.Tidak satu pun dari ini yang benar-benar menjelaskan mengapa contoh pertama Anda kadang-kadang berfungsi dan bukan yang lain, tetapi mudah-mudahan ini akan membantu Anda membuat kueri yang bagus.
sumber