Как игнорировать «обработку плохих слоев» в QGIS?

11

У меня есть проект QGIS (2.14.3-Essen), который я использую как на работе, так и дома. Я держу все, кроме двух слоев с проектом.

Два оставшихся слоя очень большие - матрица высот и отмывка общим объемом более 20 ГБ - и они хранятся по-разному на работе и дома.

Я хотел бы игнорировать Handle Bad Layersдиалог и сохранить нарушенные пути для этих слоев. Мне часто все равно, они плохие; Я хочу внести изменения в другие части проекта.

Есть ли способ сделать это, чтобы игнорировать или пропустить диалог Обработка плохих слоев, чтобы я не потерял ссылку на слои, если не обновлю их?

Аарон
источник
Это то, что должно быть решено в QGIS. Это было бы не очень сложно сделать. Я бы порекомендовал получить этот фиксированный апстрим (например, дополнительные параметры в диалоговом окне: а) скрыть в этом сеансе б) исправить исходный путь в) удалить слой). Есть много компаний, которые будут рады сделать это для вас.
Матиас Кун
1
@Matthias Kuhn - Это очень хорошая идея, это был бы хороший путь вперед. Я пользуюсь услугами одного из консультантов в этом списке (не уверен, что назвал их готово?). Я буду исследовать возможность с ними. Спасибо
Мартин Хюги,
@ MartinHügi, ты добился прогресса в этом? Нечто подобное вызвало некоторое признание в списке рассылки lists.osgeo.org/pipermail/qgis-developer/2017-May/048450.html
Матиас Кун,
Нет, я не прогрессировал, я действительно забыл, потому что это стало одной из тех вещей, с которыми мы живем. Спасибо за напоминание, я могу задать вопрос нашему консультанту или это уже что-то происходит? @ Аарон - Как это сработало для тебя?
Мартин Хюги,
Я продолжаю использовать мой обходной путь. Два параллельных проекта QGIS - один для работы и один для дома.
Аарон

Ответы:

4

Просто сделайте отдельные копии из вашего файла проекта для домашнего и рабочего использования.

Сохраненные данные будут записаны в исходные файлы слоя, а не в файл проекта.

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


Другой вариант - обернуть файл VRT вокруг внешнего источника.

Пример примера растрового файла Geotif, созданного с помощью gdal_translate:

<VRTDataset rasterXSize="1656" rasterYSize="846">
  <GeoTransform> 2.0005201224994706e+005, 6.2653333397239589e+002, 0.0000000000000000e+000, 6.9906275735481549e+006, 0.0000000000000000e+000,-6.2653333397239589e+002</GeoTransform>
  <Metadata>
    <MDI key="TIFFTAG_RESOLUTIONUNIT">2 (pixels/inch)</MDI>
    <MDI key="TIFFTAG_XRESOLUTION">120</MDI>
    <MDI key="TIFFTAG_YRESOLUTION">120</MDI>
  </Metadata>
  <VRTRasterBand dataType="Byte" band="1">
    <ColorInterp>Red</ColorInterp>
    <SimpleSource>
      <SourceFilename relativeToVRT="1">testtif.tif</SourceFilename>
      <SourceBand>1</SourceBand>
      <SourceProperties RasterXSize="1656" RasterYSize="846" DataType="Byte" BlockXSize="1656" BlockYSize="1" />
      <SrcRect xOff="0" yOff="0" xSize="1656" ySize="846" />
      <DstRect xOff="0" yOff="0" xSize="1656" ySize="846" />
    </SimpleSource>
  </VRTRasterBand>
</VRTDataset>

и образец для шейп-файла:

<OGRVRTDataSource>
    <OGRVRTLayer name="testshp">
        <SrcDataSource>F:\Karten\vrt\testshp.shp</SrcDataSource>
            <SrcLayer>testshp</SrcLayer>
            <GeometryType>wkbPolygon</GeometryType>
            <LayerSRS>EPSG:31466</LayerSRS>
    </OGRVRTLayer>
</OGRVRTDataSource>

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

Andrej
источник
1
Создание отдельных проектов для дома и офиса является достойным обходным путем в данном конкретном случае. Однако существуют другие случаи, например, когда картографический сервис временно недоступен, когда вы хотите игнорировать уведомление о плохих слоях. Итак, еще раз я спрашиваю, есть ли способ игнорировать или пропустить диалог Обработка плохих слоев, чтобы не потерять ссылки на определенные слои?
Аарон
Можете ли вы предоставить более подробную информацию о файлах VRT, о том, что они из себя представляют и как начать работу. Из того, что я изучил, можно ли использовать VRT только для растров? А как насчет векторных файлов или удаленных слоев PostGIS, которые недоступны, если нет соединения? Как вы можете игнорировать эти «Обращаться с плохими слоями»?
Мартин Хюги
@ MartinHügi, вы также можете создать VRT для векторных файлов, но это все еще требует ручной работы: gdal.org/drv_vrt.html и paolocorti.net/2012/03/08/gdal_virtual_formats . Я скоро расширю свой ответ для некоторых примеров.
AndreJ
@AndreJ Спасибо, поэтому, просматривая эти ссылки, я ограниченно понимаю, что XML-файл действует как промежуточная карта для источника данных. Таким образом, QGIS «думает», что он там есть, даже если источник данных недоступен? GDAL - это то, что, по-видимому, будет полезно для понимания или, по крайней мере, для понимания.
Мартин Хюги
Да, вы просто обманываете обработчик ошибок QGIS.
AndreJ
3

Возможное решение - изменить файл проекта qgs, используя скрипт. Я обнаружил, что если вы замените источник данных на, <datasource>.</datsource>то он будет игнорировать всплывающее окно «Обработка плохих слоев».

Скрипт Python для запуска, если вы не хотите загружать определенные слои.

import fileinput

replaceNextLine = False

for line in fileinput.input('path\to\your\project.qgs', inplace=True):
    if replaceNextLine:
        print '<datasource>.</datasource>'
        replaceNextLine = False
    else:
        print line,

    if '<id>layer_name_whos_datasource_needs_to_change' in line:
        replaceNextLine = True

Сценарий Python, который нужно запустить, чтобы вставить соответствующий путь к источнику данных.

import fileinput

replaceNextLine = False

for line in fileinput.input('path\to\your\project.qgs', inplace=True):
    if replaceNextLine:
        print '<datasource>.\path\to\your\datasource</datasource>'
        replaceNextLine = False
    else:
        print line,

    if '<id>layer_name_whos_datasource_needs_to_change' in line:
        replaceNextLine = True

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

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

Ти Джей Рокфеллер
источник
Спасибо. Я понял концепцию, мне совершенно ясно, что теперь мне нужно потратить время, которое я хотел обойти, чтобы начать понимать основы использования Python. Сейчас я понял концепцию, потому что я вручную отредактировал файл project.qgs с помощью WordPad, чтобы изменить источник данных, и вернул его обратно. QGIS не игнорировал дескриптор плохих слоев, но, поскольку <ID> действует как заполнитель, я смог вернуться и отменить изменения. Так что да, я понимаю, я думаю.
Мартин Хюги,
Полагаю, это хорошее место для начала wiki.python.org/moin/BeginnersGuide
Мартин Хьюги,
@ MartinHügi, если это поможет, я получил основной шаблон для своего сценария из этого ответа stackoverflow /a/290494/4708150 Это объясняет логику сценария более подробно. Обязательно посмотрите на комментарии. Есть комментарий с самым высоким рейтингом, который объясняет, почему в конце оператора печати есть запятая.
Ти Джей Рокфеллер
1

Плагин ChangeDataSource сохраняет слои в файле, временно перемещая их в группу обработки плохих слоев. https://geogear.wordpress.com/2016/01/29/changedatasourceplugin-plugin-release-2-0/ Он должен делать то, что вы хотите. В прошлом году у меня была похожая проблема, и я заметил, что был плагин ChangeDataSource, который работал со слоями, но не обрабатывал плохие слои. Я упомянул, что обработка плохих слоев будет отличной особенностью в комментариях в блоге разработчика (Энрико Феррегути). В течение недели он добавил это!

Baswein
источник
Этот плагин не работал для меня, чтобы обрабатывать плохие слои. Я пробовал на двух разных ноутбуках - один с Win7, а другой с Win10. На обоих установлен QGIS 2.18.0. Я проверил «Обработка плохих слоев» и перезапустил QGIS после установки. QGIS по умолчанию для обработки плохих слоев продолжал всплывать, а не извещение плагина, которое он обнаружил, и обработал неверные источники данных.
Аарон
Не работает для меня сейчас тоже. Я дам знать разработчику.
Baswein
Я проверил, что плагин changeDataSource работает без проблем. Я исправляю некоторые необработанные условия, генерирующие исключения или сообщающие о ложной ошибке, и фиксирую в хранилище новую версию. [Если ваши проблемы сохраняются, сообщите об этом] ( github.com/enricofer/changeDataSource/issues ), указав наборы данных или шаги по их воспроизведению.
Энрико Феррегути
Для того, чтобы плагин всплыл, вам нужно запустить Qgis и затем открыть проект.
Baswein