Skip to content

Commit

Permalink
Fix bugs in GUI. Update readme.
Browse files Browse the repository at this point in the history
  • Loading branch information
xmd5a2 committed Dec 16, 2020
1 parent 8e098b7 commit 50d7012
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 29 deletions.
31 changes: 17 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ QGIS-xtopo это набор инструментов, предназначен

* **Windows 10 x64** версия 1903 или более поздняя со сборкой 18362 или более поздней версии, или **Linux x64** любой (в теории) версии, где запустится **docker**.

**Проект состоит из трёх частей:**
### Структура проекта

Проект состоит из трёх частей:

1. Проект [QGIS](https://qgis.org/ru/site/) с топографическим картостилем.
2. Скрипты для подготовки данных для проекта [QGIS](https://qgis.org/ru/site/) на основе [OpenStreetMap](https://www.openstreetmap.org/) и данных рельефа, локальный [Overpass API](https://wiki.openstreetmap.org/wiki/RU:Overpass_API) сервер.
Expand All @@ -41,52 +43,53 @@ QGIS-xtopo это набор инструментов, предназначен


### Содержание
1. [Установка](https://github.com/xmd5a2/qgis-xtopo#1-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0)
0. [**Установка**](https://github.com/xmd5a2/qgis-xtopo#1-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0)
1. **Работа с графическим интерфейсом**
2. [Инициализация](https://github.com/xmd5a2/qgis-xtopo#2-%D0%B8%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F)
3. [Подготовка данных](https://github.com/xmd5a2/qgis-xtopo#3-%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85)
4. [Настройка](https://github.com/xmd5a2/qgis-xtopo#4-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0)
5. [Получение и обработка данных OSM, обработка рельефа](https://github.com/xmd5a2/qgis-xtopo#5-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-osm-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-%D1%80%D0%B5%D0%BB%D1%8C%D0%B5%D1%84%D0%B0)
6. [Запуск QGIS](https://github.com/xmd5a2/qgis-xtopo#6-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA-qgis)
7. [Работа с QGIS](https://github.com/xmd5a2/qgis-xtopo#7-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-qgis)
7. [**Работа с QGIS**](https://github.com/xmd5a2/qgis-xtopo#7-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-qgis)
8. [Удаление QGIS-xtopo](https://github.com/xmd5a2/qgis-xtopo#8-%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-qgis-xtopo)

### 1. Установка
### 0. Установка
#### Windows:
1. [Установить docker](https://docs.docker.com/get-docker/)

Если после перезагрузки появится окно *"WSL 2 installation is incomplete"* то, не закрывая его, перейдите [по ссылке](https://aka.ms/wsl2kernel) в сообщении. В разделе **"Скачивание пакета обновления ядра Linux"** скачайте и установите файл по ссылке **"Скачайте последнюю версию пакета обновления ядра Linux в WSL 2"**. После этого в окне *"WSL 2 installation is incomplete"* нажмите *Restart* либо перезагрузите компьютер. После запуска убедитесь что *docker* работает:
* В области системных уведомлений слева от часов найдите скрытый (над стрелочкой) значок с белым корабликом, откройте окно менеджера *docker* и убедитесь что слева внизу окна есть надпись с зелёным кругом: *"Docker running"*. Если круг красный то возможно требуется переустановить *docker*, либо доустановить компоненты *WSL 2*.
* В области системных уведомлений слева от часов найдите скрытый (над стрелочкой) значок с белым корабликом, откройте окно менеджера *docker* и убедитесь что слева внизу окна есть надпись с зелёным кругом: *"Docker running"*. Если круг красный то попробуйте перезагрузиться. Если не помогло то возможно требуется переустановить *docker* либо доустановить компоненты *WSL 2*.

![docker tray](/docs/docker_tray.png) ![docker status](/docs/docker_status.png)

2. [Установить VcXsrv X Server](https://sourceforge.net/projects/vcxsrv/) (Next -> Install -> Close) для запуска QGIS (проще говоря графического интерфейса для подготовки карты) из *docker* контейнера.

3. [Скачать графический интерфейс для подготовки данных](https://github.com/xmd5a2/qgis-xtopo/releases/latest): **qgis-xtopo-gui.exe**. Как таковой установки программа не требует. Её нужно просто запустить.




#### Linux:
1. [Установить docker](https://docs.docker.com/get-docker/)

Нужно настроить запуск *docker* из под обычного пользователя: [инструкция](https://docs.docker.com/engine/install/linux-postinstall/). Все дальнейшие действия **не требуют прав суперпользователя (root)**.

2. [Скачать графический интерфейс для подготовки данных](https://github.com/xmd5a2/qgis-xtopo/releases/latest): **qgis-xtopo-gui**. Установки не требует. Нужно просто запустить.

или (для работы из командной строки)
*или (для работы из командной строки)*

```
docker pull xmd5a2/qgis-xtopo:latest&&mkdir -p qgis-xtopo&&a=(run prepare_data populate_db exec_qgis clean)&&rm -f qgis-xtopo/*.*&&for f in "${a[@]}";do wget -nv -nc https://github.com/xmd5a2/qgis-xtopo/raw/master/docker_${f}.sh -P ./qgis-xtopo;done&&cd qgis-xtopo&&chmod +x *.sh
```
В текущем каталоге будет создан каталог **qgis-xtopo**, откуда необходимо запускать все последующие скрипты, либо использовать команды `прямого запуска docker` (приведены в справке как альтернативный вариант). _**Этот шаг нужен только для удобства запуска. Его можно пропустить если вы хотите запускать docker из командной строки**_. Требуется **wget**.

### 1. Работа с графическим интерфейсом


### 2. Инициализация
Для инициализации QGIS-xtopo необходимы:
* **Каталог, в котором будут храниться данные проекта**. Его размер может достигать 10-20 Гб и более, в зависимости от размера обрабатываемой области, поэтому убедитесь что на устройстве достаточно свободного места.
* **(опционально) Каталог, в котором хранятся исходные данные рельефа (полный набор для всего мира)**. Если у вас уже скачаны эти данные то путь к этому каталогу необходимо указать при инициализации через `docker_run` ниже. Путь не должен содержать пробелов! Не уверены - пропускайте.

Запустите скрипт `docker_run` в каталоге **qgis-xtopo**, скачанном на **[шаге 1.2](https://github.com/xmd5a2/qgis-xtopo#1-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0)**, с параметрами. Их имена (-n, -d и т.п.) и значения разделяются пробелами. Нужно указать минимум **1** параметр: **путь_к_каталогу_с_проектами**.
Запустите скрипт `docker_run` в каталоге **qgis-xtopo**, скачанном на **[шаге 0.2](https://github.com/xmd5a2/qgis-xtopo#1-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0)**, с параметрами. Их имена (-n, -d и т.п.) и значения разделяются пробелами. Нужно указать минимум **1** параметр: **путь_к_каталогу_с_проектами**.

**Пример:**
```
Expand Down Expand Up @@ -397,7 +400,7 @@ QGIS-xtopo это набор инструментов, предназначен
#### Windows:
1. Удалите *docker* средствами Windows (Пуск - Параметры - Приложения)
2. Удалите *VcXsrv* (там же)
3. Удалите файл **qgis-xtopo-gui.exe**, скачанный при установке в [**шаге 1.3**]
3. Удалите файл **qgis-xtopo-gui.exe**, скачанный при установке в [**шаге 0.3**](https://github.com/xmd5a2/qgis-xtopo#0-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0)

#### Linux:
1. Остановка контейнера *docker* и удаление образа
Expand All @@ -413,5 +416,5 @@ QGIS-xtopo это набор инструментов, предназначен
```
Каталог с проектами не удаляется автоматически во избежание потери данных. Если он вам больше не нужен то удалите его вручную.

2. Удалите каталог со скриптами, скачанный в [**шаге 1.2**](https://github.com/xmd5a2/qgis-xtopo#1-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0).
2. Удалите каталог со скриптами, скачанный в [**шаге 0.2**](https://github.com/xmd5a2/qgis-xtopo#0-%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0).
3. Удалите *docker* средствами вашей ОС
47 changes: 32 additions & 15 deletions gui/qgis-xtopo-gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ def get_translations(lang):
if default_locale.startswith("ua") or default_locale.startswith("by"):
default_locale = "ru"
remote_repo_name = 'xmd5a2/qgis-xtopo:latest'
local_repo_name = 'qgis-xtopo'
user_config_dir = appdirs.user_config_dir() + slash_str + "qgisxtopo"
user_config_filename = "settings.ini"
user_config_path = user_config_dir + slash_str + user_config_filename
Expand Down Expand Up @@ -95,7 +96,8 @@ def get_translations(lang):
[sg.Text('QGIS-xtopo', font='Any 20 bold', text_color="#CAF1C1")] +
[sg.Column([[]], size=(320, 50), pad=(0, 0))] +
[sg.Column([
[sg.Text(translations.get('free', 'Free') + ":", key="free_space_text", justification='right', text_color='#9BFF80',
[sg.Text(translations.get('free', 'Free') + ":", key="free_space_text", justification='right',
text_color='#9BFF80',
size=(10, 1), pad=(0, 0),
tooltip=translations.get('free_space_tooltip', 'Free space on selected disk drive')),
sg.Text('', key="free_space", text_color='#9BFF80',
Expand Down Expand Up @@ -167,7 +169,7 @@ def get_translations(lang):
'Draw a rectangle, download OSM extract and select it with button to the right.'))
] +
[sg.Input(key='osm_files', disabled=True,
tooltip=translations.get('osm_data_files_tooltip', 'OSM data files list'), size=(37, 1)),
tooltip=translations.get('osm_data_files_tooltip', 'OSM data files list'), size=(37, 1), change_submits=True),
sg.FilesBrowse(
file_types=(("pbf", "*.pbf"), ("o5m", "*.o5m"), ("osm xml", "*.osm"), ("osm xml in bz2", "*.osm.bz2")),
key='select_osm_files', button_text=translations.get('browse', 'Browse'), size=(10, 1),
Expand Down Expand Up @@ -339,6 +341,7 @@ def main():
if os.path.isfile(temp_dir + slash_str + "config.original"):
copyfile(temp_dir + slash_str + "config.original", config_path)
read_config_update_ui(values, values["qgis_projects_dir"] + slash_str + "qgisxtopo-config", False)
window.Elem('terrain_input_dir').update(get_terrain_input_dir({'qgis_projects_dir': qgis_projects_dir_default, 'project_name': project_name_default}))
if event == 'button_ru':
translations = get_translations("ru")
update_layout_translations(values)
Expand All @@ -360,12 +363,15 @@ def main():
window.Elem('calc_tiles_list').update('')
window.Elem('total_tiles_value').update('')
if event == 'qgis_projects_dir':
convert_slash_update_ui(values, event)
try:
os.mkdir(values['qgis_projects_dir'] + slash_str + "test764451")
os.rmdir(values['qgis_projects_dir'] + slash_str + "test764451")
except Exception:
window.Elem('qgis_projects_dir').update('')
sg.Popup(translations.get('qgis_projects_dir_not_writable', 'QGIS projects directory is not writable. Choose another directory.'), title=translations.get('Error', 'Error'))
sg.Popup(translations.get('qgis_projects_dir_not_writable',
'QGIS projects directory is not writable. Choose another directory.'),
title=translations.get('Error', 'Error'))
continue
update_user_config('qgis_projects_dir', values['qgis_projects_dir'])
config_dir = values["qgis_projects_dir"] + slash_str + "qgisxtopo-config"
Expand All @@ -379,6 +385,8 @@ def main():
str(get_free_space(values["qgis_projects_dir"])) + " " + translations.get('gb', 'Gb'))
update_free_text_color(values)
window.Elem('terrain_input_dir').update(get_terrain_input_dir(values))
if event == 'osm_files':
convert_slash_update_ui(values, event)
if event == 'open_osm':
webbrowser.open(r'https://www.openstreetmap.org')
if event == 'open_klokantech':
Expand Down Expand Up @@ -422,6 +430,8 @@ def main():
window.Elem('open_terrain_input_dir').update(disabled=True)
if event == 'open_terrain_input_dir':
terrain_input_dir = get_terrain_input_dir(values)
if not os.path.isdir(terrain_input_dir):
os.makedirs(terrain_input_dir, exist_ok=True)
webbrowser.open(os.path.realpath(terrain_input_dir))
if event == 'Copy':
if command:
Expand Down Expand Up @@ -486,6 +496,12 @@ def main():
command_to_run = r'docker '


def convert_slash_update_ui(values, element):
if os.name == "nt":
values[element] = values[element].replace('/', '\\')
window.Elem(element).update(values[element].replace('/', '\\'))


def update_free_text_color(values):
if get_free_space(values["qgis_projects_dir"]) > 10:
window.Elem('free_space').update(text_color='#9BFF80')
Expand Down Expand Up @@ -861,14 +877,21 @@ def read_config_update_ui(values, config_dir, init):
window.Elem('terrain_src_dir').update(terrain_src_dir_gui_setting)


def get_working_repo_name():
if os.path.isfile('config_debug.ini') or os.path.isfile('./../config_debug.ini'):
if os.name == "posix": # Debug with local docker image is only for Linux
return 'qgis-xtopo'
else:
return remote_repo_name
else:
return remote_repo_name


def copy_config_original(config_original_path):
command = "docker rm -f qgis-xtopo"
runCommand(command, window)
command = "docker run -dti --name qgis-xtopo"
if os.path.isfile('config_debug.ini') or os.path.isfile('./../config_debug.ini'):
command += ' ' + 'qgis-xtopo'
else:
command += ' ' + remote_repo_name
command += ' ' + get_working_repo_name()
runCommand(command, window)
config_original = subprocess.check_output(['docker', 'exec', 'qgis-xtopo', 'cat', '/app/config.ini'],
stdin=subprocess.PIPE, stderr=subprocess.STDOUT)
Expand Down Expand Up @@ -996,10 +1019,7 @@ def init_config(path, values):
params += f"-e PROJECT_NAME_EXT={project_name} "
if qgis_projects_dir:
params += f"--mount type=bind,source={qgis_projects_dir},target=/mnt/qgis_projects "
if os.path.isfile('config_debug.ini') or os.path.isfile('./../config_debug.ini'):
params += 'qgis-xtopo'
else:
params += remote_repo_name
params += get_working_repo_name()
command = command_to_run + params
runCommand(cmd=command, window=window)
init_docker(False)
Expand Down Expand Up @@ -1040,10 +1060,7 @@ def compose_params(values, run_chain):
params += f"--mount type=bind,source={qgis_projects_dir},target=/mnt/qgis_projects "
if use_terrain_src_dir and values['terrain_src_dir']:
params += f"--mount type=bind,source={values['terrain_src_dir']},target=/mnt/terrain "
if os.path.isfile('config_debug.ini') or os.path.isfile('./../config_debug.ini'):
params += 'qgis-xtopo'
else:
params += remote_repo_name
params += get_working_repo_name()
return params


Expand Down

0 comments on commit 50d7012

Please sign in to comment.