Consulta SQL para ponto-em-polígono usando PostgreSQL
Eu tenho a seguinte tabela simples:
<code>CREATE TABLE tbl_test ( id serial NOT NULL, poly polygon NOT NULL ) WITH (OIDS=FALSE); </code>
Eu então tento inserir uma linha com um polígono:
<code>insert into tbl_test values(1, PolyFromText('POLYGON((0 0, 10 10, 10 0, 0 0))')) </code>
E corra para este erro:
coluna "poli" é do tipo polígono mas a expressão é do tipo geometria
Que é coxo Então minhas primeiras perguntas são:
Eu realmente tenho que lançar?De qualquer forma, depois de lançá-lo funciona. E agora estou tentando fazer uma consulta ST_Contains simples:
<code>select id, poly from tbl_test where ST_Contains(poly, Point(GeomFromText('POINT(9 2)'))) </code>
Qual dá o erro:
<code>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. </code>
O que eu deveria fazer?
Os seguintes trabalhos:
<code>select st_contains(st_geomfromtext('POLYGON((0 0, 10 10, 10 0, 0 0))'), st_geomfromtext('POINT(0 0)')) </code>
Mas isso é provavelmente porque ambos os argumentos são do tipo Geometry. A consulta real nos dados da tabela não funciona.
Responda:
Doi! O problema era que o banco de dados que eu criei não se baseava no template DB postgis (e por isso não tinha as funções relevantes e tabelas de colunas de geometria, etc.). Posso apenas observar, em conclusão, que a forma como o PostGIS requer que você adicione centenas de funções, linhas e algumas tabelas ao seu banco de dados apenas para que você tenha suporte ao GIS é completamente idiota. Isso torna o backup do esquema muito mais complexo e é muito propenso a erros (que o céu proíba se você deixar de chamar AddGeometryColumn e apenas adicione uma coluna de geometria).