Apakah tipe geografi PostGIS hanya EPSG: 4326?

8

Saya mendapat kesan bahwa tipe geografi hanya menggunakan koordinat lat, long-based EPSG:4326. Dan saya tidak ingat harus menentukan CRS untuk geographykolom.

Namun, dari contoh tak terbatas ini :

SELECT * FROM geography_columns;

          f_table_name    | f_geography_column | srid |   type
--------------------------+--------------------+------+----------
 nyc_subway_stations_geog | geog               |    0 | Geometry
 airports                 | geog               | 4326 | Point

Itu dapat memiliki yang lain SRIDseperti yang 0ditunjukkan di atas.

Apakah geographytipe 4326hanya digunakan ?

tinlyx
sumber
1
SRID 0 juga ditetapkan saat Anda tidak secara khusus menetapkan satu. Saya ingat perdebatan di antara para pengembang Postgis tentang apakah SRID yang hilang harus dilaporkan sebagai -1 atau 0. Saya mendukung -1, 0 dipilih. Jika Anda melihat definisi tampilan geometry_columns, Anda akan menemukan sebuah fungsi, typemod_get_srid, yang tampaknya merupakan biang keladinya, lihat `#define TYPMOD_SET_SRID (typmod, srid) ((typmod) = ((typmod) = ((typmod) & 0xE00000FF) | ( (srid & 0x001FFFFF) << 8))) `
John Powell

Jawaban:

7

Berdasarkan situs web PostGIS , 4326dulunya satu-satunya CRS yang didukung untuk tipe geografi, tetapi tidak lagi:

Sebelum PostGIS 2.2, tipe geografi hanya mendukung panjang WGS 84 (SRID: 4326). Untuk PostGIS 2.2 dan di atasnya, sistem referensi spasial panjang / lat berbasis apa pun yang didefinisikan dalam tabel spatial_ref_sys dapat digunakan. Anda bahkan dapat menambahkan sistem refensi spasial spheroidal kustom Anda sendiri seperti yang dijelaskan dalam tipe geografi tidak terbatas pada bumi.

laser
sumber
5

Sementara apa yang dikatakan laser itu benar, saya percaya alasan SRID muncul sebagai 0 adalah karena keputusan yang dibuat oleh pengembang Postgis bahwa SRID yang tidak didefinisikan harus dilaporkan sebagai 0 - ada perdebatan, di mana -1 juga disarankan. (Saya tahu ini karena saya ambil bagian dalam debat tentang IRC, dan disukai -1, karena menurutnya lebih jelas tidak terdefinisi daripada 0).

Jika Anda melihat definisi tampilan geography_columns,

\df+ geography_columns

SELECT current_database() AS f_table_catalog,
  n.nspname AS f_table_schema,
  c.relname AS f_table_name,
  a.attname AS f_geography_column,
  postgis_typmod_dims(a.atttypmod) AS coord_dimension,
  postgis_typmod_srid(a.atttypmod) AS srid,
  postgis_typmod_type(a.atttypmod) AS type
FROM pg_class c,
  pg_attribute a,
  pg_type t,
  pg_namespace n
WHERE t.typname = 'geography'::name AND a.attisdropped = false AND a.atttypid = t.oid AND a.attrelid = c.oid AND c.relnamespace = n.oid AND NOT pg_is_other_temp_schema(c.relnamespace) AND has_table_privilege(c.oid, 'SELECT'::text);

Anda akan melihat refence ke fungsi postgis_typmod_srid. Setelah lubang kelinci itu, Anda akan menemukan fungsi yang didefinisikan di sini sebagai:

#define TYPMOD_SET_SRID(typmod, srid) ((typmod) = (((typmod) & 0xE00000FF) | ((srid & 0x001FFFFF)<<8))).

Cukup mudah untuk mengonfirmasi ini dengan membuat kolom geografi dan kemudian melihat geography_columns. Mengingat bahwa Anda juga dapat membuat kolom geometri dengan spheroid khusus, sepertinya tidak ada gunanya untuk mengizinkan fungsi ini dalam tipe geografi, mengingat prevalensi WGS84.

`

John Powell
sumber