HOW TO

Einfügen der Geometrie aus XY-Koordinaten unter Verwendung von SQL

Last Published: April 25, 2020

Zusammenfassung

In manchen Fällen kann es notwendig sein, einer Feature-Class unter Verwendung der strukturierten Abfragesprache SQL Geometrien hinzuzufügen. Dies ist mithilfe einer Schleife oder eines Datenbank-Cursors in SQL möglich. In bestimmten Fällen empfiehlt es sich wegen der Leistung, Ressourcen oder Workflows eher, Daten über SQL zu erstellen als in ArcMap.

-- Get the number of rows in the looping table
DECLARE @RowCount INT
SET @RowCount = (SELECT COUNT(*) FROM sde.INPUT_TABLE)
-- Declare an iterator
DECLARE @iterator INT
-- Initialize the iterator
SELECT @iterator = MIN(OBJECTID) FROM SDE.INPUT_TABLE
-- Loop through the rows of a table @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

Vorgehensweise

Im folgenden Beispiel, werden einer Feature-Class Punktgeometrien aus einer vorhandenen Datenbanktabelle hinzugefügt.

  1. Erstellen Sie in ArcMap eine leere Point-Feature-Class, wobei Sie einen der folgenden räumlichen Datentypen verwenden.

    SQL Server:
    Geometry

    Oracle:
    ST_Geometry
    SDO_Geometry
  2. Erstellen Sie in einer SQL Server-Anwendung einen Cursor oder eine Schleife, um die Eingabedatenbanktabelle zu durchlaufen. Erstellen Sie für jede Zeile eine Geometrie.
Hinweis:
Dieses Verfahren funktioniert am besten, wenn die Eingabedatenbanktabelle eine Spalte für eine eindeutige ID wie beispielsweise das Feld "rownum" oder "OID" in SQL Server enthält. Hierdurch wird sichergestellt, dass mit der WHILE-Schleife keine Zeile ausgelassen wird, die nicht eindeutig ist.
Hinweis:
Um einer registrierten Feature-Class Daten hinzuzufügen, muss für die ObjectID-Spalte ein eindeutiger Wert angegeben werden, bei dem es sich nicht um einen NULL-Wert handelt. Hierzu muss die Prozedur Next_RowID verwendet werden.
SQL Server-Geometrie-Beispiel:
-- Get the number of rows in the looping table
DECLARE @RowCount INT
SET @RowCount = (SELECT COUNT(*)FROM sde.INPUT_TABLE)
-- Declare an iterator
DECLARE @iterator INT
-- Initialize the iterator
SELECT @iterator = MIN(OBJECTID) FROM SDE.INPUT_TABLE
-- Loop through the rows of a table
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
Oracle SDO Geometry-Beispiel:
SET SERVEROUTPUT ON

-- Declare a cursor
DECLARE
CURSOR points is
select *
from sde.input_table;

--Loop through the 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;
/
Oracle ST Geometry-Beispiel:
SET SERVEROUTPUT ON

-- Declare a cursor
DECLARE
CURSOR points is
select *
from sde.input_table;

--Loop through the 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;
/

Artikel-ID:000012317

Hilfe von ArcGIS-Expert*innen erhalten

Technischen Support kontaktieren

Die Esri Support-App herunterladen

Zu den Download-Optionen

Zugehörige Informationen

Weitere Informationen zu diesem Thema erkunden