Определение
ST_Transform берет в качестве входных данные ST_Geometry и возвращает значения, конвертированные в пространственную привязку, указанную вами через ID пространственной привязки (SRID).
Если географические системы координат отличаются, ST_Transform выполняет географическое преобразование. Географическое преобразование конвертирует две географические системы координат. Географическое преобразование определяется в конкретном направлении, например, из NAD 1927 в NAD 1983, но функция ST_Transform правильно применит преобразование независимо от исходной и целевой систем координат.
Методы географического преобразования можно разделить на два типа: математические и файловые. Математические методы являются самодостаточными, и им не требуется внешняя информация. Файловые методы используют файлы на диске для расчета значений смещения. Обычно они более точны, чем математические методы. Файловые методы используются в Австралии, Канаде, Германии, Новой Зеландии, Испании и США. Эти файлы (кроме канадских) можно найти получить из папки установки ArcGIS Desktop или напрямую от различных национальных картографических агентств.
Для поддержки преобразований на основе файлов, необходимо разместить файлы на сервере базы данных в той же относительной структуре папок, что и у папки pedata в директории установки ArcGIS Desktop или ArcGIS Pro.
Например, существует папка с названием pedata в директории установки ArcMap и в папке Resources директории установки ArcGIS Pro. Эта папка pedata включает в себя несколько папок, а три папки, которые содержат поддерживаемые файловые методы, называются harn, nadcon и ntv2. Либо скопируйте папку pedata и ее содержание из директории установки ArcGIS на сервер базы данных, или создайте директорию на сервере базы данных, которая включает в себя поддиректории и файлы поддерживаемого файлового метода преобразования. После того, как файлы окажутся на сервере базы данных, задайте переменную среды операционной системы с именем PEDATAHOME на том же сервере. Установите переменную PEDATAHOME в местоположение директории, которая содержит поддиректории и файлы; например, если папка pedata скопирована в C:\pedata на сервере Microsoft Windows, то установите для переменной среды PEDATAHOME значение C:\pedata.
Сведения об установке переменных среды см. в документации по операционной системе.
После установки переменной PEDATAHOME необходимо инициировать новый сеанс SQL перед использованием функции ST_Transform; перезагружать сервер не нужно.
Использование ST_Transform в PostgreSQL
В PostgreSQL можно выполнять конвертацию между пространственными привязками с одинаковыми или разными географическими системами координат.
Если данные хранятся в базе данных (а не в базе геоданных), выполните следующие шаги для изменения пространственной привязки данных ST_Geometry в случае одинаковой географической системы координат:
- Создайте резервную копию таблицы.
- Создайте второй (целевой) столбец ST_Geometry в таблице.
- Зарегистрируйте целевой столбец ST_Geometry, указывая новый SRID.
Указание пространственной привязки для столбца выполняется размещением записи в системной таблице sde_geometry_columns.
- Выполните ST_Transform. Укажите, что преобразованные данные будут отсылаться в целевой столбец ST_Geometry.
- Отмените регистрацию первого столбца (исходного) ST_Geometry.
Если данные хранятся в базе геоданных, вы должны использовать инструменты ArcGIS, чтобы перепроецировать данные в новый класс пространственных объектов. Выполнение ST_Transform у класса пространственных объектов базы геоданных позволяет обойти использование функциональности для обновления системных таблиц базы геоданных с новым SRID.
Использование ST_Transform в Oracle
В Oracle можно выполнять конвертацию между пространственными привязками с одинаковыми или разными географическими системами координат.
Если данные хранятся в базе данных (а не в базе геоданных), и пространственный индекс в пространственном столбце не определен, то вы можете добавить второй столбец ST_Geometry и направить преобразованные данные в него. Вы можете оставить оба столбца, исходный (источника) ST_Geometry и целевой ST_Geometry в таблице. Однако вы можете отображать только один столбец в ArcGIS, используя представление или изменяя определение слоя запроса для таблицы.
Если данные хранятся в базе данных (а не в базе геоданных), и в пространственном столбце имеется определенной пространственный индекс, то вы не сможете защитить исходный столбец ST_Geometry. После определения пространственного индекса в столбце ST_Geometry в таблицу метаданных st_geometry_columns записывается SRID. ST_Transform не обновляет эту таблицу.
- Создайте резервную копию таблицы.
- Создайте второй (целевой) столбец ST_Geometry в таблице.
- Выполните ST_Transform. Укажите, что преобразованные данные будут отсылаться в целевой столбец ST_Geometry.
- Удалите пространственный индекс из исходного столбца ST_Geometry.
- Удалите исходный столбец ST_Geometry.
- Создайте пространственный индекс в целевом столбце ST_Geometry.
Если данные хранятся в базе геоданных, вы должны использовать инструменты ArcGIS, чтобы перепроецировать данные в новый класс пространственных объектов. Выполнение ST_Transform у класса пространственных объектов базы геоданных позволяет обойти использование функциональности для обновления системных таблиц базы геоданных с новым SRID.
Использование ST_Transform в SQLite
В SQLite можно выполнять конвертацию между пространственными привязками с одинаковыми или разными географическими системами координат.
Синтаксис
Исходная и целевая пространственные привязки не имеют единой географической системы координат
Oracle и PostgreSQL
sde.st_transform (geometry1 sde.st_geometry, srid integer)
SQLite
st_transform (geometry1 geometryblob, srid in32)
Исходная и целевая пространственные привязки не имеют единой географической системы координат
Oracle
sde.st_transform (g1 sde.st_geometry, srid integer, geogtrans_id integer)
PostgreSQL
Опция 1: sde.st_transform (g1 sde.st_geometry, srid int)
Опция 2: sde.st_transform (g1 sde.st_geometry, srid int, [geogtrans_id int])
Опция 3: sde.st_transform (g1 sde.st_geometry, srid int, [extent double] [prime meridian double] [unit conversion factor double])
В опции 3 дополнительно можно указать экстент в виде списка координат, разделенных запятыми, в следующем порядке: левая нижняя x-координата, левая нижняя y-координата, верхняя правая x-координата, верхняя правая y-координата. Если вы не укажете экстент, ST_Transform использует больший, более общий экстент.
Если экстент задан, параметры начального меридиана и коэффициент преобразования единиц измерения являются дополнительными. Эту информацию необходимо предоставить, только если указанные значения экстента не используют Гринвичский начальный меридиан или десятичные градусы.
Список других начальных меридианов смотрите в Реестре геодезических параметров EPSG.
SQLite
st_transform (geometry1 geometryblob, srid int32, geogtrans_id int32)
Тип возвращаемого значения
Oracle и PostgreSQL
ST_Geometry
SQLite
Geometryblob
Примеры
Преобразование данных, когда географические системы координат пространственных привязок источника и назначения совпадают
В следующем примере создается таблица transform_test с двумя строковыми столбцами: ln1 и ln2. Линия вставляется в ln1 с SRID 4326. Далее в выражении UPDATE используется функция ST_Transform, которая преобразует строчное значение столбца ln1 из координатной привязки, назначенной SRID 4326, в координатную привязку, назначенную SRID 3857, и помещает его в столбец ln2.
Oracle
CREATE TABLE transform_test (
ln1 sde.st_geometry,
ln2 sde.st_geometry);
INSERT INTO transform_test (ln1) VALUES (
sde.st_geometry ('linestring (10.01 40.03, 92.32 29.39)', 4326)
);
UPDATE transform_test
SET ln2 = sde.st_transform (ln1, 3857);
PostgreSQL
CREATE TABLE transform_test (
ln1 sde.st_geometry,
ln2 sde.st_geometry);
INSERT INTO transform_test (ln1) VALUES (
sde.st_geometry ('linestring (10.01 40.03, 92.32 29.39)', 4326)
);
UPDATE transform_test
SET ln2 = sde.st_transform (ln1, 3857);
SQLite
CREATE TABLE transform_test (id integer);
SELECT AddGeometryColumn(
NULL,
'transform_test',
'ln1',
4326,
'linestring',
'xy',
'null'
);
INSERT INTO transform_test (ln1) VALUES (
st_geometry ('linestring (10.01 40.03, 92.32 29.39)', 4326)
);
UPDATE transform_test
SET ln1 = st_transform (ln1, 3857);
Преобразование данных, когда географические системы координат пространственных привязок источника и назначения не совпадают
В следующем примере создается таблица n27, содержащая столбец ID и столбец геометрии. В таблицу n27 с SRID 4267 вставляется точка. SRID 4267 использует географическую систему координат NAD 1927.
Далее создается таблица n83, и функция ST_Transform вставляет геометрию из таблицы n27 в таблицу n83, но уже с SRID равным 4269 и ID географического преобразования равным 1241. SRID 4269 использует географическую систему координат NAD 1983, а 1241 – стандартный ID для преобразования NAD_1927_To_NAD_1983_NADCON. Это файловое преобразование, и его можно использовать для 48 континентальных штатов США.
Oracle
--Create table.
CREATE TABLE n27 (
id integer,
geometry sde.st_geometry
);
--Insert point with SRID 4267.
INSERT INTO N27 (id, geometry) VALUES (
1,
sde.st_geometry ('point (-123.0 49.0)', 4267)
);
--Create the n83 table as the destination table of the transformation.
CREATE TABLE n83 (
id integer,
geometry sde.st_geometry
);
--Run the transformation.
INSERT INTO N83 (id, geometry)(
select c.id, sde.st_transform (c.geometry, 4269, 1241)
from N27 c
);
Если переменная PEDATAHOME задана правильно, выражение SELECT, выполняемое для таблицы n83, возвращает следующее:
SELECT id, sde.st_astext (geometry) description
FROM N83;
ID DESCRIPTION
1 | POINT((-123.00130569 48.999828199))
PostgreSQL
--Option 1
--Gets geographic transformation from ST_Geometry libraries.
--Does not require you to provide a GTid.
--Performs an equation-based transformation between two geographic coordinate systems
--with different datums. (SRID 4267/DATUM NAD27 to SRID 4269/DATUM NAD 83)
--Provide point to transform.
SELECT sde.ST_AsText(sde.ST_Transform(
sde.ST_Geometry('point (-155.7029 63.6096)',4267), 4269));
--Returns output in SRID 4269.
"POINT ( -155.70290000 63.60960000)"
--Option 2
--Example uses input point in SRID 3857(DATUM: WGS 1984)
--and geographic transformation ID (GTid) 1251.
--Transforms point to SRID 102008 (DATUM: NAD 83)
--Provide point to transform.
SELECT sde.ST_AsText(sde.ST_Transform(
sde.ST_Geometry('point (-13244252.9404 4224702.5198)', 3857), 102008, 1251));
--Returns output in SRID 102008.
"POINT (-1957193.14740000 -297059.19680000)"
SQLite
--Create source table.
CREATE TABLE n27 (id integer);
SELECT AddGeometryColumn(
NULL,
'n27',
'geometry',
4267,
'point',
'xy',
'null'
);
--Insert point with SRID 4267.
INSERT INTO n27 (id, geometry) VALUES (
1,
st_geometry ('point (-123.0 49.0)', 4267)
);
--Create the n83 table as the destination table of the transformation.
CREATE TABLE n83 (id integer);
SELECT AddGeometryColumn(
NULL,
'n83',
'geometry',
4269,
'point',
'xy',
'null'
);
--Run the transformation.
INSERT INTO n83 (id, geometry) VALUES (
1,
st_transform ((select geometry from n27 where id=1), 4269, 1241)
);