Question

J'ai le tableau simple suivant:

CREATE TABLE tbl_test
(
  id serial NOT NULL,
  poly polygon NOT NULL
)
WITH (OIDS=FALSE);

J'essaie ensuite d'insérer une ligne avec un polygone:

insert into tbl_test values(1, PolyFromText('POLYGON((0 0, 10 10, 10 0, 0 0))'))

Et rencontrez cette erreur:

  

colonne "poly" est de type polygone mais l'expression est de type géométrie

Qui est boiteux. Donc ma première question est:

  1. Dois-je vraiment lancer?

Quoi qu’il en soit, après le casting, cela fonctionne. Et maintenant j'essaye de faire une simple requête ST_Contains:

select id, poly from tbl_test where ST_Contains(poly, Point(GeomFromText('POINT(9 2)')))

Ce qui donne l'erreur:

ERROR:  function st_contains(polygon, point) does not exist
LINE 1: select id, poly from tbl_test where ST_Contains(poly, Point(...
                                            ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

Qu'est-ce que je suis censé faire?

Les travaux suivants:

select st_contains(st_geomfromtext('POLYGON((0 0, 10 10, 10 0, 0 0))'), st_geomfromtext('POINT(0 0)'))

Mais c'est probablement parce que les deux arguments sont de type Geometry. La requête sur les données de la table ne fonctionne pas.

Réponse:

Doi! Le problème était que la base de données que j'ai créée n'était pas basée sur la base de données template postgis (et ne comportait donc pas les fonctions et les tables de colonnes de géométrie appropriées, etc.). Pour conclure, permettez-moi de remarquer que la façon dont PostGIS vous oblige à ajouter des centaines de fonctions, de lignes et de quelques tables à votre base de données pour bénéficier du support SIG est totalement boiteuse. Cela rend la sauvegarde du schéma beaucoup plus complexe et est très sujette aux erreurs (Dieu nous en préserve si vous oubliez d'appeler AddGeometryColumn et ajoutez simplement une colonne de géométrie).

Était-ce utile?

La solution

Le polygone est un type fondamental de Postgres sur lequel PostGIS repose. Vous activez les colonnes de géométrie avec la fonction PostGIS , sélectionnez AddGeometryColumn (...) . Sinon, vous travaillez avec des polygones droits:

=> create table gt (id int, space polygon);
=> insert into gt values (1, '((2,2),(3,4),(3,6),(1,1))');
INSERT 0 1
=> select point(space) from gt where id = 1;
    point    
-------------
 (2.25,3.25)
(1 row)

C’est le centre du polygone

=> select circle(space) from gt where id = 1;
             circle             
--------------------------------
 <(2.25,3.25),1.93994028704315>
(1 row)

Il s'agit du cercle englobant minimal du polygone, exprimé sous la forme d'un type Postgres circle . Tous les opérateurs géométriques sont documentés ici: http://www.postgresql.org /docs/8.3/interactive/functions-geometry.html Le polygone de base ne contient aucune donnée de projection, SRID, etc. Ainsi, s'il fonctionne avec PostGIS, il ne fait probablement que remplacer les paramètres prédéfinis et avoir de la chance. Mais bien sûr, il existe des tonnes de cas où vous avez simplement besoin de géométrie à une échelle sous-géospatiale.

Autres conseils

Ok, bizarre, j'ai découvert les syntaxes beaucoup plus simples suivantes:

insert into tbl_test (poly) values ('(0,0),(0,10),(10, 10), (0, 0)')

select * from tbl_test where poly @> '(2, 8)'

Mais j’ai du mal à comprendre la différence entre ces ensembles de fonctions et d’opérateurs. Cette syntaxe plus courte (qui n’est pas vraiment compatible OpenGIS) tire-t-elle parti des mêmes index spatiaux, etc.?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top