Более

Как заставить GDAL печатать слои GeoPDF и сказать, какие из них растровые или векторные

Как заставить GDAL печатать слои GeoPDF и сказать, какие из них растровые или векторные


Моя цель: я хотел бы использовать GDAL для преобразования GeoPDF. Мне нужны векторные слои как файлы shp, а растровые слои как файлы tif. Я хочу сделать это программно.

Изменить: на самом деле я хочу сделать это со многими геопространственными PDF-файлами. Я создаю прототип рабочего процесса с помощью Python, но, вероятно, в конечном итоге это будет C ++. (Конец редактирования)

Проблема: Естественно, команда для преобразования векторного слоя отличается от растрового слоя. И я не знаю (опять же программно), какие слои векторные, а какие растровые.

Что я пробовал: Во-первых, вот мои образцы данных https://www.terragotech.com/images/pdf/webmap_urbansample.pdf.

gdalinfo webmap_urbansample.pdf -mdd СЛОИ

дает имена слоев:

… Метаданные (LAYERS): LAYER_00_NAME = Layers LAYER_01_NAME = Layers.BPS _-_ Water_Sources LAYER_02_NAME = Layers.BPS _-_ Facility LAYER_03_NAME = Layers.BPS _-_ Buildings LAYER_04_NAME = Layers.Sewerage_NAME__NAME_04_NAME = Layers. LAYER_08_NAME = Layers.Sewerage_Jump-Ups LAYER_09_NAME = Layers.Sewerage_Lines LAYER_10_NAME = Layers.Water_Lines LAYER_11_NAME = Layers.Cadastral_Boundaries LAYER_12_NAME = Layers.Raster_Images…

Я знаю, что нужно смотреть на данные, которые являются векторными и растровыми, но я не знаю, как анализировать эту информацию, чтобы узнать, использовать ли ogr2ogr или gdal_translate для преобразования.

Тогда я подумал, что могу использоватьогринфои просто разделите все слои, чтобы определить, какие из них растровые, ноогринфодает мне:

… 1: Кадастровые границы (многоугольник) 2: Водопроводы (линейная строка) 3: Канализационные линии (линейная строка) 4: Скачки для канализации (линейная строка) 5: Дороги 6: точки водоснабжения (точка) 7: Канализационные насосные станции ( Точка) 8: Отверстия канализационного люка (Точка) 9: BPS - Здания (многоугольник) 10: BPS - Сооружения (многоугольник) 11: BPS - Источники воды (точка)

Таким образом, нет однозначного соответствия с тем, как они выводятся.

Кто-нибудь знает, как заставить gdal печатать слои GeoPDF и указывать, какие растровые или векторные?


На самом деле это не ответ, но я кое-что использовал в качестве обходного пути.

Скрипт сравнивает текст слоев между gdalinfo и ogrinfo, чтобы определить, какие из них являются растровыми. Однако этот подход не является окончательным, поэтому я полагаю, что время от времени он может ошибаться. Даже в этом примереLAYER_00_NAME = Слоина самом деле не является растровым слоем.

def GetRasterVectorLayers (filename): from osgeo import gdal from osgeo import ogr from difflib import SequenceMatcher # получить векторные слои с ogr data_ogr = ogr.Open (filename) if data_ogr: vector_layers = [data_ogr.GetLayer (i) .GetName () for i in range (data_ogr.GetLayerCount ())] else: vector_layers = [] # получить все слои с помощью gdal data_gdal = gdal.Open (filename, gdal.GA_ReadOnly) Layers = data_gdal.GetMetadata_List ("LAYERS") # снять этикетку, например , LAYER_00_NAME = Layers Layers = [layer.split ('=') [- 1] для слоя в слоях] # сопоставьте текст, чтобы определить, какие слои являются векторными или растровыми. Matched_layers = [] для vector_layer в vector_layers: layer_matches = [] для слой в слоях: layer_matches.append ([SequenceMatcher (None, vector_layer, layer) .ratio (), layer]) layer_matches.sort () best_match = layer_matches [-1] [1] # -1 получает наивысший балл, 1 получает имя слоя gdalinfo matched_layers.append ([vector_layer, best_match]) Layers_vector = [match [1] для соответствия в matched_layers] слоях _raster = [слой для слоя в слоях, если слой не в Layers_vector] вернуть [Layers_raster, Layers_vector] Layers_raster, Layers_vector = GetRasterVectorLayers ('webmap_urbansample.pdf') sizes_raster # ['Layers', 'Layers.Raster_Images'] Layers_vector # ['Layers .Cadastral_Boundaries ',' Layers.Water_Lines ',' Layers.Sewerage_Lines ',' Layers.Sewerage_Jump-Ups ',' Layers.Roads ',' Layers.Water_Points ',' Layers.Sewerage_Pump_Stations ',' Layers. .BPS _-_ Buildings ',' Layers.BPS _-_ Facilities ',' Layers.BPS _-_ Water_Sources ']

Боюсь, что создатель PDF-файла должен решать, как назвать и пронумеровать растровые и векторные слои. Новые листы топологии USGS объединяют GeoPDF и образец файла (NM_Santa_Fe_20131108_TM_geo.pdf) имеет следующий вывод от gdalinfo:

LAYER_00_NAME = Map_Collar LAYER_01_NAME = Map_Collar.Map_Elements LAYER_02_NAME = Map_Frame LAYER_03_NAME = Map_Frame.Projection_and_Grids LAYER_04_NAME = Map_Frame.Geographic_Names LAYER_05_NAME = Map_Frame.Structures LAYER_06_NAME = Map_Frame.Transportation LAYER_07_NAME = Map_Frame.Transportation.Road_Names_and_Shields LAYER_08_NAME = Map_Frame.Transportation.Road_Features LAYER_09_NAME = Map_Frame.Transportation .Trails LAYER_10_NAME = Map_Frame.Transportation.Railroads LAYER_11_NAME = Map_Frame.Transportation.Airports LAYER_12_NAME = Map_Frame.PLSS LAYER_13_NAME = Map_Frame.Hydrography LAYER_14_NAME = Map_Frame.Hydrography LAYER_14_NAME = Map_Frame.Terrain Map_rame_rame_15. LAYER_18_NAME = Map_Frame.Boundaries LAYER_19_NAME = Map_Frame.Boundaries.Jurisissional_Boundaries LAYER_20_NAME = Map_Frame.Boundaries.Jurisissional_Boundaries.International LAYER_21_NAME = Map_Frame.Boundaries.Jurisissional_Boundaries.State_or_Frame_22 ndaries.Jurisdictional_Boundaries.County_or_Equivalent LAYER_23_NAME = Map_Frame.Boundaries.Federal_Administered_Lands LAYER_24_NAME = Map_Frame.Boundaries.Federal_Administered_Lands.National_Park_Service LAYER_25_NAME = Map_Frame.Boundaries.Federal_Administered_Lands.Department_of_Defense LAYER_26_NAME = Map_Frame.Boundaries.Federal_Administered_Lands.Forest_Service LAYER_27_NAME = Изображения LAYER_28_NAME = Images.Orthoimage

Слои упорядочены иерархически, подслои имеют одну или несколько точек в имени. Слой 00, 02, 06, 14, 18, 19, 23 и 27 - это метаслои, комбинация следующих подслоев.

Ogrinfo сообщает:

1: Map_Collar 2: Map_Collar_Map_Elements 3: Map_Frame_Projection_and_Grids 4: Map_Frame_Geographic_Names (многоканальный строка) 5: Map_Frame_Structures 6: Map_Frame_Transportation_Road_Names_and_Shields 7: Map_Frame_Transportation_Road_Features 8: Map_Frame_PLSS 9: Map_Frame_Hydrography 10: Map_Frame_Terrain_Contours 11: Map_Frame_Woodland 12: Map_Frame_Boundaries_Federal_Administered_Lands_Forest_Service

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

Если вы хотите извлечь все векторные слои, вы можете использовать

ogr2ogr -f sqlite out.sqlite in.pdf

Если вы попробуете это с помощью растровых команд GDAL, он попытается растрировать ваши векторные данные, что может занять некоторое время. Таким образом, вы должны явно указать имя растрового слоя для каждого слоя:

gdalwarp -co "TILED = YES" -co "TFW = YES" rumney_farmforest_geopdf.pdf rumtif01.tif -overwrite --config GDAL_PDF_LAYERS "Graphic_Outline_ (display_only)"

Смотреть видео: How to Create a GeoPDF