Добавление местной координатной системы в GIS: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Строка 19: Строка 19:
== Подготовка данных ==
== Подготовка данных ==


Тестовый пример основан на сгенерированных данных. В таблице ''X'', ''Y'' — координаты пункта в государственной системе (ГСК), а именно в седьмой зоне СК-42, ''x'', ''y'' — координаты в местной системе (МСК), ''p'' — вес пункта.
Нужны два файла исходных данных. Пусть текстовый файл '''cat_s42z4.tsv''' содержит координаты пунктов в государственной системе (ГСК), а именно в четвёртой зоне СК-42:
 
{| class="wikitable"
|-
! ''ID'' !! ''X'' !! ''Y'' !! ''x'' !! ''y'' !! ''p''
|- align="right"
| 1 || 7383477.64 || 6087377.60 || 1334.71  || 285.94 || 1.0
|- align="right"
| 2 || 7382557.14 || 6081916.51  || 563.67 || −5197.34 || 1.0
|- align="right"
| 3 || 7386610.19 || 6088160.39 || 4444.27  || 1153.79 || 1.0
|- align="right"
| 4 || 7381962.05 || 6090016.34 || −252.07  || 2881.90 || 1.0
|}
 
Подготовим файл исходных данных '''data0.dat''':


<pre>
<pre>
1 7383477.64 6087377.60 1334.71  285.94 1.0
4645997.49 5768521.60
2 7382557.14 6081916.51  563.67 -5197.34 1.0
4661392.15 5770068.91
3 7386610.19 6088160.39 4444.27  1153.79 1.0
4650059.09 5783332.41
4 7381962.05 6090016.34 -252.07  2881.90 1.0
4634241.37 5778952.22
4631481.69 5764570.61
4642125.18 5754643.12
4655952.19 5757337.28
</pre>
</pre>


Убедимся в однородности данных обоих каталогов. Для этого вычислим параметры конформного преобразования:
В файле '''cat_local.tsv''' — координаты в местной системе (МСК):
 
<syntaxhighlight lang="bash">
$ findkey data0.dat key0.dat var0.dat
</syntaxhighlight>
 
Сами по себе параметры нас не интересуют. Важны величины невязок, выведенных в файл '''var0.dat''':


<pre>
<pre>
1 … -0.002 -0.001
67266.64 30088.40
2 … -0.017 0.013
82697.29 31184.27
3 … 0.031 0.017
71759.40 44771.50
4 … -0.012 -0.029
55822.67 40857.06
52643.65 26564.42
62990.64 16331.35
76888.20 18619.57
</pre>
</pre>


Малые значения невязок говорят о том, что данные достаточно хороши, чтобы с ними работать.
Каждая строка в обоих файлах соответствует одному и тому же пункту.
 
Пересчитаем координаты из ГСК в долготу/широту:
 
<syntaxhighlight lang="bash">
$ awk '{print $2, $3}' data0.dat | proj -I -f "%.9f" +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=7500000 +y_0=0 +ellps=krass > pt_longlat.dat
</syntaxhighlight>
 
Команда '''awk''' извлекает из файла '''data0.dat''' вторую и третью колонки и передаёт их утилите '''proj''', которая пересчитывает координаты из седьмой зоны СК-42 в долготу/широту и записывает результаты в файл '''pt_longlat.dat''':
 
<pre>
37.183749701 54.896961118
37.171630976 54.847714659
37.232243035 54.904709276
37.159058387 54.920296878
</pre>


== Переходная проекция ==
== Переходная проекция ==

Версия от 07:28, 20 мая 2018

Эта страница опубликована в основном списке статей сайта
по адресу http://gis-lab.info/qa/local-cs.html


Конструирование проекций, имитирующих местные координатные системы, в GIS и навигационном ПО

Введение

Под местной системой координат (МСК) будет подразумеваться так называемая «городская» система, построенная независимо от государственной системы (ГСК) и включенная в неё заданием ключей перехода к СК-42 или СК-63. МСК крупных территорий, сравнимых с размерами субъектов Федерации, не являются предметом данной статьи, поскольку относятся к классическим картографическим проекциям.

Постановка задачи

Имеется множество пунктов, для которых известны координаты X, Y в ГСК и x, y в МСК. Требуется подобрать проекцию и вычислить её параметры, удовлетворительно представляющую МСК в ГИС. При подборе параметров предполагается использовать один из пунктов в качестве центральной точки преобразования.

Некоторые программы позволяют реализовать работу в МСК непосредственно. Так, в MapInfo любая проекция может быть дополнена аффинным преобразованием, а в Global Mapper конформным. ArcGIS в качестве МСК предлагает локальную проекцию: аналог ортографической проекции на эллипсоиде, дополненный разворотом и масштабированием.

Другие программы, включая QGIS, работают только с «обыкновенными» проекциями, не допуская дополнительных геометрических преобразований. Задача статьи — показать, как можно конструировать проекции, позволяющие имитировать МСК в таких средах, как QGIS или, скажем, бортовой софт приёмников GARMIN.

В качестве рабочей среды будем использовать командную строку UNIX или OSGeo4W.

Подготовка данных

Нужны два файла исходных данных. Пусть текстовый файл cat_s42z4.tsv содержит координаты пунктов в государственной системе (ГСК), а именно в четвёртой зоне СК-42:

4645997.49 5768521.60
4661392.15 5770068.91
4650059.09 5783332.41
4634241.37 5778952.22
4631481.69 5764570.61
4642125.18 5754643.12
4655952.19 5757337.28

В файле cat_local.tsv — координаты в местной системе (МСК):

67266.64 30088.40
82697.29 31184.27
71759.40 44771.50
55822.67 40857.06
52643.65 26564.42
62990.64 16331.35
76888.20 18619.57

Каждая строка в обоих файлах соответствует одному и тому же пункту.

Переходная проекция

Создадим в качестве переходной проекцию Гаусса-Крюгера, осевой меридиан и начальная параллель которой пересекаются в первом пункте, а координаты в этой точке совпадают с координатами МСК этого пункта. Вычислим координаты в переходной проекции и запишем их в файл pt_tmerc:

$ proj -f "%.4f" +proj=tmerc +lat_0=54.896961118 +lon_0=37.183749701 +k=1 +x_0=1334.71 +y_0=285.94 +ellps=krass pt_longlat.dat > pt_tmerc.dat

Содержимое pt_tmerc.dat:

1334.7100 285.9400
556.2353 -5196.2593
4445.4005 1149.5698
-248.5461 2884.0431

Подготовим входной файл data1.dat для findkey. Нужно на место второй и третьей колонок в data0.dat записать данные pt_tmerc.dat.

$ paste data0.dat pt_tmerc.dat | awk '{print $1, $7, $8, $4, $5, $6}' > data1.dat

Команда paste построчно объединяет данные из шести колонок data0.dat и двух колонок pt_tmerc.dat в общую строку, команда awk выводит в data1.dat нужные колонки в нужном же порядке:[1]

1 1334.7100 285.9400 1334.71 285.94 1.0
2 556.2353 -5196.2593 563.67 -5197.34 1.0
3 4445.4005 1149.5698 4444.27 1153.79 1.0
4 -248.5461 2884.0431 -252.07 2881.90 1.0

Нетрудно заметить, что координаты первого пункта в переходной проекции совпадают с таковыми в МСК. Для остальных пунктов это не так, что говорит о наличии масштабирования и разворота. Убедимся в этом:

$ findkey data1.dat key1.dat var1.dat

Содержимое key1.dat:

0.390
-1.813
1.0000052644
0.0013554914
1.0000061831
+0.07766348

Первые четыре параметра — a0, b0, a1, b1, оставшиеся два — масштабный множитель m и разворот θ в градусах.

Косая проекция Меркатора

Всё готово для конструирования косой проекции Меркатора. Зададим, как для переходной проекции, долготу и широту первого пункта в качестве начальных, его координаты в МСК в качестве «фальшивых». Кроме того, перенесём масштаб конформного преобразования в масштаб проекции, а разворот — в азимут линии минимального масштаба. Вычислим координаты в этой проекции и запишем в файл pt_omerc.dat:

$ proj -f "%.4f" +proj=omerc +lat_0=54.896961118 +lonc=37.183749701 +alpha=0.07766348 +gamma=0 +k=1.0000061831 +x_0=1334.71 +y_0=285.94 +ellps=krass pt_longlat.dat > pt_omerc.dat

Вычислим параметры конформного преобразования для pt_omerc.dat: m = 1.0000000000, θ = −0.00000022° = −0.0008″. Практически масштаб сведён к единице, разворот к нулю, а вычисленные из значений долготы/широты координаты совпадают с координатами, заданными в МСК. Таким образом, проекция, эквивалентная МСК, построена.

Следует заметить, что многие программы (например, MapInfo) используют косую проекцию Меркатора в версии Хотина, когда началом координат служит точка пересечения линии минимального масштаба с экватором. Азимут линии и плоские координаты в этой точке, естественно, отличаются от заданных нами, и понадобятся дополнительные вычисления для их определения.

Реализация косой проекции Меркатора в PROJ.4 имеет одну особенность: программы просто не работают со значениями параметра alpha 0 или 90°. Если угол разворота очень мал (скажем, несколько угловых секунд), следует использовать проекцию Гаусса-Крюгера.

Проекция Гаусса-Крюгера

Встречаются программы, набор проекций в которых ограничен. Проекция Гаусса-Крюгера — она же Transverse Mercator — найдётся в самом бедном наборе. В приёмниках GARMIN пользовательская система координат может быть задана только в этой проекции.

Долгота осевого меридиана

Если угол разворота не превышает первых десятков угловых минут, можно компенсировать его переносом осевого меридиана в сторону и не бояться потери геодезической точности. Даже первые градусы не должны существенно повлиять на навигационные приложения. Дальнейшее увеличение угла приводит к стремительному росту градиента масштаба в направлении запад-восток и, следовательно, искажению подобия фигур.

В нашем примере разворот оказался небольшим: θ = 0.07766348° = 0°04′39.59″. Значит, в данном случае на основе проекции Гаусса-Крюгера можно создать довольно точный аналог МСК.

Предварительное значение перемещения осевого меридиана можно оценить по формуле:

где ∆L — перенос осевого меридиана, θ — угол разворота, B — широта первого пункта. Получаем ∆L = −0.0949292655, L = 37.0888204345. Построим проекцию Гаусса-Крюгера на основе переходной, подставив L в долготу осевого меридиана и нули в «фальшивые» координаты:

$ proj -f "%.4f" +proj=tmerc +lat_0=54.8969611 +lon_0=37.0888204 +k=1 +x_0=0 +y_0=0 +ellps=krass pt_longlat.dat > pt_tmerc.dat

Последующее вычисление параметров конформного преобразования выдаёт сравнительно большой угол разворота. Однако уже после второй итерации с L = 37.0888079 получаем m = 1.0000057306, θ = +0.00000044.

Масштаб проекции

Перенесём m в масштаб проекции:

+proj=tmerc +lat_0=54.8969611 +lon_0=37.0888079 +k=1.00000573 +x_0=0 +y_0=0 +ellps=krass

Вновь вычислим параметры конформного преобразования. Теперь m = 1.0000000039, т.е. практически единица.

Координаты в начальной точке проекции

Наконец обратим внимание на первичные параметры a0 = −4756.693 и a1 = 281.807. Перенесём их значения в параметры проекции x_0 и y_0:

+proj=tmerc +lat_0=54.8969611 +lon_0=37.0888079 +k=1.00000573 +x_0=-4756.69 +y_0=281.81 +ellps=krass

Проекция создана.

Альтернативный набор параметров

Пользовательская проекция старых моделей навигаторов GARMIN допускает ограниченный набор параметров. В ней не используется lat_0. Компенсируем его отсутствие коррекцией y_0. Напишем и запустим скрипт:

proj -f "%.4f" +proj=tmerc +lat_0=54.8969611 +lon_0=37.0888079 +k=1.00000573 +x_0=-4756.69 +y_0=281.81 +ellps=krass <<EOF
37.0888079 0
EOF

Вывод скрипта даёт координаты пересечения осевого меридиана с экватором:

-4756.6900 -6085619.5031

Вот эквивалентный набор параметров:

+proj=tmerc +lat_0=0 +lon_0=37.0888079 +k=1.00000573 +x_0=-4756.69 +y_0=-6085619.50 +ellps=krass

Может возникнуть вопрос, почему нельзя было сразу начать со значения lat_0 = 0, а не с параллели первого пункта? Ответ прост: устойчивые решения получаются только в окрестности заданных пунктов, и перенос начала координат на экватор должен быть выполнен в самом конце.

Коническая равноугольная проекция Ламберта

Эта проекция по использованию в геодезии занимает второе место после проекции Гаусса-Крюгера. Она, в отличие от последней, предоставляет полную свободу в выборе центрального меридиана, поскольку градиент масштаба вдоль параллели равен нулю.

Редко встречается бочка мёда без ложки дёгтя. Некоторые программы (MapInfo, например) предоставляют возможность задания этой проекции только в варианте с двумя стандартными параллелями, в то время как нам нужна единственная стандартная параллель, проходящая через выбранный пункт. По единственной стандартной параллели и масштабу на ней можно вычислить две стандартные широты тогда и только тогда, когда масштаб на единственной параллели меньше единицы. В общем, возможность имитации МСК таким вариантом с двумя стандартами 50:50.

К счастью, PROJ.4 не имеет этого досадного ограничения, и коническая равноугольная проекция Ламберта является неплохим вариантом создания аналога МСК для QGIS.

Долгота центрального меридиана

По развороту θ = 0.07766348° определим величину переноса центрального меридиана:

Получим ∆L = −0.0949292942, L = 37.0888204068. Запишем L в долготу центрального меридиана, нули в x_0 и y_0:

$ proj -f "%.4f" +proj=lcc +lat_0=54.8969611 +lon_0=37.0888204 +lat_1=54.8969611 +k_0=1 +x_0=0 +y_0=0 +ellps=krass pt_longlat.dat > pt_lcc.dat

Через пять итераций приходим к значению lon_0 = 37.0824027, при котором θ практически сводится к нулю.

Масштаб проекции

Полученное последним значение m = 1.00002378 запишем в параметр k_0:

+proj=lcc +lat_0=54.8969611 +lon_0=37.0824027 +lat_1=54.8969611 +k_0=1.00002378 +x_0=0 +y_0=0 +ellps=krass

Координаты в начале проекции

Вновь вычислим параметры конформного преобразования и перенесём a0 = −5167.777 и a1 = 281.494 в параметры проекции x_0, y_0:

+proj=lcc +lat_0=54.8969611 +lon_0=37.0824027 +lat_1=54.8969611 +k_0=1.00002378 +x_0=-5167.78 +y_0=281.49 +ellps=krass

Проекция готова. Невязки по результатам конформного преобразования достигают десяти сантиметров, что почти на порядок больше невязок для проекций Гаусса-Крюгера и косой Меркатора. Возможно, этого следовало ожидать, поскольку местная система координат построена на основе проекции Гаусса-Крюгера.

Косая стереографическая проекция

Эта проекция занимает незаслуженное третье место по широте использования геодезистами. Причина этого, возможно, кроется в вычислительных трудностях докомпьютерной эпохи: коническая равноугольная Ламберта выгодно отличается аскетической простотой формул, а проекция Гаусса-Крюгера — возможностью построения координатных таблиц, одинаковых для любой зоны. Между тем, если бы речь шла о создании МСК на пустом месте, а не об имитации уже созданной на основе другой проекции, то именно стереографическая является идеальным воплощением мечты о конформной проекции, искажения в которой минимальны на краях территории произвольной формы.

Можно реализовать имитацию МСК нашего примера на основе стереографической проекции. Если бы PROJ.4 включало параметр разворота, это было бы так же просто, как и реализация на основе косой проекции Меркатора. Следует ожидать, что при этом невязки были бы вдвое меньше, чем в реализации на основе конической равноугольной проекции Ламберта.

Отсутствие параметра разворота заставляет пойти по пути, дважды пройденному выше: перенос осевого меридиана для компенсации разворота, задание масштаба проекции, коррекция плоских координат. Оставим реализацию в качестве упражнения для любителей вычислений.

Заключение

Рассмотрена возоможность имитации МСК с использованием практически всех конформных проекций, широко используемых в геодезии: косой Меркатора, Гаусса-Крюгера, конической равноугольной Ламберта, косой стереографической. Для практического применения в QGIS рекомендуется косая проекция Меркатора. Если программное обеспечение не позволяет реализовать эту проекцию, либо угол разворота мал, предпочтительной является проекция Гаусса-Крюгера.

Примечания

  1. Также можно использовать утилиту pr (после -s\ два пробела!):
    $ pr -m -t -s\  data0.dat pt_tmerc.dat | awk '{print $1, $7, $8, $4, $5, $6}' > data1.dat
    

Ссылки