В октябре Минимущества Московской области отчиталось, что за 2021 год был начислено 410 млн рублей штрафов за борщевик Сосновского в Подмосковье. В этой заметке расскажу, как сейчас собирают штрафы в МО, и как мы сделали свой прототип программы для поиска владельцев участков с растущим борщевиком Сосновского.
По данным со спутника сейчас точно нельзя выписывать штрафы:
Сегодня самым реалистичным является использование спутниковых карт для того, чтобы координировать работу земельных инспекторов. На основе оперативно обновляющихся карт распространения борщевика можно выбирать участки для проверки для направления туда инспекторов или организации съёмки с БПЛА для проверки и фиксации нарушений.
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 году Минсельхоз Московской области разместил закупку карты борщевика по Московской области. По какой-то причине эту закупку карты борщевика совместили с закупкой картой классификации с/х урожая и предоставлению карты о составах почв, которую вероятно надо было купить у третьей стороны. Такое объединение разных карт, возможно, существенно ограничило список участников, победил в закупке Институт космических исследований Земли. Интересно посмотреть, будет ли карта выложена в общий доступ.
Как вообще выписывают штрафы за борщевик Сосновского?
Ниже будет пересказ заседания комитета Мособлдумы от 30 мая 2021 года. Запись заседания доступна на Youtube.- Основным драйвером для проверок и выписывания штрафов являются обращения граждан.
- Если поступают обращения на борщевик на муниципальных землях, то его обрабатывают за счёт бюджетных средств. Если на частных - то направляют предписания и потом штрафы.
- Альтернативно, земельные инспектора проводят выборочные проверки. Выбор участков происходит на основе рисковых критериев. Всего критериев 12. Учитываются такие общие критерии, как категория земель, вид разрешённого использования, площадь, наличие границ, форма и вид собственности и т.д.
- Эффективность такого риск-ориентированного подхода невысока. Из осмотренных с подозрением на борщевик 13 тыс. участков, только 18% осмотренных участков содержат борщевик. По сообщениям из СМИ штрафы за борщевик составляют большую часть от общего числа штрафов, поэтому процент участков с борщевиком можно использовать как весомый критерий для оценки эффективности работы системы.
Как можно использовать карты распространения борщевика Сосновского для контроля за распространением борщевика и выявления нарушений?
О том, какие бывают карты распространения борщевика Сосновского и как мы делали свою карту, можно прочитать в моей предыдущей заметке.По данным со спутника сейчас точно нельзя выписывать штрафы:
- Несертифицируемые в РФ спутники
- Сейчас в качестве основного источника ДЗЗ для картографирования борщевика в большинстве случаев используются данных спутников Sentinel-2. Этими спутниками владеет и управляет Европейское Космическое Агентство. Вряд ли, когда-нибудь иностранные спутники будут использоваться для каких-либо юридически значимых действий в РФ.
- Переход на данные российских спутников, если даже спутник будет удовлетворять по набору каналов, как минимум, потребует переобучения моделей и выделения спутникового ресурса для съёмки всех интересующих территорий.
- Сложно сертифицируемые ML-модели
- На спутниковом снимке с типовым разрешением от 1 до 10 метров на пиксель борщевик объективно сам по себе не виден. На рисунке ниже приведено одно и то же место с борщевиком в разных разрешениях, соответствующих спутникам Sentinel-2, коммерческим высокоточным спутникам и БПЛА.
ML модели определения борщевика по спутниковым снимкам используют больше информации, чем может увидеть человек, поэтому сертификация таких моделей сегодня остается нетривиальной задачей.
- На спутниковом снимке с типовым разрешением от 1 до 10 метров на пиксель борщевик объективно сам по себе не виден. На рисунке ниже приведено одно и то же место с борщевиком в разных разрешениях, соответствующих спутникам Sentinel-2, коммерческим высокоточным спутникам и БПЛА.
Сегодня самым реалистичным является использование спутниковых карт для того, чтобы координировать работу земельных инспекторов. На основе оперативно обновляющихся карт распространения борщевика можно выбирать участки для проверки для направления туда инспекторов или организации съёмки с БПЛА для проверки и фиксации нарушений.
Как собрать свой прототип поиска владельцев участков с борщевиком?
Я не буду приводить здесь полный листинг кода, а опишу основные архитектурные решения с ключевыми функциями: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 году Минсельхоз Московской области разместил закупку карты борщевика по Московской области. По какой-то причине эту закупку карты борщевика совместили с закупкой картой классификации с/х урожая и предоставлению карты о составах почв, которую вероятно надо было купить у третьей стороны. Такое объединение разных карт, возможно, существенно ограничило список участников, победил в закупке Институт космических исследований Земли. Интересно посмотреть, будет ли карта выложена в общий доступ.
Находим нарушителей на миллионы рублей при помощи борщевика и Python
В октябре Минимущества Московской области отчиталось, что за 2021 год был начислено 410 млн рублей штрафов за борщевик Сосновского в Подмосковье . В этой заметке расскажу, как сейчас собирают штрафы в...
habr.com