В октябре Минимущества Московской области отчиталось, что за 2021 год был начислено 410 млн рублей штрафов за борщевик Сосновского в Подмосковье. В этой заметке расскажу, как сейчас собирают штрафы в МО, и как мы сделали свой прототип программы для поиска владельцев участков с растущим борщевиком Сосновского.

Как вообще выписывают штрафы за борщевик Сосновского?

Ниже будет пересказ заседания комитета Мособлдумы от 30 мая 2021 года. Запись заседания доступна на Youtube.

  • Основным драйвером для проверок и выписывания штрафов являются обращения граждан.

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

  • Альтернативно, земельные инспектора проводят выборочные проверки. Выбор участков происходит на основе рисковых критериев. Всего критериев 12. Учитываются такие общие критерии, как категория земель, вид разрешённого использования, площадь, наличие границ, форма и вид собственности и т.д.

  • Эффективность такого риск-ориентированного подхода невысока. Из осмотренных с подозрением на борщевик 13 тыс. участков, только 18% осмотренных участков содержат борщевик. По сообщениям из СМИ штрафы за борщевик составляют большую часть от общего числа штрафов, поэтому процент участков с борщевиком можно использовать как весомый критерий для оценки эффективности работы системы.

Как можно использовать карты распространения борщевика Сосновского для контроля за распространением борщевика и выявления нарушений?

О том, какие бывают карты распространения борщевика Сосновского и как мы делали свою карту, можно прочитать в моей предыдущей заметке.

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

  • Несертифицируемые в РФ спутники

    • Сейчас в качестве основного источника ДЗЗ для картографирования борщевика в большинстве случаев используются данных спутников Sentinel-2. Этими спутниками владе��т и управляет Европейское Космическое Агентство. Вряд ли, когда-нибудь иностранные спутники будут использоваться для каких-либо юридически значимых действий в РФ.

    • Переход на данные российских спутников, если даже спутник будет удовлетворять по набору каналов, как минимум, потребует переобучения моделей и выделения спутникового ресурса для съёмки всех интересующих территорий.

  • Сложно сертифицируемые ML-модели

    • На спутниковом снимке с типовым разрешением от 1 до 10 метров на пиксель борщевик объективно сам по себе не виден. На рисунке ниже приведено одно и то же место с борщевиком в разных разрешениях, соответствующих спутникам Sentinel-2, коммерческим высокоточным спутникам и БПЛА.

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

В то же время по данным с БПЛА уже сейчас можно реализовать автоматизированную систему по выписке предписаний и дальнейшим действиям. Конкретные ввозимые беспилотники и камеры волне можно сертифицировать для использования в качестве достоверных средств измерения. А по снимкам с БПЛА вполне можно даже человеку определить борщевик. В данном случае снимки с БПЛА вполне можно считать просто цифровой фотографией, как будто бы сделанной обычным смартфоном с воздуха.

Сегодня самым реалистичным является использование спутниковых карт дл�� того, чтобы координировать работу земельных инспекторов. На основе оперативно обновляющихся карт распространения борщевика можно выбирать участки для проверки для направления туда инспекторов или организации съёмки с БПЛА для проверки и фиксации нарушений.

Как собрать свой прототип поиска владельцев участков с борщевиком?

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

1. На входе имеем geojson слой с распознанным борщевиком Сосновского.

Может быть и другой формат, но берём за основу, что карта есть.

Это может быть как одна из доступных открытых карт, так и вариант, что борщевик Сосновского оп��еделять мы научились. О том какие бывают карты, я писал в другой заметке.

2. Создаём сетку из точек с заданным шагом, отфильтровываем из них те, которые попадают в фигуры распознанного борщевика.

В примере ниже создаём сетку с шагом 49 на 49 метров, что чуть меньше 5x5 пикселей Sentinel-2.

import math

import fiona
import numpy as np
import shapely.geometry
import shapely.ops
import shapely.prepared

def get_borshevik_points(input_shape_filepath: str):
    lat_step_meters = 49
    long_step_meters = 49

    with fiona.open(input_shape_filepath, 'r') as source:
        shapes = [shapely.geometry.shape(feature['geometry']) for feature in source]
        combined_shape = shapely.ops.unary_union(shapes)
        shape_bbox = shapely.geometry.shape(combined_shape).buffer(0.01).bounds

    lat_step_degrees = lat_step_meters / 110540  # Latitude:  1 deg = 110.54 km
    long_step_degrees = long_step_meters / (
                111320 * math.cos(shape_bbox[3]))  # Longitude: 1 deg = 111.320*cos(latitude) km

    all_point_grid = [shapely.geometry.Point(lat, long) for lat in
                      np.arange(shape_bbox[0], shape_bbox[2], lat_step_degrees) for long in
                      np.arange(shape_bbox[1], shape_bbox[3], long_step_degrees)]

    prepared_shape = shapely.prepared.prep(combined_shape)

    borshevik_points_grid = list(filter(prepared_shape.contains, all_point_grid))
    return borshevik_points_grid

Из подводных камней стоит учесть, что запрос в API Росреестра отправляется в координатах WGS 84, то есть в градусах. В зависимости от координаты точки по широте, количество метров в 1 градусе долготы меняется. (см. формулу в коде)

На выходе получаем список точек с координатами для запроса кадастра.

3. По каждой отфильтрованной точке через неофициальный получаем API Росреестра будем запрашивать информацию куда эти точку попадают.

К сожалению, пару лет назад Росреестр закрыл публичную выгрузку кадастрового слоя, поэтому приходится пользоваться неофициальными инструментами. Для получения данных можно использовать библиотеку rosreestr-api, в которой по координатам будем получать номер кадастрового участка и квартала.

На этом шаге существует большой простор для оптимизаций алгоритма. Приведён самый лобовой вариант. Код ниже включает небольшую модификацию для запроса номера кадастрового квартала по координатам.

from rosreestr_api.clients import PKKRosreestrAPIClient

class PKKRosreestrAPIClientExtended(PKKRosreestrAPIClient):
SEARCH_UNIT_BY_COORDINATES_URL = PKKRosreestrAPIClient.SEARCH_OBJECT_BY_COORDINATES.format(object_type=2)

    def __init__(self):
        super().__init__()

    def get_unit_by_coordinates(self, *, lat, long, limit=11, tolerance=2) -> dict:
        url = self.SEARCH_UNIT_BY_COORDINATES_URL.format(
            lat=lat, long=long, limit=limit, tolerance=tolerance)
        return self._http_client.get(url).json()

def get_cadaster_data_from_coordinates(point_latitude: float, point_longitude: float):
    api_client = PKKRosreestrAPIClientExtended()
   
    cadaster_parcel_result = api_client.get_parcel_by_coordinates(long=point_longitude, lat=point_latitude)
    cadaster_unit_result = api_client.get_unit_by_coordinates(long=point_longitude, lat=point_latitude)

    return cadaster_parcel_result, cadaster_unit_result

По некоторым точкам запрос может не возвращать номер кадастрового участка, это муниципальные земли.

В результате работы у нас есть массив с координатными точками и номера кадастровых участков, к которыми эти точки относятся.

4. Дальше, зная номера кадастров, нужно запросить выписки по владельцам. Запросы в любом случае будут платными.

В зависимости от вашей конкретной ситуации (наличие привилегированного доступа к данным Росреестра, объем выписок, цели запросов) можно как автоматизировать работу с официальными сервисами Росреестра, так и воспользоваться внешними сервисами.

Следует иметь в виду, что владельцы участков могут оформить запрос и получить информацию о том, кто запрашивал информацию об их участках.

В этой связи одним из плюсов внешних сервисов является то, что в некоторых из них можно не использовать свой личный ключ к сервисам Росреестра, а воспользоваться ключом сервиса. Таким образом добавляется определённый слой анонимности в запросах.

Здесь не будет примеров кода, так как он сильно завязан на конкретного провайдера сервиса запросов.

Прочие мысли

Заметка - про процессы и технологии. Какой-либо позиции о том, хороши ли или эффективны штрафы за борщевик, я для себя так и не сформировал.

Всего по Московской области в 2021 году начислено 410 млн руб. Сколько из них реально собрано - детальной информации нет. При этом по муниципальным контрактам на борьбу с борщевиком Сосновского в 2021 году потрачено около 200 млн руб.

В 2021 году Минсельхоз Московской области разместил закупку карты борщевика по Московской области. По какой-то причине эту закупку карты борщевика совместили с закупкой картой классификации с/х урожая и предоставлению карты о составах почв, которую вероятно надо было купить у третьей стороны. Такое объединение разных карт, возможно, существенно ограничило список участников, победил в закупке Институт космических исследований Земли. Интересно посмотреть, будет ли карта выложена в общий доступ.