Мапим по гуглопанорамам — наземное фотограмметрическое картирование в QGIS с помощью плагина stereoSurveys

Read in English

Замечание 1. В данной статье не расматриваются юридические вопросы законности использования описанного метода при работе с данными компании Гугл. Мое дело метод показать, а с юристами сами разбирайтесь.
Замечание 2. Собственно, ничто не мешает использовать любые другие данные, вплоть до своих фотографий.
Замечание 3. Код описываемого ниже модуля от первой до последней строки написан Enrico Ferreguti. Мое значение в этом проекте чисто терапевтическое.

Пару месяцев назад я опубликовал пост о технологии применении снимков Google StreetView для фотограмметрического картирования территории. Этот незатейливый текст вдохновил Enrico Ferreguti (по его словам) на разработку модуля StereoSurveys для QGIS.

Основное назначение модуля — перенос контуров объектов, попавших в объектив камеры гугломобиля в точечный слой QGis. Наличие объекта с известным пеленгом на двух геопривязанных снимках позволяет однозначно установить его местоположение по свойству суммы углов треугольника. Использовать это свойство на практике возможно было и ранее, однако, только после появления StereoSurveys появилась возможность значительно сократить трудоемкость работ и увеличить точноность нанесения данных.

Для иллюстрации работы модуля, нанесем в точечном слое местоположение фонарных столбов на улице Текстильной (ХБК, город Шахты). Со спутникового снимка их не видно, поэтому единственный способ нанести их не от балды — воспользоваться описываемым методом.

0

Улица Текстильная, вдоль которой необходимо отметить фонарные столбы

1. Для начала скачиваем модуль с гит-хаба.  На тот случай, если гит-хаб закроют (твою-ж мать…) сохранил копию у себя на сервере. Последняя ссылка подойдет так-же для тех, у кого скачанный с гит-хаба архив не открывается (как у меня, например).

2. Скачанный архив необходимо распаковать в папку хранения модулей QGIS. Для windows XP это обычно C:\Documents and Settings\[username]\.qgis2\python\plugins для windows 7: C:\Users\[username]\.qgis2\python\plugins, для linux: /home/[username]/qgis2/python/plugins. Если в папке home отсутствует папка qgis2 (или .qgis2), то, возможно, у вас не отображаются скрытые файлы. В debian-подобных системах (debian, ubuntu, mint, OSGeoLive и др.) это исправляется так: правая кнопка мыши — отображать скрытые файлы.

3. Если у вас винда — обратите внимание на название папки [username]. Плагин не переносит кириллицу! Если в названии файла, проекта, плагина или пути к ним встретится русская буква, QGIS выдаст следующую ошибку:

Traceback (most recent call last):   File "", line 1, in   File "C:/PROGRA~1/QGISWI~1/apps/qgis/./python\pyplugin_installer\installer.py", line 274, in upgradeAllUpgradeable     self.installPlugin(key, quiet=True)   File "C:/PROGRA~1/QGISWI~1/apps/qgis/./python\pyplugin_installer\installer.py", line 322, in installPlugin     reloadPlugin(key) # unloadPlugin + loadPlugin + startPlugin   File "C:/PROGRA~1/QGISWI~1/apps/qgis/./python\qgis\utils.py", line 319, in reloadPlugin     loadPlugin(packageName)   File "C:/PROGRA~1/QGISWI~1/apps/qgis/./python\qgis\utils.py", line 200, in loadPlugin     msg = msgTemplate % (packageName, "', '".join(sys.path)) UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 9: ordinal not in range(128)

Для пользователей Windows 7, причина кроется как правило в том, что папка «Users» в этой системе названа как «Пользователи», кроме того, обычно кириллическое написание имеет папка  [username]. Теоретически, исправить эту беду можно создав новую учетную запись с правами администратора. Через нее следует войти завершив текущую сессию, после чего стандартным способом сменить название директорий на латиницу. Насколько это возможно и действенно, я утверждать не берусь — не проверял.

В Линуксе, как правило, папка [username] всегда может быть названа только латиницей. Поэтому, если у вас Линукс — переходите к следующему пункту.

4. Теперь можно запустить QGIS, либо перезапустить его, если он работал до этого.

В верхнем меню выбираем: модули — управление модулями-с ошибками. Ставим галку в чекбоксе stereo surveys и нажимаем установить

Снимок экрана от 2015-06-20 21_37_45

 

После установки появляется текст «Модуль неисправен invalid syntax». Презираем его и закрывая окно установки модулей.

Снимок экрана от 2015-06-20 21_37_59

 

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

Снимок экрана от 2015-06-20 21_40_00

На панорамах Google отображается площадь Прато-делла-Валле — что находится в Падуе, недалеко от Венеции. Это красивейшие места, но в качестве отправной точки для модуля не самые удачные — нам ведь требуется картировать шахтинскую улицу.

Для точечного слоя, создадим шейп-файл с названием test и системой координат EPSG: 3785 (можно и EPSG: 3857 — все работает, другие датумы не пробовал).

Снимок экрана от 2015-06-20 21_42_06

 

Что-бы вернуть его в рамки окна — перетащим таблицу слоев (менеджер слоев, TOC — все его по-разному называют) в нижнюю часть экрана.

Для того, что-бы картирование было более наглядным, подгрузим слой OpenStreetMap — Mapnik, воспользовавшись плагином OpenLayersPlugin.  Это не обязательно, но очень удобно. Приблизим нужный участок.

Рядом с левым верхним углом левой панорамы находится кнопка с зеленым индейцем. Нажимаем на эту кнопку, после чего выбираем на карте точку, из которой мы хотим видеть панораму. Обычно после этого в левом окне появляется панорама Google StreetView.

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

Первое сообщение об ошибке:

Снимок экрана от 2015-06-20 21_43_57

 

Второе сообщение об ошибке:

Снимок экрана от 2015-06-20 21_44_00

 

После нескольких неудачных попыток модуль срабатывает как надо и пользователь видит следующее:

— В окнах плагина видны панорамы из отмеченных точек и спутниковый снимок с тайлом, содержащий обе точки. Поверх панорам нанесены красные перекрестия как в прицеле.

— Непонятные числа, поля ввода и текст not calibrated слева и справа от окон с панорамами (первые два числа слева и справа — это координаты точки, в которой сделана панорама.

— Числа по центру, под окном со спутниковым снимком, которые обозначают следующее (я могу ошибаться):

H — высота точки, взятой на прицел в обоих панорамных окнах в метрах, относительно земли;

+/- — погрешность местоположения точки, взятой на прицел в обоих окнах, в метрах;

Lon, Lat — долгота и широта;

X,Y — неизвестные прямоугольные координаты;

— Под числами, расположена кнопка с текстом, «Digitize on map», по клику на которой, точка, взятая на прицел в обоих панорамах должна переносится в точечный слой.

— В окне отображения данных QGIS, помимо OSM-карты, пользователь видит три точки: зеленую — точка из которой снята панорама в левом окне StereoSurveys, красную — точка, из которой снята панорама в правом окне и желтую — точка, взятая на прицел в обоих окнах просмотра панорам.

Можно начинать работу. Находим на обоих панорамах одну и ту же точку. Кнопка Digitize on map не срабатывает, поэтому, включаем редактирование слоя и наносим ее вручную (кликаем по желтой точке, предварительно выбрав инструмент «добавить объект»). В проекте, который идет как пример к плагину, кнопка Digitize on map работает, но тоже далеко не всегда. Этот вопрос еще необходимо прояснить.

Находим один и тот же объект на двух снимках (в нашем случае это первый фонарный столб со знаком пешеходного перехода).

Снимок экрана от 2015-06-20 21_44_18

 

Прицеливаемся поточнее и стреляем — ставим точечный объект поверх желтой точки.

Снимок экрана от 2015-06-20 21_45_02

 

Точно так-же поступаем для остальных объектов. Картирование фонарного столба на противоположной стороне улицы.
Снимок экрана от 2015-06-20 21_47_33

 

Навигация осуществляется средствами Google StreetView. «Проезжаем» на несколько метров вперед в обоих окнах просмотра панорам и берем на прицел новый столб.

Снимок экрана от 2015-06-20 21_49_59

 

Иногда, без видимых причин возникает сообщение об ошибке:

Снимок экрана от 2015-06-20 21_51_10

 

Игнорируем его и продолжаем работать дальше.

Снимок экрана от 2015-06-20 21_53_17

 

Ради интереса, попытаемся изменить числа в полях StereoSurveys. Числа ввести можно только корректные. Насколько я понял из общения с Enrico, данные поля позволяют корректировать данные о высоте точки. Первое поле отвечает за высоту камеры над поверхностью земли (2.5 метра), второе за высоту поверхности земли (по умолчанию 0). Эти параметры особенно важны в горной местности с большими перепадами высот и при картировании объектов, находящихся на большом удалении от точек съемки панорам.

Не отвлекаемся и стреляем столбы дальше.

Снимок экрана от 2015-06-20 21_58_20

 

Процесс захватывает.

Снимок экрана от 2015-06-20 22_00_02 Снимок экрана от 2015-06-20 22_04_23 Снимок экрана от 2015-06-20 22_08_46 Снимок экрана от 2015-06-20 22_09_57

 

Первые несколько точек даются тяжело, но привыкание происходит очень быстро. Процесс прицеливания к снимкам улиц значительно проще указания общих точек (вертексов) при привязке растров.

Еще точечку.

Снимок экрана от 2015-06-20 22:13:22 Снимок экрана от 2015-06-20 22:23:21 Снимок экрана от 2015-06-20 22:25:19

 

В результате, мы получаем точечный слой, который планировали. После нанесения всех точек, закрываем модуль и сохраняем полученный слой. Иногда, после закрытия модуля красная и зеленая точки (точки съемки панорам) не исчезают, в этом случае, необходимо отключить модуль через меню-модули-управление модулями-снять галку с чекбокса напротив StereoSurveys и нажать «Закрыть».

Любопытный момент: обычно, снимки привязывают к gps-трекам. Я за всю Одессу говорить не буду, но в OpenStreetMap так и происходит. Думаю в Google тоже. При этом трек рассматривается в качестве центра дороги, что частично верно только для проселочных колейных дорог. Игнорирование понятия полосы дороги, приводит к системной ошибке в координатах до 5 метров (обычно +/- 3 м). Сама по себе, это величина небольшая, часто незначительная на фоне погрешности прибора. Однако, в том случае, если координаты объекта используются для расчетов детерминированных показателей, ошибки могут быть колоссальны. Это категорически запрещает использование популярных веб-проектов для расчета площади секторов, лежащих в створе с известными координатами, анализа видимости объектов, привязки объектов по двум точкам…, боюсь, этот список может оказаться длинным.

Обратите внимание на местоположение фонарного столба на улице Ворошилова.

Карта OpenStreetMap — столб стоит на дороге.

Снимок экрана от 2015-06-20 22:31:49

 

Карта Google. Аналогичное местоположение столба. Так-же, обратите внимание на местоположение дороги, относительно столбов освещения.

Снимок экрана от 2015-06-20 22:31:14

 

Загадка. В какую сторону ехал гугломобиль, если дело происходит в стране с правосторонним движением?

Снимок экрана от 2015-06-20 22:30:49

 

Впрочем, я немного отвлекся от темы. Как видно из описанного примера, модуль StereoSurveys, хотя и имеет много багов, но уже достаточно хорош для практического использования.

Вот карта фонарных столбов, полученная с помощью модуля:

Снимок экрана от 2015-06-20 22:27:30

 

А вот, та же карта, полученная два месяца назад вручную. Ошибки нанесения (дублирование столбов) — налицо.

9

 

В качестве завершения данного обзора, выкладываю список обнаруженных мною багов и неудобств, при использовании модуля StereoSurveys.

- Не работает с кириллицей;
- Не хватает угла обзора панорам как в модуле go2streetview;
- Возникает ошибка при попытке переместить точку на карте;
- Не работает кнопка Digitize on map;
- Плагин не реагирует, когда на обоих экранах одинаковый снимок (должно высвечиваться предупреждение);
- Не высвечивается предупреждение, если погрешность больше заданной величины;
- При запуске модуля должны отображаться снимки из текущих координат экстента;
- При наличии таблицы слоев, модуль выходит за размеры экрана;
- Не исчезают точки после закрытия плагина;
- Нет явного объяснения значения чисел и полей ввода в плагине;
- Много времени уходит на масштабирование снимков, не хватает кнопки "сбросить увеличение";
- Не хватает кнопки "назад" для каждого из окон панорам;
- Не хватает кнопки "вперед", перемещающей обе точки;

P.S. Спасибо Enrico Ferreguti за написание такого чудесного плагина. Десять лет назад я говорил, что скоро наступят времена, когда картографы долгими зимними вечерами будут превращать видеозаписи своих летних путешествий в точнейшие карты. Тогда надо мной все смеялись. Теперь, благодаря Enrico, я понимаю, что был прав.

Наземное фотограмметрическое картирование объектов с помощью Google StreetView, QGis и модуля go2streetview

Замечание 1. В данной статье не расматриваются юридические вопросы законности использования описанного метода при работе с данными компании Гугл. Мое дело метод показать, а с юристами сами разбирайтесь.
Замечание 2. Собственно, ничто не мешает использовать любые другие данные, вплоть до своих фотографий. Для этого необходимо только переписать модуль. К сожалению, моих познаний в языке для этого недостаточно. Была попытка написать отдельную программу для реализации этого метода (Borland С++ Builder 6) с произвольными фотографиями, но, ввиду отсутствия времени и денег работа была остановлена.

 

Данные проекта Google StreetView вполне успешно можно использовать не только для ориентирования на местности, но и для картографирования объектов. Причем речь идет не просто о нанесении на карту топонимики или примерного уточнения границ объектов. При небольших затратах возможно картирование объектов с точностью до нескольких метров. Особенно это актуально для объектов небольшого размера, которые невозможно отрисовать по спутниковому снимку (инфраструктура, растительность, ограждения, элементы зданий и др.).

Для иллюстрации метода, нанесем на карту столбы освещения на Текстильной улице города Шахты, Ростовской области. Сделать это по спутниковому снимку невозможно. Более того, по спутниковому снимку невозможно даже определить их наличие:

0

 

С помощью меню «Модули» -> «Управление модулями» установим модуль «go2streetview«. После чего откроем в QGis указанный район и запустим модуль. Сделать это можно перетаскиванием желтого человечка на необходимую точку улицы, точно так же как и в Google Maps. В новом окне откроется фотография улицы из указанной точки, а сама точка на карте будет обозначенна синим цветом с двумя лучами, иллюстрирующими рамки окна с фотографией.

1

 

Изменение угла обзора в окне go2streetview, автоматически изменяет положение лучей. Это замечательное свойство модуля, наряду со свойством треугольника, позволяет нам определить местоположение любого объекта, попадающего не менее чем на два снимка StreetView.

В окне панорамы приблизим первый столб и соориентируем вид таким образом, что-бы его пересекала рамка окна. После чего создадим вспомогательный линейный слой, в котором продлим продлим луч go2streetview. В моем случае, таким слоем является слой «водотоки» (по ленному недоразумению). К сожалению, модуль go2streetview не позволяет указать в настройках размеры лучей, поэтому приходится поступать таким методом.

2
Такую же процедуру повторим для столба на противоположной части дороги. Для удобства, можно использовать правую границу окна и правый луч соответственно.

Теперь откроем панораму с этими столбами снятую из другой точки. Сделать это можно кликнув по карте (не забудьте перед этим переключиться из режима редактирования слоя в режим модуля). Еще проще сделать это кликнув по стрелке в окне go2streetview.

В новом окне выполняем те же самые операции, что и ранее. Луч, проведенный из второй точки, в пересечении с первым лучом обозначит местоположение картируемого столба.

3
Находим противоположный столб.

4

 

Нанесем местоположение столбов на точечный слой. Сделать это можно в любой момент времени, но по мере работы вспомогательный слой постепенно загромождается лучами. В моем случае это затрудняет простановку точек после определения местоположения всех столбов.

5

 

В ходе работы необходимо следить за тем, что-бы не ошибиться в выборе рамки окна go2streetview. Когда постоянно «вертишься» в пространстве панорам, такая ошибка, особенно в начале работы, случается часто. Обычно, это сразу заметно по нехарактерному положению искомого объекта на плане.

Для нанесения точки можно использовать более двух лучей. Это повышает точность, но значительно увеличивает трудемкость. В нашем случае это не требуется.

6

 

Таким методом мы движемся вдоль всей улицы, редактируя точечный слой после каждого определения местоположения столба.

7

 

Получая в итоге следующее:

8

 

Теперь нам необходимо только отключить вспомогательный слой, подключить необходимые слои, добавить соль и перец по вкусу. Карта местоположения столбов освещения готова.

9

Наземный фотограмметрический WZPr-метод оценки полноты древостоя

«Лесник без спичек, что хуй без яичек»
Народная лесниковская поговорка

В статье про то, как использование фотоаппарата вместо полнотомера Биттерлиха позволяет оптимизировать решение задач, связанных с определением полноты древостоя. Все иллюстрации кроме хуевых честно спизжены, но над некоторыми я поработал. Если выснится, что я тем самым нарушил ваши права — прошу меня извинить и написать для проставления соответствующих гиперссылок (я честно, уже не помню откуда пиздил исходники картинок). Во время работы над статьей в продуктовом была скидка на «три топора», поэтому математические выкладки рекомендую еще раз перепроверить.

Выражаю данной статьей признательность Михаилу Васильевичу Нешатаеву и Антону Олеговичу Пестерову, которые проебали мою призму Анучина в районе Левашово, а так-же Ивану Васильевичу Никифорчину, который в 2009 году взял на проверку курсовую работу по таксации и до сих пор проверяет.

Матчасть в лице учебника таксации говорит, что полнота «представляет собой сумму площадей поперечных сечений всех деревьев на площади на высоте 130 см в пересчете на гектар леса». Естественно, тут и далее в статье пойдет речь про абсолютную полноту, которая выражается обычно в квадратных метрах на гектар. Проще говоря абсолютная полнота это площадь всех пеньков на гектаре, срубленных выше пупка, но ниже головы — одна из важнейших величин при определения запаса древесины, а следовательно всех вытекающих параметров. Для измерения абсолютной полноты существует давно разработанный и опробованный метод угловых проб, который чаще называют методом реласкопических площадок или методом Биттерлиха, по имени изобретателя. В старой литературе, иногда встречается название WZPr-метод, от немецкого die Winkelzahlprobe. Те, кто уже знаком с методом, могут пропустить нудятину с его описанием и сразу перейти к сути вопроса.

Метод очаровательно прост. Вам потребуется изготовить вот такой «прибор»:

Полнотомер

Фактически это любая ровная палка с закрепленной на ее конце пластинкой с прорезью. Можно использовать любые материалы, главное, что-бы отношение прорези к длине палки составляло ровно 1:50. Периодически встречаю у коллег разные китайские поделки, вроде вот такой:

Нормальный полнотомер

Здесь роль палки выполняет натянутая цепочка, длина которой в 50 раз больше ширины прорези. Но большая часть использует то, что есть в карманах: спички, зажигалки, куски картона или «ключи» от пивных банок (у кого что лежит в карманах). Главное не ошибится с размерами, после определенной тренировки, такие «инструменты» зачастую дают лучший результат чем адски дорогая лазерно-оптическая техника.
Вы берете прибор Биттерлиха (полнотомер) и прикладываете конец палки без прорези, либо свободный конец цепочки к глазу и визируете через него на деревья, поворачиваясь по кругу. Первым визируете самое ближнее к вам, что-бы не спутать его с остальными и не пойти на «второй круг». При визировании вы смотрите вдоль палки/цепочки сквозь прорезь и наблюдаете три ситуации:

1. При наведении на дерево, дерево «закрывает» прорезь
2. При наведении на дерево, оно точно вписывается в прорезь (невозможно точно определить «закрывает» дерево прорезь или нет)
3. При наведении на дерево, дерево очевидно не закрывает прорезь

Принцип полнотомера

Деревья из первой категории вы считаете за единицу, деревья из второй категории считаете за пол-единицы. Третью категорию не учитываете. Предположим у вас 10 деревьев вошло в первую категорию, 4 дерева попали во вторую и все остальные попали в третью категорию. Абсолютная полнота в этом случае составляет 10*1+4*0,5=12 кв. метров на 1 гектар. Естественно, одной площадкой не обойдешься — весь мануал доступен в книжке «Методы отвода и таксации лесосек» — рекомендую к прочтению.

Весь фокус метода можно понять из картинки ниже:

Хуевая картинка

если длина полнотомера составляет 100 см, то круг, описанный им будет иметь площадь π кв.м. Если в этом кругу будет расти дерево, которое точно вписывается в разрез пластины полнотомера, значит диаметр этого дерева 2 см, а площадь сечения 0,0001π кв.м., что соответствует абсолютной полноте 1 кв. м на 1 га.

Метод чертовски хорош, однако постоянно носить с собой базисную рейку полнотомера неудобно, от использования цепочки устает рука, и в целом процесс оценки полноты требует умения держать в уме и постоянно суммировать несколько колонок цифр, включая дробные (полнота ведь считается отдельно для каждой породы). При долгой работе, особенно в неприятных условиях (дождь, гнус, жара и др.) основная масса ошибок возникает от усталости и невнимательности исследователя. Несколько упростить работу можно если применять оптическую модификацию полнотомера — призму Анучина, но в настоящее время их либо не производят вообще, либо производят в очень малых количествах и приобрести такую призму проблематично.

Призма Анучина

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

Принцип призмы Анучина

Всевозможные электронные приблуды дороги и, как я уже писал, ощутимого улучшения производительности они не дают.
Размышляя над этой безысходностью я несколько дней путешествовал по виртуальным улицам гугл стрит пока мне не пришло в голову измерить полноту одного из скверов города, находясь в этот момент от него на расстоянии в полторы тысячи километров. Но для этого мне нужен был виртуальный полнотомер Биттерлиха, создать который, впрочем уже не составляло особых проблем.

Примечание. Здесь и далее подразумевается работа со снимками, полученными с помощью фотоаппарата без дисторсии. При использовании фотоаппаратов с дисторсией, необходимы дополнительные расчеты для учета оной. Они довольно громоздки, но если вы знаете, что такое «дисторсия», то вполне сможете их рассчитать самостоятельно.

Цифровые фотоаппараты которые мы используем замечательны во-первых тем, что снимают секторами, в отличии от сканеров, а во-вторых тем, что получаемое растровое изображение уже разбито на пиксели, сквозь которые мы можем глядеть как сквозь разрез полнотомера. Примитивно говоря, это устроено так:

Схема метода

Не правда ли, это похоже на полнотомер Биттерлиха, только как бы «повернутый» прицельным визиром к наблюдателю? Естественно, ни о каком соотношении 1:50 тут не может быть и речи, но тем не менее, это не мешает установив зависимость между линейными размерами пиксела, и углом, который он охватывает в натуре, оценивать значения абсолютных полнот.
Первое что необходимо сделать — это узнать ширину 1 пиксела. Ее можно посмотреть либо в свойствах снимка, либо с помощью фоторедактора, например в GIMP 2.8: меню изображение -> свойства-разрешение:

Гимп скриншот

Разрешение снимка обычно представлено либо одним, либо двумя числами. В первом случае чило означает количество пикселей в дюйме диагонали, во втором случае, количестово пикселей в дюйме ширины и высоты. Соответственно, для вычисления ширины в первом случае нам необходимо воспользоваться теоремой Пифагора (количество пикселей в дюйме ширины равно квадратному корню половины квадрата количества пикселей в дюйме диагонали). В нашем случае в 1 дюйме ширины содержится 180 пикселей изображения. Следовательно, ширина 1 пиксела 0,014 см. Это и будет минимальная ширина прорези в нашем виртуальном полнотомере Биттерлиха.
Теперь необходимо определиться с длиной виртуальной базисной рейки. Для этого необходимо установить какой угол по ширине охватывает объектив вашего фотоаппарата. Учтите, что он изменяется при зуммировании объектива, поэтому «приближения» при снимках использовать не нужно.
Ширину охвата фотоаппарата можно рассчитать исходя из технической документации на ваш объектив, в которой указан угол изображения объектива. Для широкоугольных объективов он превышает 75 градусов, для длиннофокусных составляет менее 30 градусов. Остальные объективы называют нормальными, как правило на недорогих моделях стоят именно они. Угол изображения объектива — это диагональный угол, поэтому для расчета ширины охвата требуется вновь воспользоваться теоремой Пифагора.
Если же документация утеряна много лет назад, как в моем случае, достаточно просто установить фотоаппарат на штатив, сфотографировав удаленную на известное расстояние линейку, после чего измерить получившийся угол. Мой фотоаппарат охватывает ширину в 45 градусов.
Ширина фотографии составляет 3072 пиксела, что видно из свойств растра. Значит на каждый пиксел охватывает ширину в 45/3072=0,0146484375 градуса. Выше мы рассчитали, что каждый пиксел имеет ширину 0,014 см. Все что нам остается, для того, что-бы рассчитать длину виртуальной базисной рейки — это решить задачку для седьмого класса: основание равнобедренного треугольника составляет 0,014 см, вершина имеет угол 0,0146484375 градуса. Всего-то необходимо найти высоту этого треугольника.
Решение 1. Высота делит равнобедренный треугольник на два равных прямоугольных треугольника с длиной противолежащего катета 0,014/2=0,007 см и острым углом в вешине 0,0146484375/2=0,00732421875 градуса. Искомая высота является прилежащим катетом в наших треугольниках и равна отношению катета к тангенсу острого угла: 0,007 / tg(0,00732421875) = 54,7594860417≈55 см.
Решение 2. Будем считать, что этот треугольник не равнобедренный, а прямоугольный. Да, это аморальное математическое допущение, но при таком соотношении сторон, возникающая ошибка незначительно мала. Тогда искомая высота, она же прилежащий катет составляет: 0,014/tg(0,0146484375)=54,7594851469≈55 см.
Размер нашей виртуальной базисной рейки составляет 5,5 м. Визирный прицел составляет 0,00014 м. Следовательно, если на фотографии мы видим, что единственное дерево имеет ширину 1 пиксел, мы можем утверждать, что на площади (π×5,5^2)/(360/45)=11,8791472214≈12 кв.м площадь сечения древостоя составляет π*0,00007^2=1,5393804 × 10^(-8) м, что в пересчете на гектар составит 0,000013 кв.м. Это, конечно, чрезвычайно мало, но ситуация, при которой у вас в кадре будет только один ствол дерева шириной в 1 пиксел может быть разве что в таком случае:

Саванна

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

Таким образом, абсолютная полнота древостоя на 1 га вычисляется по формуле:
P = Σ(10000*(π*(0,5*B)^2)/(360/V*π*((0,5*B)/tg(0,5*0,W*B))^2)) где,
P — полнота, в кв.м
V — угол охвата снимка,
B — ширина дерева на фото, в см (ширина прорези виртуального полнотомера),
W — угол охвата одного пиксела, градусов
Применительно к нашему случаю:
P = Σ(10000*(π*(0,5*B)^2)/(360/45*π*((0,5*B)/tg(0,5*0,014*B))^2))
В материальном виде, использование этого метода можно представить так, будто мы располагаем не одним полнотомером, а бесконечным множеством полнотомеров с разными размерами визиров. Классический метод Биттерлиха совершенно игнорирует все деревья, не совпадающие с размером визира. В случае же фотограмметрического метода, учитываются все деревья. При этом, нет необходимости измерять абсолютно все деревья на снимке, но чем больше их будет измерено, тем точнее окажутся результаты.