Useful GIS notes and more
73 subscribers
22 photos
20 links
My notes on GIS and more
Download Telegram
Очень рекомендую обратить внимание на файловый формат FlatGeobuf

Это один из довольно новых Cloud-Optimized Geospatial форматов. И можно прямо в QGIS подключить такие файлы по ссылке из интерента, и будут скачиваться и отображаться только фичи, которые попадают в область отображаемую на карте.

Вторая полезная функция, как по мне :
Очень удобно обменивать данные между R <- -> QGIS и поддерживает пространственные запросы прямо при чтении файла.

Т.е. можно читать не весь файл а только объекты в вашей зоне интереса.

И это можно делать не только с локальным файлом а и с файлом из интернета по ссылке.

В примере ниже чтение FlatGeobuf файла в R не полностью, а частично по зоне интереса wkt и потом запись FlatGeobuf файла из simple features (sf)

library(sf)

# Чтение FlatGeobuf файла по ссылке из интернета

geobuf_url <- "https://esa-worldcover.s3.eu-central-1.amazonaws.com/esa_worldcover_grid_composites.fgb"

wkt <- "POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10),
(20 30, 35 35, 30 20, 20 30))"

# чтение всего файла из интернета
data <- read_sf(geobuf_url)

# Частичное чтение файла из интернета с фильтром по полигону
data_filtred <- read_sf(geobuf_url,
wkt_filter = wkt)

# Просмотр прочитанных данных
plot(data$geometry, col="blue")
plot(data_filtred$geometry, col="red", add = T)

# Запись FlatGeobuf файла локально в файловую систему
write_sf(data_filtred,
dsn="C:/Temp/my_data.fgb",
driver="FlatGeobuf",
delete_dsn= TRUE) # overwrite file


Подробнее про него можно почитать на официальных сайтах:

https://flatgeobuf.org/

https://guide.cloudnativegeo.org/flatgeobuf/intro.html

#R #FlatGeobuf #CloudOptimized
🔥4
установка QGIS в изолированную Conda среду

Иногда нужно собрать какую-то комбинацию очень специфических python библиотек для работы некоторых QGIS плагинов, при этом чтоб не поломалось то что и так работает.

И для этого хорошо подходит установка QGIS и необходимых дополнительных инструментов в изолированную от основной операционной системы среду.

Для этого нужно использовать Anaconda или Miniconda (инструкций по их установке множество)

Далее нужно запустить терминал в Anaconda-Navigator или в любом IDE «Интегрированная среда разработки», я использую Visual Studio Code.

Там при запуске нужно выбрать среду conda если она сама не подхватится.

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

# создание среды qgis4solar_energy и установка туда QGIS LTR
conda create -n qgis4solar_energy -c conda-forge python=3.11 qgis=3.40.3

# подтвердить установку нажав "y"

# активировать среду
conda activate qgis4solar_energy

# проверим версию установленного QGIS
qgis --version

# устанавливаю другие необходимые тулы и библиотеки в эту же среду

# Solar / PDAL
conda install -n qgis4solar_energy -c conda-forge pysolar python-pdal

# SuPy зависимости
conda install -n qgis4solar_energy -c conda-forge \
pandas matplotlib chardet scipy pydantic \
f90wrap=0.2.16 dask f90nml seaborn cdsapi xarray \
multiprocess click lmfit numdifftools pvlib platypus-opt

# UMEP зависимости и немного больше
conda install -n qgis4solar_energy -c conda-forge \
numba=0.59.0 jaydebeapi=1.2.3 netCDF4 openpyxl rioxarray \
rasterio geopandas numpy laspy scipy shapely scikit-learn scikit-image

# можно устанавить библиотеки и чере pip если их нет в conda репозитории
python -m pip install xlrd xlwt xlutils ipykernel

python -m pip install "supy==2024.5.24.dev" atmosp target-py

# теперь можно запустить QGIS набрав в терминале:
qgis

дальше устанавливаем необходимые плагины через юзер интерфейс. в данном случае я доставляю UMEP и UMEP for processing. Но такой подход актуален и для установки других сложных плагинов типа PCRaster или Geo-SAM и т.д.

#qgis #pdal #conda #umep #install
🔥6👍1
PMTiles - Еще один крутой Cloud Optimized формат созданный для простой публикации геоданных в интернет.

Этот формат нацелен на отображения геоданных в браузере и представляет собой пирамиды тайлов собранные в единый файл.

Этот формат может хранить как векторные так и растровые тайлы. И способен содержать очень довольно большие данные внутри себя, и на клиент отдавать только нужные тайлы по GET запросу от клиента, без скачивания всего файла .pmtiles

Это позволяет публиковать даже очень большие растры и векторы без использования специальных программ или веб сервисов для рендеринга данных типа Geoserver, NextGIS web, ArcGIS Online etc.

Просто загружаете file.pmtiles на веб-хостинг или файловое хранилище типа AWS S3 и прямой URL-ссылкой на файл подключаете в свое приложение на MapLibre или Leaflet.

Базовые команды по созданию PMTiles:

1. Векторные PMTiles из векторного GeoJSON файла. Понадобится утилита tippecanoe https://github.com/mapbox/tippecanoe

tippecanoe -zg --projection=EPSG:4326 -o "path/output_file.pmtiles" -l layer_name --coalesce-densest-as-needed --extend-zooms-if-still-dropping "path/input_file.geojson"


2. Растровые PMTiles из GeoTIFF файла. Понадобится утилита rio pmtiles https://pypi.org/project/rio-pmtiles/

rio pmtiles "path/input_file.tif" "path/otput_file.pmtiles" --format PNG --resampling nearest


Резюме: PMTiles Это очень крутой формат, если вам надо просто опубликовать векторные или растровые карты, и не хочется париться с установкой и настройкой geosever или аналога, или использовать сторонние Веб-ГИС сервисы.

Вот пример приложения в котором я подключил 23 растра (исходные Geotiff были по 1 Гб, а PMTiles получились по 500 Мб каждый), и 23 PMTiles с векторными тайлами внутри, по несколько мегабайт каждый. В итоге в облако было загружено более 13 Gb данных. Зацените скорость рендеринга: https://fra1.digitaloceanspaces.com/abspatial/demo/ghana-galamsey/index.html

Пошаговая инструкция по установке необходимого софта, скрипты генерации pmtiles на python, ключевые настройки при конвертации и примеры подключения в веб-приложение размещу в комментариях к оригинальному посту https://t.me/gis_notes/20

#web #rendering #CloudOptumized #tiles #PMTiles #vectortiles #tippecanoe #rio
🔥3
Grasslands датасеты в GEE

Наткнулся на интересные датасеты - результат работы Global Pasture Watch (Land and Carbon Lab)

Там доволно неплохо детектированы луга и степи стран Восточной Европы. Правда почти все они относятся к классу "Cultivated grassland" и только совсем малая часть относится к "Natural/Semi-natural grassland". Если сравнивать данные за разные даты, хорошо видна динамика потерь грасландов.

Временной диапазон: 2000–2022
Шаг прогноза: 1 год
Разрешение: 30 м/пикс

GPW Annual Dominant Class of Grasslands v1:
https://developers.google.com/earth-engine/datasets/catalog/projects_global-pasture-watch_assets_ggc-30m_v1_grassland_c

GPW Annual Probabilities of Cultivated Grasslands v1:
https://developers.google.com/earth-engine/datasets/catalog/projects_global-pasture-watch_assets_ggc-30m_v1_cultiv-grassland_p

GPW Annual Probabilities of Natural/Semi-natural Grasslands v1:
https://developers.google.com/earth-engine/datasets/catalog/projects_global-pasture-watch_assets_ggc-30m_v1_nat-semi-grassland_p

На страницах описания в GEE также есть ссылки на страницы от куда можно качнуть данные одним файлом на много гигабайт каждый.

Еще лично у меня вызвало интерес что эти датасеты построены на базе данных GLAD Landsat ARD-2 images Давно приматриваюсь к этому продукту и инструменту.

В этом примере объеденил визуализацию всех этих трех датасетов:

Map.setCenter(39.927, 48.231, 7);
Map.setOptions("HYBRID");

// Annual Probabilities of Cultivated Grasslands
var cultiv_grassland = ee.ImageCollection(
"projects/global-pasture-watch/assets/ggc-30m/v1/cultiv-grassland_p"
)
var min_prob = 32 // Probability threshold
var visParams = {min: 15, max: 85, palette: 'f5f5f5,fdaf27,ae7947,3a2200'}

var cultiv_grassland_2022 = cultiv_grassland.filterDate('2022-01-01', '2023-01-01').first();
Map.addLayer(
cultiv_grassland_2022.mask(cultiv_grassland_2022.gte(min_prob)),
visParams, 'Cultivated grassland prob. (2022)'
);

var cultiv_grassland_2000 = cultiv_grassland.filterDate('2000-01-01', '2001-01-01').first();
Map.addLayer(
cultiv_grassland_2000.mask(cultiv_grassland_2000.gte(min_prob)),
visParams, 'Cultivated grassland prob. (2000)',
false
);

// Annual Probabilities of Natural/Semi-natural Grasslands
var nat_semi_grassland = ee.ImageCollection(
"projects/global-pasture-watch/assets/ggc-30m/v1/nat-semi-grassland_p"
)
var min_prob = 42 // Probability threshold
var visParams = {min: 15, max: 85, palette: 'f7f1e5,af8260,803d3b,322c2b'}

var nat_semi_grassland_2022 = nat_semi_grassland.filterDate('2022-01-01', '2023-01-01').first();
Map.addLayer(
nat_semi_grassland_2022.mask(nat_semi_grassland_2022.gte(min_prob)),
visParams, 'Natural/Semi-natural grassland prob. (2022)'
);

var nat_semi_grassland_2000 = nat_semi_grassland.filterDate('2000-01-01', '2001-01-01').first();
Map.addLayer(
nat_semi_grassland_2000.mask(nat_semi_grassland_2000.gte(min_prob)),
visParams, 'Natural/Semi-natural grassland prob. (2000)',
false
);

// Annual Dominant Class of Grasslands
var domi_grassland = ee.ImageCollection(
"projects/global-pasture-watch/assets/ggc-30m/v1/grassland_c"
);
var visParams = {"opacity":1, "min":1,"max":2,"palette":["ffcd73","ff9916"]};

var domi_grassland_2022 = domi_grassland.filterDate('2022-01-01', '2023-01-01').first();
Map.addLayer(
domi_grassland_2022.selfMask(),
visParams, 'Dominant grassland class (2022)'
);

var domi_grassland_2000 = domi_grassland.filterDate('2000-01-01', '2001-01-01').first();
Map.addLayer(
domi_grassland_2000.selfMask(),
visParams, 'Dominant grassland class (2000)',
false
);



#gee #data #landcover #landuse #grassland
🔥6
Как скачать 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
Как создать DEM из облака точек или использоваие пайплайнов PDAL в python.

PDAL (Point Data Abstraction Library) — это библиотека для работы с облаками точекю.

Особеность в том что работает в конвеере который описывает шаги в JSON


import json
import pdal

# Обрезка облака точек по экстенту
pipeline_clip_by_extent = [
{
"type": "readers.las",
"filename": input_laz_file
},
{
"type": "filters.crop",
"bounds": f"([{minx},{maxx}],[{miny},{maxy}])"
},
{
"type": "writers.las",
"filename": clipped_by_bbox_file
}
]

pipeline_json = json.dumps(pipeline_clip_by_extent)
print(pipeline_json)

pipeline = pdal.Pipeline(pipeline_json)
count = pipeline.execute()
arrays = pipeline.arrays
metadata = pipeline.metadata
log = pipeline.log
print(count)



Примеры скриптов для обрезки LAZ по полигону и генерации ЦМР в комментариях к оригинальному посту>>

#pdal #lidar #dem #dsm #pointcloud
👍4🔥2
Как установить 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
Как найти и верифицировать идею для стартапа - один из вариантов

Пару дней назад был на одном вебинаре для индихакеров где разбирали интересный и простой фреймворк поиска и проверки идеи для своего MicroSaaS проекта.

1. Выбор идеи
- зайти на какойто стор (Google Play, AppStore, Chrome Extension etc.)
- найти там решение которое отзывается и имеет +10K установок.
- взять одну важную функцию из этой апки

2. Подбор и проверка поискового Запроса
- придумать поисковые запросы под выбраную функцию
- проверить поисковые запросы в Google Trands (США, 1 год)
- сравнить с запросами "site blocker" и "adblocker"
- 🚩редфлаги: динамика хуже чем "site blocker", есть провалы на 0

3. Проверка Google выдачи по запросу.
- если выдача в основном апки и Saas
- если выдача в основном статьи
Какие инструменты искуственного интелекта вы используете регулярно?

в опросе ниже можно можно поставить несколько пунктов.
Вы используете данные GBIF, iNaturalist или каки-то еще подобных сервисов?

Если используете, могли бы написать в комментариях для решения каких задач?
Как подключить DeepSeek в VS Code

1. настройка DeepSeek
- авторизируйтесь на https://platform.deepseek.com/
- пополните на 2 или 5$
- создайте API-key

2. в VS Code
- в правой части экрана панель "CHAT". По умолчанию в нем доступно Claude Haiku 4.5 с небольшим контекстным окном.
- внизу нажмите на "Auto" или "Claude Haiku 4.5".
- в выберите шестеренку справа от пункта "Other Model".
- в открывшемся окне будет список доступных моделей и размер доступного контекстного окна.
- нажмите [+ Add Models] и дальше [Custom Endpoint]
- вверху будет маленькое окно "Group Name" и введите в него имя, на пример "DeepSeek V4" и нажмите <Enter>
- введите API-key и нажмите <Enter>
- выберите "Chat Completions"
- далее откроется окно с JSON настройки агента.

дальше в коментарии к посту.

#ai #vscode #DeepSeek
👍3
Если вы работали с GBIF данными о биоразнообразии, то наверняка сталкивались с трудностями при использовании Darwin Core Archive в ГИС.

Я написал тулу "dwca-cloud-geospatial" - конвертер GBIF Darwin Core Archive biodiversity datasets into cloud-friendly geospatial formats, такие как GeoParquet и FlatGeobuf.

В результате генерируется бессерверное веб-ГИС-приложение, которое можно развернуть на GitHub Pages, S3 или любом обычном хостинге. И получите интерактивную карту просто из архива скачанного из GBIF.

Есть Графический интерфейс (GUI), интерфей командной строки (CLI) и Python API.

Краткое обзорное видео про этот инструмент: https://youtu.be/ixLtxP824Og

Статья на Medium >>

Google Colab Notebook >>

GitHub Репозиторий: ABiatov/dwca-cloud-geospatial

Опубликованное демонстрационное веб-приложение - результат конвертации >>

В материалах есть пример как подключать FlatGeobuf из интернета в QGIS и как делать SQL запросы к PeoParquet файлу используя Python библиотеку DuckDB.

#GBIF #DWCA #CloudOptumized #FlatGeobuf #geoparquet
👍7🔥1
Моделирование ареалов видов (SDM) с помощью Random Forest на R в Google Colab

Я подготовил пошаговый ноутбук и статью на Medium для исследователей и аналитиков, которые начинают работать с пространственным моделированием распространения видов (Species Distribution Modeling) или хотят оптимизировать свой воркфлоу в облаке.

В ноутбуке подробно разбирается весь геоаналитический цикл — от сырых данных до создания итоговой карты пригодности местообитаний (Habitat Suitability Map) на примере классического датасета по бурогорлому ленивцу (Bradypus variegatus) в Южной и Центральной Америке.

Что входит в пайплайн:

- Настройка облачного окружения: Запуск полноценного R-кода прямо в Python-среде Google Colab при помощи магии %%R, а также установка системных C++ библиотек для пространственного анализа (GDAL, PROJ, GEOS) без необходимости локальной настройки RStudio.

- Подготовка пространственных данных: Работа с координатами находок вида и извлечение климатических предикторов (температура, осадки и др.) из растровых слоев пакета dismo.

- Генерация псевдо-отсутствий: Создание фоновых точек (pseudo-absences), необходимых для обучения алгоритма классификации.

- Машинное обучение (Random Forest): Разбиение выборки на обучение (75%) и тест (25%), настройка модели на 500 деревьев и анализ экологической важности предикторов (`MeanDecreaseAccuracy` и `MeanDecreaseGini`).

- Оценка качества и валидация: Проверка на тестовых данных, расчет метрики AUC (~0.96), построение ROC-кривой, а также детальный обзор критериев для выбора порога бинарной классификации (`spec_sens`, no_omission и др.).

- Пространственное прогнозирование: Проектирование обученной модели на карту и наглядная визуализация непрерывной карты вероятностей рядом с бинарной картой ареала.

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

Ссылка на статью в Medium: https://medium.com/@anton.biatov/species-distribution-modeling-sdm-with-random-forest-in-r-on-colab-bc6f7f1d4a5b

Ссылка на Google Colab: https://colab.research.google.com/drive/1vxFNtyQkvUQ4RQzQeEkAv0puuqWGuI1l?usp=sharing

#SDM #R #colab #RandomForest
👍7👏1