Использование пользовательских выражений Python

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

Обзор задачи

Мы определим пользовательскую функцию которая находит на UTM зону на для выбранных объектов и используем эту функцию для написания выражения которое отражает UTM зону как подпись к карте, появляющуюся при наведении на точку.

Вы освоите так же такие навыки:

  • Как использовать инструмент “Интерактивные подписи” для отображения пользовательского текста при наведении на объект.

Получение данных

Мы используем набор данных “Natural Earth’s Populated Places ” (слой населения Земли) Скачайте простой (без колонок) набор данных. <http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places_simple.zip>`_

Для удобства вы можете скачать копии набора данных по ссылке ниже:

ne_10m_populated_places_simple.zip

Методика

  1. Откройте QGIS и перейдите в Меню - > Слои -> Вектор - > Добавить векторный слой

../_images/129.png
  1. Перейдите к загруженному файлу Shapefiles.zip и выберите его. Нажмите Открыть.

../_images/220.png
  1. Перейдите

../_images/313.png
  1. Switch to the Function Editor tab. Here you can write any PyQGIS code that will be executed by the expression engine.
../_images/49.png
  1. Мы определим пользовательскую функцию с именем “GetUtmZone”, которая будет рассчитывать номер UTM зоны для каждого объекта. Пользовательские функции в QGIS работают на уровне объектов. Мы используем центра геометрического объекта и вычислим UTM зону по широте и долготе центра объекта. Мы так же добавим ‘N’ и ‘S’ обозначения к зоне, для того что бы определить к какому из полушарий - северному или южному относится зона. Введите следующий код в редактор, именем файла назначьте ``utm_zones.py` и нажмите Сохранить файл.

Примечание

UTM зоны это зависящие от долготы зоны с порядковыми номерами от 1 до 60. Ширина каждой зоны составляет 6 градусов. Здесь мы используем простую математическую формулу, что бы найти соответствующую зону для заданного значения долготы. Обратите внимания что данная формула не позволяет определить некоторые специальные UTM зоны.

import math
from qgis.core import *
from qgis.gui import *

@qgsfunction(args=0, group='Custom', usesgeometry=True)
def GetUtmZone(value1, feature, parent):
    centroid = feature.geometry()
    longitude = centroid.asPoint().x()
    latitude = centroid.asPoint().y()
    zone_number = math.floor(((longitude + 180) / 6) % 60) + 1

    if latitude >= 0:
        zone_letter = 'N'
    else:
        zone_letter = 'S'

    return '%d%s' % (int(zone_number), zone_letter)
../_images/59.png
  1. Нажмите Запустить скрипт. Это запустит python скрипт и зарегистрирует функцию ” GetUtmZone” с помощью движка выражений. Обратите внимание что это необходимо делать только один раз. С того момента как функция зарегистрирована, она будет всегда доступна в движке выражений.

../_images/68.png
  1. Перейдите на вкладку Выражения в окне выбрать объекты удовлетворяющие условию dialog.

$GetUtmZone = '40N'
../_images/78.png
  1. Back in the main QGIS window, you will see many points highlighted in yellow. These are the points falling in the UTM Zone we specified in the expression.
../_images/88.png
  1. You saw how we defined and used a custom function to select features by expression. We will now use the same function in another context. One of the hidden gems in QGIS is the Map Tip tool. This tool shows user-defined text when you hover over a feature. Right-click the ne_10m_populated_places_simple layer and select Properties.
../_images/98.png
  1. Switch to the Display tab and select HTML. Here you can enter any text that will be displayed when you hover over the features of the layer. Even better, you can use layer field values and expressions to define a much more useful message. Click on the Insert expression... button.
../_images/108.png
  1. You will see the familiar expression editor again. We will use the concat function to join the value of the field name and the result of our custom function $GetUtmZone. Enter the following expression and click OK.
concat("name", ' | UTM Zone: ', $GetUtmZone)
../_images/1111.png
  1. You will see the expression entered as the value of the Display text. Click OK.
../_images/1210.png
  1. Before we proceed, let us de-select the features that were selected in the previous step. Go to View ‣ Select ‣ Deselect Features from All Layers.
../_images/137.png
  1. Activate the Map Tips tool by going to View ‣ Map Tips.
../_images/147.png
  1. Zoom into any area of the map and put your mouse cursor over any feature. You will see the name of the city and corresponding UTM zone displayed as the map tip.
../_images/157.png
comments powered by Disqus

This work is licensed under a Creative Commons Attribution 4.0 International License