Перейти к содержимому
getnextpdf.com

Pro редакция

Geo — глубокий справочник

Эта страница — справочник контрактного уровня по модулю Geo в NextPDF Pro. Поверхность составляют четыре неизменяемых объекта-значения — GeoCoordinate, GeoControlPoint, ProjectionType и GeoRegistration — плюс GeoPdfLayer, который связывает регистрации с индексами страниц и формирует вывод области просмотра. Модуль порождает текст словарей PDF: словарь /Measure с /Subtype /GEO, словарь /Viewport и значение массива /VP на уровне страницы. Генерация — детерминированная сборка строк: без сетевых вызовов, без доступа к файловой системе, без случайности. На этой странице описаны публичный API, контракт наблюдаемого поведения и режимы отказа.

Эта возможность поставляется в составе NextPDF Pro (nextpdf/pro) и активируется лицензионным конвертом уровня Pro. Развёртывание без этого права не загружает классы возможности. Сравнить редакции и получить лицензию.

Отдельный лицензионный флаг для этого модуля не используется. Классы Geo доступны всегда, когда установлен nextpdf/pro.

СимволПараметрыПоведение по умолчаниюВозвращаетВозбуждает или отказывает сПримечания
GeoCoordinateконструктор: float $latitude, float $longitude, float $altitude = 0.0Проверяет широту в пределах [-90, 90] и долготу в пределах [-180, 180]InvalidArgumentException, когда любое из значений выходит за диапазонfinal readonly; высота — метры над уровнем моря, диапазон не проверяется
GeoCoordinate::toDms()нетФорматирует как градусы-минуты-секунды с суффиксами N/S и E/WstringСекунды около нуля отображаются как 00; иначе два знака после запятой с обрезкой хвостовых нулей
GeoCoordinate::toDecimal()нетФорматирует широту и долготу до шести знаков после запятой через запятуюstringВысота не включается
GeoCoordinate::fromDms()string $dmsРазбирает строку DMS; секунды необязательны; типографские глифы градуса и кавычек нормализуютсяselfInvalidArgumentException, когда строка не разбирается или когда разобранные значения не проходят проверки диапазона в конструктореСтатическая фабрика; буквы полушарий регистронезависимы; высота по умолчанию 0.0
GeoControlPointконструктор: float $pdfX, float $pdfY, GeoCoordinate $geoСвязывает точку пользовательского пространства PDF (в пунктах) с географической координатойfinal readonly; координаты PDF не проверяются
ProjectionTypeперечисление на строках, 4 случаяСлучаи: Geographic, UTM, TransverseMercator, LambertConformalбазовые значения GEO, UTM, TM, LCCСм. таблицу сопоставления проекций ниже
ProjectionType::epsgCode()нетСопоставляет случаю один фиксированный код EPSGint4326, 32601, 2154 или 3347
ProjectionType::label()нетЧеловекочитаемое имя проекцииstringНапример, WGS 84 Geographic
GeoRegistrationконструктор: array $controlPoints, ProjectionType $projection, string $datum = 'WGS84'Хранит контрольные точки, проекцию и геодезический датумfinal readonly; количество контрольных точек при конструировании не проверяется
GeoRegistration::isValid()нетТребует не менее двух контрольных точекboolДве точки — минимум для аффинного отображения
GeoRegistration::toPdfMeasureDictionary()нетВыдаёт словарь /Measure с /Subtype /GEO, /GCS, /GPTS, /LPTS и /BoundsstringНе проверяет isValid(); защитите вызов или направьте его через GeoPdfLayer
GeoPdfLayer::addRegistration()int $pageIndex, GeoRegistration $registrationДобавляет регистрацию для индекса страницы, отсчитываемого от нуляselfInvalidArgumentException, когда $pageIndex отрицателенТекучий интерфейс; при генерации побеждает первая добавленная для страницы регистрация
GeoPdfLayer::getRegistrations()нетВозвращает все регистрации в порядке вставкиlist<array{pageIndex: int, registration: GeoRegistration}>Включает дубликаты и недействительные регистрации в том виде, как они добавлены
GeoPdfLayer::generateViewportDictionary()int $pageIndexВыдаёт словарь /Viewport с /BBox, /Name и встроенным /MeasurestringПустая строка, когда у страницы нет регистрации или регистрация недействительна
GeoPdfLayer::generateViewportArray()int $pageIndexОборачивает словарь области просмотра в скобки как литерал массива /VPstringПустая строка при отсутствии; тогда вызывающая сторона опускает /VP для этой страницы
GeoPdfLayer::writeToPdfWriter()BinaryBuffer $buffer, int $pageIndexЗаписывает /VP плюс литерал массива и перевод строки в буферbooltrue, когда запись выполнена; иначе бездействие и false
public function __construct(
public float $latitude,
public float $longitude,
public float $altitude = 0.0,
)
public function toDms(): string
public function toDecimal(): string
public static function fromDms(string $dms): self
public function __construct(
public float $pdfX,
public float $pdfY,
public GeoCoordinate $geo,
)
public function __construct(
public array $controlPoints,
public ProjectionType $projection,
public string $datum = 'WGS84',
)
public function isValid(): bool
public function toPdfMeasureDictionary(): string
public function addRegistration(int $pageIndex, GeoRegistration $registration): self
public function getRegistrations(): array
public function generateViewportDictionary(int $pageIndex): string
public function generateViewportArray(int $pageIndex): string
public function writeToPdfWriter(BinaryBuffer $buffer, int $pageIndex): bool

GeoCoordinate проверяет значения при конструировании и никогда не мутирует. Широта вне [-90, 90] или долгота вне [-180, 180] возбуждает InvalidArgumentException с указанием нарушающего значения. toDms() отображает обе оси как градусы, минуты с ведущим нулём, секунды и суффикс полушария. toDecimal() отображает latitude, longitude с шестью знаками после запятой. fromDms() принимает ввод DMS с необязательными секундами, нормализует глифы штриха, двойного штриха, знака градуса и типографских кавычек, преобразует в десятичные градусы со знаком и конструирует новый экземпляр. Южные широты и западные долготы становятся отрицательными значениями.

Каждый случай ProjectionType несёт один фиксированный код EPSG и метку. Сопоставление — это закрытая таблица, а не реестр систем координатной привязки.

СлучайБазовое значениеepsgCode()label()
GeographicGEO4326WGS 84 Geographic
UTMUTM32601Universal Transverse Mercator
TransverseMercatorTM2154Transverse Mercator
LambertConformalLCC3347Lambert Conformal Conic

Случай UTM выдаёт код зоны 1. Проекты, которым нужна другая зона UTM или любой код EPSG вне этой таблицы, должны нести авторитетное описание CRS в строке datum в виде Well Known Text.

GeoRegistration::toPdfMeasureDictionary() выдаёт многострочный словарь: /Type /Measure, /Subtype /GEO, словарь системы координат /GCS, /GPTS, /LPTS и /Bounds, согласно ISO 32000-2:2020 §12.10 (таблица 269). Конкретное поведение:

  • /GCS выводится как << /Type /PROJCS /EPSG <code> /WKT (<datum>) >>. Код EPSG берётся из случая проекции. Значение /WKT — это строка datum в точности как передана; по умолчанию WGS84.
  • /GPTS перечисляет пары широта-долгота с шестью знаками после запятой в порядке контрольных точек.
  • /LPTS перечисляет пары pdfX/pdfY с шестью знаками после запятой в точности как переданы. ISO 32000-2:2020, таблица 269, определяет точки LPTS в 2D-единичном квадрате; передача нормализованных к единичному квадрату значений — ответственность вызывающей стороны.
  • /Bounds фиксировано как [0 0 0 1 1 1 1 0] — полный единичный квадрат.
  • Строка datum экранируется перед подстановкой в литеральную строку: обратная косая черта, скобки и распространённые управляющие символы заменяются на свои escape-последовательности с обратной косой чертой согласно ISO 32000-2:2020 §7.3.4.2. Датум под влиянием вызывающей стороны не может завершить литеральную строку или внедрить сырые токены PDF.

GeoPdfLayer хранит регистрации в порядке вставки, с ключом по индексу страницы от нуля. generateViewportDictionary() разрешает первую регистрацию для запрошенной страницы и возвращает пустую строку, когда её нет или когда isValid() равно false. Полученный словарь несёт /Type /Viewport, /BBox, вычисленный по минимальным и максимальным координатам PDF контрольных точек, /Name вида GeoViewport_Page<n> и встроенный словарь /Measure. Запись /Measure области просмотра следует ISO 32000-2:2020 §12.9. generateViewportArray() оборачивает словарь в скобки, порождая значение страницы /VP: массив словарей области просмотра согласно ISO 32000-2:2020 §7.7.3.3 (таблица 31). writeToPdfWriter() записывает /VP плюс литерал массива в BinaryBuffer из Core и сообщает, было ли что-то записано, чтобы сериализация страницы могла аккуратно опустить ключ.

  • Широта или долгота вне диапазона возбуждают InvalidArgumentException при конструировании; частично действительной координаты не существует.
  • fromDms() возбуждает исключение на неразбираемом вводе. Разобранные значения проходят через конструктор, поэтому синтаксически корректная строка со значениями вне диапазона также возбуждает исключение.
  • Нотация DMS не несёт высоты; fromDms() всегда даёт высоту 0.0.
  • GeoRegistration с менее чем двумя контрольными точками сообщает isValid() false, однако toPdfMeasureDictionary() всё равно выдаёт словарь с короткими массивами точек. Защищайте прямые вызовы через isValid() или направляйте вывод через GeoPdfLayer, который подавляет недействительные регистрации.
  • Дублирующиеся регистрации для одного индекса страницы полностью сохраняются в getRegistrations(); генерация области просмотра использует первую добавленную.
  • Отрицательный индекс страницы возбуждает InvalidArgumentException; индексы страниц отсчитываются от нуля.
  • Контрольные точки с общим значением X или Y порождают вырожденный /BBox нулевой ширины или высоты. Передавайте точки, охватывающие обе оси.
  • Весь вывод — сгенерированный текст. Ничего не пишется на диск или в сеть, и одинаковый ввод порождает одинаковый вывод.
  • В этом модуле не выполняются криптографические операции, поэтому нет поведения, специфичного для режима FIPS.
УтверждениеСтандартПункт
Словарь измерений выводится с подтипом GEO, с парами широта-долгота GPTS и парными значениями LPTS.ISO 32000-2:2020§12.10
Словарь области просмотра несёт записи BBox, Name и Measure.ISO 32000-2:2020§12.9
Значение страницы VP выводится как массив словарей области просмотра.ISO 32000-2:2020§7.7.3.3
Подстановка датума экранирует метасимволы литеральной строки.ISO 32000-2:2020§7.3.4.2

Все пункты перефразированы; NextPDF не воспроизводит нормативный текст. Это утверждения о возможностях, а не сертификаты. NextPDF не имеет сертификации и не предоставляет её. Коды EPSG — фиксированные репрезентативные значения для каждого случая проекции, а запись /WKT несёт переданную строку датума, а не сгенерированное описание Well Known Text; оба утверждения основаны на продукте. Проверяйте выведенный вывод GeoPDF в целевых интерактивных обработчиках PDF, прежде чем полагаться на измерения на стороне просмотрщика.

  • Доступно с nextpdf/pro 1.9.0; актуально в nextpdf/pro 3.1.0.
  • Проверяйте isValid() перед прямым вызовом toPdfMeasureDictionary(); GeoPdfLayer выполняет эту проверку за вас.
  • Когда нижестоящие потребители разбирают /WKT, передавайте полное описание Well Known Text как datum; значение по умолчанию WGS84 — лишь метка датума.
  • Нормализуйте входные данные LPTS к единичному квадрату перед конструированием контрольных точек, когда границы области просмотра отличаются от ваших значений в пространстве PDF.
  • Стоимость вывода линейна по количеству контрольных точек; поиск в GeoPdfLayer линеен по количеству регистраций.
  • writeToPdfWriter() интегрируется с сериализацией страницы через NextPDF\Support\BinaryBuffer из Core.

Эта страница документирует только внешне наблюдаемое поведение и поддерживаемую публичную поверхность API. Внутренние пути пространств имён, вспомогательные классы, таблицы механизмов, имена файлов runbook и префиксы тикетов вне области рассмотрения.