Metadata-Version: 2.4
Name: pynspd
Version: 0.1.0
Summary: Python-библиотека для работы с https://nspd.gov.ru (ex-ПКК)
Project-URL: Homepage, https://github.com/yazmolod/pynspd
Author-email: yazmolod <yazmolod@gmail.com>
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Python: >=3.10
Requires-Dist: geojson-pydantic>=1.2.0
Requires-Dist: httpx>=0.28.1
Requires-Dist: mercantile>=1.2.1
Requires-Dist: pydantic>=2.10.4
Requires-Dist: pyproj>=3.7.0
Requires-Dist: shapely>=2.0.6
Description-Content-Type: text/markdown

# PyNSPD - работа с Национальной системой пространственных данных (ex-ПКК)

**pynspd** — Python-библиотека для работы с сайтом НСПД. Особенности:
- **Синхронное и асинхронное API**: обеспечивает высокую производительность и удобство работы в асинхронных приложениях.
- **Полная типизации на [Pydantic](https://github.com/pydantic/pydantic)**: удобная работа с ответами благодаря автозаполнениям от IDE.
- **Автогенерация типов**: данные о перечне слоев, их полях и их типов подтягиваются напрямую с НСПД.
- **Встроенная поддержка [shapely](https://github.com/shapely/shapely)**: удобная аналитика полученной геометрии.

> ⚠️ **Важно**
> - Это неофициальная библиотека
> - Она в фазе активной разработки
> - НСПД в любой день может обновить API

## Пример использования
### Поиск ЗУ
```python
from pynspd import AsyncNspd

async with AsyncNspd() as api:
    feat = await api.search_zu("77:05:0001005:19")

    # исходная геометрия - geojson в EPSG:3857
    print(feat.geometry.wkt)
    > 'POLYGON ((4188557.382334785 7502956.580842949...'
    # но можем легко конвертировать в shapely EPSG:4326
    print(feat.geometry.to_shape(epsg4326=True).wkt)
    > 'POLYGON ((37.626451149629915 55.72040614723934...'

    # Доступ ко всему переченю свойств объекта
    print(feat.properties.options.model_dump())
    > {'land_record_type': 'Земельный участок', ...}
    # А также форматирование свойств по примеру карточки с сайта
    print(feat.properties.options.model_dump_human_readable())
    > {'Вид объекта недвижимости': 'Земельный участок', ...}
```

### Поиск типизированного объекта из любого слоя
```python
from pynspd import AsyncNspd, NspdFeature

async with AsyncNspd() as api:
    # либо импортируем определение слоя, зная его id (с сайта)
    from pynspd.schemas import Layer37578Feature as lf_def
    # либо найти определение слоя по названию, 
    # но тогда объект будет типизирован частично
    lf_def = NspdFeature.by_title(
        "ЗОУИТ объектов энергетики, связи, транспорта"
    ) # IDE знает весь перечень слоев и подсказывает ввод
    feat = await api.search_by_model("Останкинская телебашня", lf_def)    
```

### Поиск объекта с неизвестным слоем
```python
from pynspd import AsyncNspd

async with AsyncNspd() as api:
    feat = await api.search_by_theme("77:02:0021001:5304")
    print(feat.properties.options.type)
    > 'Машино-место'
```

## Установка
На период разработки установка возможна из репозитория 
```
pip install git+https://github.com/yazmolod/pynspd.git
```

## Зависимости
- `httpx` - для запросов к API НСПД
- `pydantic` - для типизации проекта
- `geojson-pydantic` - для типизации ответов НСПД
- `shapely` - для конвертации geojson-геометрии в удобный для аналитики формат
- `pyproj` - для перепроецирования геометрии