Useful GIS notes and more
73 subscribers
22 photos
20 links
My notes on GIS and more
Download Telegram
Гайд: Зональная статистика в Python с Earth Engine.

Внутри:
— Шаблон для одновременного расчёта нескольких растров;
— Унифицированный редуктор (среднее/медиана/Стандартное отклонение/дисперсия/мин/макс за один проход — экономит квоты и время);
— Конвертация в GeoDataFrame (geopandas)
— Экспорт в GPKG/CSV + загрузка на Google Диск;
— Наглядные карты (рельеф, NDVI, температура почвы).
— Кодовые ячейки — как в блокноте, 1:1.

В конце статьи есть ссылка на готовый блокнот Colab.

https://medium.com/@anton.biatov/zonal-statistics-in-python-using-earth-engine-and-google-colab-7101d1d42ffd

#gee #colab #python
🔥1
Супер быстрая обрезка видео (ffmpeg + Python)

Сегодня обрезал видеозаписи некоторых мастерклассов с конференции Природоохранных ГИС Украины, для загрузки их на Ютуб канал. И сделал для себя величайшее открытие!

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

Если нужно просто обрезать с видео по заданным секундам, то это можно сделать в 1000 раз быстрее при помощи программы ffmpeg, и автоматизировать обработку множества видео при помощи Python.

Ниже приведу код при помощи которого можно пакетно нарезать множество видео.

Шаги по подготовке:

0. Устанавливаете программу ffmpeg

1. Выписывате с какой по какую секунду нужно вырезать какое видео и куда сохранить фрагмент.

2. Записываете выписанную информацию в словарь list_clip_settings

3. Запускаете скрипт. Он циклом проходит по всем словарям в списке, и вырезает нужные фрагменты.

Вырезать 2 видео разрешением 2560  x  1600 по полтора часа каждое заняло 4 секунды, всего ЧЕТЫРЕ секунды !!!

import subprocess
from time import perf_counter

def fmt(seconds: float) -> str:
"""Форматирование секунд в HH:MM:SS."""
total = int(round(seconds))
h, rem = divmod(total, 3600)
m, s = divmod(rem, 60)
return f"{h:02d}:{m:02d}:{s:02d}"

list_clip_settings = [
{
"input": "video_source/20250723_Polischuk_Svidzinska.mp4",
"output": "video_masterklasses/20250723_Polishchuk_Olexandr-Tree_detection_for_help_U-net.mp4",
"start": "00:00:51",
"end": "01:31:17"
},
{
"input": "video_source/20250723_Polischuk_Svidzinska.mp4",
"output": "video_masterklasses/20250723_Svidzinska_Daria-analiz_prostorovo-chasovih_trendiv.mp4",
"start": "01:31:32",
"end": "02:55:22"
}
]

total_start = perf_counter()

for i in list_clip_settings:
input = i.get("input")
output = i.get("output")
start = i.get("start")
end = i.get("end")

cmd = [
"ffmpeg",
"-ss", start,
"-to", end,
"-i", str(input),
"-c", "copy",
"-map", "0",
"-movflags", "+faststart",
str(output)
]

t0 = perf_counter()

subprocess.run(cmd, check=True)

elapsed = perf_counter() - t0

print(f"Файл {str(output)} готов. Время на клип: {fmt(elapsed)}")

total_elapsed = perf_counter() - total_start

print("Готово!")
print(f"Общее затраченное время: {fmt(total_elapsed)}\n")


Фактически это просто обертка при помощи Python и subprocess вокруг команды:

ffmpeg -ss 01:31:32 -to 02:55:22 -i "path_to/input_file.mp4" -c copy -map 0 -movflags +faststart "path_to/output_file.mp4"


Пояснения:

* -c copy — без перекодирования (качество 1:1, очень быстро).

* -ss и -to — время начала/конца от исходного видео.

* -map 0 — берём все дорожки из исходника (видео+аудио).

* -movflags +faststart — удобнее для проигрывания/загрузки (метаданные впереди).


Кстати, первое из вырезанных видео про Обнаружение деревьев на космоснимках при помощи нейронных сетей (U-net) уже на ютуб канале: https://youtu.be/v09eLAgUFgs

Подписывайтесь на ютуб канал. В этом году были мощнейшие мастерклассы!

Постепенно всех их опубликуем.


#python #ffmpeg #video #video_editing
🔥31
Как скачать ArcGIS Feature layer на Python и экспортировать в GeoPackage.

Столкнулся с такой задачей и пободавшись с этой проблемой день нашел элегантное решение.


Предварительные шаги на скриншоте.
Важно скопировать ссылку на шаге "3" с правильной цифрой в конце.

import pyogrio

OUT_GPKG = "arcgis_feature_layer.gpkg"
LAYER = "arcgis_feature_layer"

URL_service = "https://services.arcgis.com/mMUesHYPkXjaFGfS/ArcGIS/rest/services/Manitoba_Provincial_Forests___Version_6/FeatureServer/1"

url = (
f"{URL_service}"
"/query"
"?where=1%3D1"
"&outFields=*"
"&returnGeometry=true"
"&outSR=4326"
"&f=pjson" # ВАЖНО: ESRI JSON, не geojson
)

# ВАЖНО: префикс ESRIJSON: заставляет GDAL открыть именно этим драйвером
gdf = pyogrio.read_dataframe("ESRIJSON:" + url)

# Экспорт
gdf.to_file(
OUT_GPKG,
driver="GPKG",
layer=LAYER,
index=True,
mode="w",
engine="pyogrio"
)


#python #download #data #arcgis #agol
🔥4
Автоматическая корегистрация растров на Python

Если нужно совместить несколько немного разъехавшихся растров, на пример ортофотопланы за разные даты или ортофотоплан и космоснимок, без ручной привязки по точкам помогает AROSICS

from arosics import COREG

INPUT_RASTER_1 = "orthophoto_025m.tif"
INPUT_RASTER_2 = "demo_sat_google_1m.tif"
OUTPUT_RASTER_1 = "sat_google_025m.tif"
# 1. Очистка лишних метаданных статистики
!gdal_edit.py -unsetstats {INPUT_RASTER_1}
!gdal_edit.py -unsetstats {INPUT_RASTER_2}
# 2. Инициализация AROSICS с параметрами ресемплинга
cr = COREG(INPUT_RASTER_1, INPUT_RASTER_2,
ws=(512, 512),
path_out=OUTPUT_RASTER_1,
max_shift=25,
resamp_alg_deshift='cubic',
match_gsd=True,
align_grids=True
)
# 3. Расчет сдвига
cr.calculate_spatial_shifts()
# 4. Применение сдвига и ресемплинга
cr.correct_shifts()


больше примеров и описания параметров в коментариях к оригинальному посту>>

#python #raster #changedetection
🔥6
Как установить Qt WebEngine на MacOS для работы плагина Qgis2threejs?

Нужно поставить/обновить PyQt5 + PyQtWebEngine внутри “встроенного” Python QGIS. По шагам:

0. Закрыть QGIS

1. нужно определить где именно установлен QGIS.

в системном терминале:
ls /Applications/


смотреть в списке QGIS.app или QGIS-LTR.app . У меня LTR версия.

2. Удалить установленную версию библиотеки PyQt5:
/Applications/QGIS-LTR.app/Contents/MacOS/bin/pip3 uninstall PyQt5


3. установить новый PyQt5 и PyQtWebEngine:

/Applications/QGIS-LTR.app/Contents/MacOS/bin/pip3 install PyQt5 PyQtWebEngine


4. Зайти в QGIS и запустить модуль Qgis2threejs

#qgis #install #3d #macos #python
🔥5
Если вы работаете с облаками точек LiDAR или фотограмметрии, PDAL — один из самых полезных инструментов.

Я опубликовал новую статью на Medium с практическим инструкциями по созданию конвееров PDAL и примерами, которые можно адаптировать к реальным задачам.

В статье:

- конвейер моделей PDAL
- как запустить конвейеры PDAL из Python
- как возвращать результаты в виде NumPy массива
- предпросмотр NumPy массива облака точек в виде таблицы при помощи pandas и в виде изображения при помощи matplotlib
- как обрезать и объединять точки облаков
- как создать цифровую модель рельефа GeoTIFF из файла LAZ

Статья:
https://medium.com/@anton.biatov/pdal-in-python-a-practical-guide-to-point-cloud-pipelines-1f7e2bc3e2ea

Также я буду рад узнать какие инструменты работы с Point Clouds вы используете и почему имено их ?

Если используете ))

#pdal #pointcloud #python
👍4🔥4