A geografia do PostGIS é do tipo EPSG: 4326?

8

Fiquei com a impressão de que o tipo de geografia usa apenas as coordenadas lat e longas EPSG:4326. E não me lembrava de ter que especificar um CRS para uma geographycoluna.

No entanto, a partir deste exemplo ilimitado :

SELECT * FROM geography_columns;

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

Pode ter outros SRIDs, 0como mostrado acima.

O geographytipo usa 4326apenas?

tinlyx
fonte
1
Um SRID de 0 também é atribuído quando você não atribui um especificamente. Lembro-me de um debate entre os desenvolvedores do Postgis sobre se um SRID ausente deveria ser relatado como -1 ou 0. Eu era a favor de -1, 0 foi escolhido. Se você observar a definição da visualização geometry_columns, descobrirá uma função typemod_get_srid, que parece ser a culpada, consulte `#define TYPMOD_SET_SRID (typmod, srid) ((typmod) = (((typmod) & 0xE00000FF) | ( (srid & 0x001FFFFF) << 8)) ``
John Powell

Respostas:

7

Baseado no site PostGIS , 4326costumava ser o único CRS suportado para tipos geográficos, mas não mais:

Antes do PostGIS 2.2, o tipo de região suportava apenas WGS 84 long lat (SRID: 4326). Para o PostGIS 2.2 e superior, qualquer sistema de referência espacial baseado em long / lat definido na tabela spatial_ref_sys pode ser usado. Você pode até adicionar seu próprio sistema de referência espacial esferoidal personalizado, conforme descrito no tipo de geografia, não está limitado à terra.

laser
fonte
5

Embora o que o laser diga seja verdadeiro, acredito que o motivo do SRID aparecer como 0 é devido a uma decisão tomada pelos desenvolvedores do Postgis de que um SRID indefinido deve ser relatado como 0 - houve um debate no qual -1 também foi sugerido. (Eu sei disso porque participei do referido debate sobre o IRC e favoreci -1, pois acho que é obviamente mais indefinido que 0).

Se você observar a definição da visualização 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);

você verá uma referência a uma função postgis_typmod_srid. Após a toca do coelho, você encontrará a função definida aqui como:

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

É fácil confirmar isso criando uma coluna de geografia e examinando geography_columns. Como você também pode criar uma coluna de geometria com qualquer esferóide personalizado, parece um pouco inútil permitir essa funcionalidade no tipo de geografia, dada a prevalência do WGS84.

`

John Powell
fonte