Retorna o n anel interior de um polígono como uma cadeia de linha. Os anéis não estão organizados por orientação geométrica. Estão organizados de acordo com as regras definidas pelas rotinas de verificação de geometria interna. Assim, não é possível predefinir a ordem dos anéis.
Sintaxe
ST_InteriorRingN(p ST_Polygon, n Integer)
Tipo de retorno
db2gse.ST_LineString
Exemplos
Um ornitologista, que está estudando a população de pássaros em várias ilhas marinhas do sul, sabe que a zona de alimentação de uma determinada espécie passiva restringe-se à costa. Algumas ilhas têm vários lagos. As praias dos lagos são habitadas exclusivamente por outras espécies mais agressivas. O ornitologista sabe que para cada ilha, se o perímetro do lago exceder um determinado limite, as espécies agressivas se tornarão mais numerosas e ameaçarão as espécies passivas do litoral. Portanto, ele solicita o perímetro agregado dos anéis internos das ilhas.
Na Figura 34, os anéis externos das ilhas representam a interface ecológica que cada ilha compartilha com o mar. Algumas ilhas têm lagos, que são representados pelos anéis interiores dos polígonos.
![]() |
As colunas ID e NAME da tabela ISLANDS identificam cada ilha, ao passo que a coluna polígono de terra armazena a geometria da ilha.
CREATE TABLE ISLANDS (id integer, name varchar(32), land db2gse.ST_Polygon);
O seguinte programa ODBC utiliza a função ST_InteriorRingN para extrair o anel interior (lago) de cada polígono da ilha como uma cadeia de linhas. O perímetro da cadeia de linhas que a função comprimento retorna é somado e exibido junto à ID da ilha.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "sg.h" #include "sgerr.h" #include "sqlcli1.h" /*** *** *** Altere estas constantes *** *** ***/ #define USER_NAME "sdetest" /* nome de usuário */ #define USER_PASS "acid.rain" /* sua senha de usuário */ #define DB_NAME "mydb" /* banco de dados ao qual se conectar */ static void check_sql_err (SQLHDBC handle, SQLHSTMT hstmt, LONG rc, CHAR *str); void main( argc, argv ) int argc; char *argv[]; { SQLHDBC handle; SQLHENV henv; CHAR sql_stmt[256]; LONG rc, total_perimeter, num_lakes, lake_number, island_id, lake_perimeter; SQLHSTMT island_cursor, lake_cursor; SDWORD pcbvalue, id_ind, lake_ind, length_ind; /* Alocar memória para a manipulação de ambiente ODBC henv e inicializar a aplicação. */ rc = SQLAllocEnv (&henv); if (rc != SQL_SUCCESS) { printf ("SQLAllocEnv failed with %d\n", rc); exit(0); } /* Alocar memória para o manipulador da conexão dentro do ambiente henv. */ rc = SQLAllocConnect (henv, &handle); if (rc != SQL_SUCCESS) { falha de printf ("SQLAllocConnect com %d\n", rc); exit(0); } /* Carregar o controlador ODBC e conectar-se à fonte de dados identificada pelo banco de dados, usuário e senha.*/ rc = SQLConnect (handle, (UCHAR *)DB_NAME, SQL_NTS, (UCHAR *)USER_NAME, SQL_NTS, (UCHAR *)USER_PASS, SQL_NTS); check_sql_err (handle, NULL, rc, "SQLConnect"); /* Alocar memória para a instrução SQL manipular island_cursor. */ rc = SQLAllocStmt (handle, &island_cursor); check_sql_err (handle, NULL, rc, "SQLAllocStmt"); /* Preparar e executar a consulta para obter as IDs e número da ilha de lagos (anéis interiores) */ strcpy (sql_stmt, "select id, db2gse.ST_NumInteriorRings(land) from ISLANDS"); rc = SQLExecDirect (island_cursor, (UCHAR *)sql_stmt, SQL_NTS); check_sql_err (NULL, island_cursor, rc, "SQLExecDirect"); /* Fazer o bind da coluna ID da tabela island à variável island_id */ rc = SQLBindCol (island_cursor, 1, SQL_C_SLONG, &island_id, 0, &id_ind); check_sql_err (NULL, island_cursor, rc, "SQLBindCol"); /* Fazer o bind do resultado de numinteriorrings(land) à variável num_lakes. */ rc = SQLBindCol (island_cursor, 2, SQL_C_SLONG, &num_lakes, 0, &lake_ind); check_sql_err (NULL, island_cursor, rc, "SQLBindCol"); /* Alocar memória para o manipulador da instrução SQL lago_cursor. */ rc = SQLAllocStmt (handle, &lake_cursor); check_sql_err (handle, NULL, rc, "SQLAllocStmt"); /* Preparar a consulta para obter o comprimento de um anel interior.*/ strcpy (sql_stmt, "select Length(db2gse.ST_InteriorRingN(land, cast (? as integer))) from ISLANDS where id = ?"); rc = SQLPrepare (lake_cursor, (UCHAR *)sql_stmt, SQL_NTS); check_sql_err (NULL, lake_cursor, rc, "SQLPrepare"); /* Fazer o bind da variável lake_number como primeiro parâmetro de entrada */ pcbvalue = 0; rc = SQLBindParameter (lake_cursor, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &lake_number, 0, &pcbvalue); check_sql_err (NULL, lake_cursor, rc, "SQLBindParameter"); /* Fazer o bind da id da ilha como segundo parâmetro de entrada */ pcbvalue = 0; rc = SQLBindParameter (lake_cursor, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &island_id, 0, &pcbvalue); check_sql_err (NULL, lake_cursor, rc, "SQLBindParameter"); /* Fazer o bind do resultado de Length(db2gse.ST_InteriorRingN(land, cast (? como inteiro ))) à variável lake_perimeter */ rc = SQLBindCol (lake_cursor, 1, SQL_C_SLONG, &lake_perimeter, 0, &length_ind); check_sql_err (NULL, island_cursor, rc, "SQLBindCol"); /* Loop externo, obter as ids da ilha e número de lagos (anéis interiores) */ while (SQL_SUCCESS == rc) { /* Buscar uma ilha */ rc = SQLFetch (island_cursor); if (rc != SQL_NO_DATA) { check_sql_err (NULL, island_cursor, rc, "SQLFetch"); /* Loop interno, desta ilha, obter o perímetro de todos os seus lagos (anéis internos) */ para (perímetro_total = 0,lake_number = 1; lake_number <= num_lakes; lake_number++) { rc = SQLExecute (lake_cursor); check_sql_err (NULL, lake_cursor, rc, "SQLExecute"); rc = SQLFetch (lake_cursor); check_sql_err (NULL, lake_cursor, rc, "SQLFetch"); total_perimeter += lake_perimeter; SQLFreeStmt (lake_cursor, SQL_CLOSE); } } /* Exibir a id da ilha e o perímetro total de seus lagos. */ printf ("Island ID = %d, Total lake perimeter = %d\n", island_id,total_perimeter); } SQLFreeStmt (lake_cursor, SQL_DROP); SQLFreeStmt (island_cursor, SQL_DROP); SQLDisconnect (handle); SQLFreeConnect (handle); SQLFreeEnv (henv); printf( "\nTest Complete ...\n" ); } static void check_sql_err (SQLHDBC handle, SQLHSTMT hstmt, LONG rc, CHAR *str) { SDWORD dbms_err = 0; SWORD length; UCHAR err_msg[SQL_MAX_MESSAGE_LENGTH], state[6]; if (rc != SQL_SUCCESS) { SQLError (SQL_NULL_HENV, handle, hstmt, state, &dbms_err, err_msg, SQL_MAX_MESSAGE_LENGTH - 1, &length); printf ("%s ERROR (%d): DBMS code:%d, SQL state: %s, message: \n %s\n", str, rc, dbms_err, state, err_msg); if (handle) { SQLDisconnect (handle); SQLFreeConnect (handle); } exit(1); } }