CÓMO

Insertar geometría desde coordenadas x,y mediante SQL

Last Published: April 25, 2020

Resumen

En algunos casos, puede ser necesario insertar geometrías en una clase de entidad mediante Lenguaje Estructurado de Consultas (SQL). Para ello, se puede utilizar un bucle o un cursor de base de datos en SQL. En ocasiones, debido al rendimiento, los recursos o los flujos de trabajo, es preferible crear datos a través de SQL que crear los datos en ArcMap.

-- Obtener el número de filas en la tabla de bucles
DECLARE @RowCount INT
SET @RowCount = (SELECT COUNT(*) FROM sde.INPUT_TABLE)
-- Declarar un iterador
DECLARE @iterator INT
-- Inicializar el iterador
SELECT @iterator = MIN(OBJECTID) FROM SDE.INPUT_TABLE
-- Recorrer las filas de una tabla @myTable
WHILE @iterator is NOT NULL
BEGIN
DECLARE @id as integer
EXEC sde.next_rowid 'sde', 'points', @id OUTPUT;
INSERT INTO sde.POINTS (OBJECTID, Shape)
SELECT
@id,
geometry::STPointFromText('POINT('+str(POINT_X, 38, 8) + ' ' + str(POINT_Y, 38, 8) + ')', 2286) as SHAPE
FROM sde.INPUT_TABLE where objectid = @iterator;

SELECT @iterator= MIN(OBJECTID) FROM SDE.INPUT_TABLE WHERE @iterator < @RowCount
END

Procedimiento

En el ejemplo siguiente, se inserta una geometría de puntos en una clase de entidad desde una tabla de base de datos existente.

  1. Cree una clase de entidad de punto vacía en ArcMap utilizando uno de los siguientes tipos espaciales.

    SQL Server:
    Geometría

    Oracle:
    ST_Geometry
    SDO_Geometry
  2. En una aplicación de SQL Server, cree un cursor o un bucle para iterar por la tabla de base de datos de entrada. Cree una geometría para cada fila.
Nota:
Este procedimiento funciona mejor si hay una columna de identificador único en la tabla de base de datos de entrada, como un campo rownum o OID en SQL Server. De este modo, se asegura que el bucle WHILE no se salte ninguna fila que no sea única.
Nota:
Para insertar datos en una clase de entidad registrada, se debe especificar un valor no nulo único para la columna ObjectID. Para ello, se debe usar el procedimiento Next_RowID.
Muestra de SQL Server Geometry:
-- Obtener el número de filas en la tabla de bucles
DECLARE @RowCount INT
SET @RowCount = (SELECT COUNT(*)FROM sde.INPUT_TABLE)
-- Declarar un iterador
DECLARE @iterator INT
-- Inicializar el iterador
SELECT @iterator = MIN(OBJECTID) FROM SDE.INPUT_TABLE
-- Recorrer las filas de una tabla
WHILE @iterator is NOT NULL
BEGIN
DECLARE @id as integer
EXEC sde.next_rowid 'sde', 'points', @id OUTPUT;
INSERT INTO sde.POINTS (OBJECTID, Shape)
SELECT @id,
geometry::STPointFromText(
'POINT('+str(POINT_X, 38, 8) + ' ' + str(POINT_Y, 38, 8) + ')', 2286) as SHAPE
FROM sde.INPUT_TABLE where objectid = @iterator;

SELECT @iterator= MIN(OBJECTID) FROM SDE.INPUT_TABLE WHERE @iterator < @RowCount
END
Muestra de Oracle SDO Geometry:
SET SERVEROUTPUT ON

-- Declarar un cursor
DECLARE
CURSOR points is
select *
from sde.input_table;

-- Recorrer el cursor
BEGIN
FOR pt IN points LOOP
INSERT INTO SDE.POINTS (OBJECTID, SHAPE) VALUES (
sde.gdb_util.next_rowid('sde', 'points'),
MDSYS.SDO_GEOMETRY(2001,2286,MDSYS.SDO_POINT_TYPE(pt.point_x, pt.point_y,NULL),NULL,NULL)
);
END LOOP;
COMMIT;
END;
/
Muestra de Oracle ST Geometry:
SET SERVEROUTPUT ON

-- Declarar un cursor
DECLARE
CURSOR points is
select *
from sde.input_table;

-- Recorrer el cursor
BEGIN
FOR pt IN points LOOP
INSERT INTO SDE.POINTS (OBJECTID, SHAPE) VALUES (
sde.gdb_util.next_rowid('sde', 'points'),
sde.ST_Point(pt.point_x,pt.point_y, 2286)
);
END LOOP;
COMMIT;
END;
/

Id. de artículo:000012317

Obtener ayuda de expertos en ArcGIS

Contactar con soporte técnico

Descargar la aplicación de soporte de Esri

Ir a las opciones de descarga

Información relacionada

Descubrir más sobre este tema