Metadata-Version: 2.4
Name: tr-imar
Version: 0.1.0
Summary: Turkish zoning (imar) calculations under the Planlı Alanlar İmar Yönetmeliği and Otopark Yönetmeliği: TAKS/KAKS, emsal dışı 30% cap, setbacks, buildable envelope, building height, parking and a compliance report in Turkish.
Author-email: Yusuf Eminoğlu <geospacephilo@gmail.com>
License-Expression: MIT
Project-URL: Homepage, https://github.com/YusufEminoglu/tr_imar_sdk
Project-URL: Repository, https://github.com/YusufEminoglu/tr_imar_sdk
Project-URL: Issues, https://github.com/YusufEminoglu/tr_imar_sdk/issues
Project-URL: Changelog, https://github.com/YusufEminoglu/tr_imar_sdk/blob/main/CHANGELOG.md
Keywords: imar,zoning,turkey,urban-planning,taks,kaks,emsal,setback,building-envelope,parking,otopark,planli-alanlar-imar-yonetmeligi,architecture,gis
Classifier: Development Status :: 4 - Beta
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Operating System :: OS Independent
Classifier: Environment :: Console
Classifier: Natural Language :: Turkish
Classifier: Topic :: Scientific/Engineering :: GIS
Classifier: Topic :: Utilities
Classifier: Intended Audience :: Science/Research
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Other Audience
Classifier: Typing :: Typed
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Provides-Extra: shapely
Requires-Dist: shapely>=2.0.0; extra == "shapely"
Provides-Extra: dev
Requires-Dist: pytest>=7.0.0; extra == "dev"
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
Requires-Dist: ruff>=0.1.0; extra == "dev"
Requires-Dist: mypy>=1.0.0; extra == "dev"
Dynamic: license-file

# tr-imar

[![CI](https://github.com/YusufEminoglu/tr_imar_sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/YusufEminoglu/tr_imar_sdk/actions/workflows/ci.yml)
[![PyPI](https://img.shields.io/pypi/v/tr-imar.svg)](https://pypi.org/project/tr-imar/)
[![Python](https://img.shields.io/pypi/pyversions/tr-imar.svg)](https://pypi.org/project/tr-imar/)
[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)

**English summary.** `tr-imar` is a dependency-free Python library and CLI for
Turkish zoning (*imar*) calculations under the *Planlı Alanlar İmar Yönetmeliği*
(Planned Areas Zoning Regulation, 2017, amended up to 1 July 2026) and the
*Otopark Yönetmeliği* (Parking Regulation, 2018, amended up to 27 December 2025):
TAKS/KAKS (footprint and floor-area ratios), the 30 % cap on areas excluded from
the floor-area ratio, floor count and building height, height-dependent setbacks,
the buildable envelope of rectangular or polygon parcels, and parking requirements.
A compliance check returns a structured report whose messages and CLI output are
in Turkish; national thresholds and local plan notes are kept strictly separate.

---

**Türkçe.** `tr-imar`, şehir plancıları ve mimarlar için Planlı Alanlar İmar
Yönetmeliği (PAİY) ve Otopark Yönetmeliği hesaplarını yapan, bağımlılığı olmayan
bir Python kütüphanesi ve komut satırı aracıdır:

- **Yoğunluk:** TAKS/KAKS'tan azami taban alanı ve emsale esas katlar alanı;
  planda TAKS veya KAKS verilmediğinde PAİY m.5/6 (%40 / %60) kuralları.
- **Emsal dışı alanlar:** m.22'deki kalem sınırları (kapıcı dairesi 70 m²,
  balkon %20 ...) ve m.5/8'deki **%30 tavanı** ile bu tavana girmeyen alanlar
  (bodrumda zorunlu otoparkın 2 katı, mescidin 150/300 m²'si ...).
- **Kat adedi ve bina yüksekliği:** m.28 azami kat yükseklikleriyle Hmax, eski
  planlarda yol genişliğine göre kat adedi (m.9), yüksek yapı sınıfı (m.4).
- **Bahçe mesafeleri:** ön 5 / yan 3 / arka 3 m, 4 katın üzerindeki her kat için
  yan ve arka +0,50 m, yükseklikten kat adedi (m.23/1-d), 60,50 m ve üzeri binalarda
  15 m + kat başına 0,50 m, aynı parseldeki yüksek binalar arası mesafe.
- **Yapılaşma zarfı:** dikdörtgen veya **poligon** parselde çekme sonrası alan;
  saf Python paralel yapı yaklaşma sınırları, istenirse `shapely` ile Öklid
  mesafesine göre kesin zarf. GeoJSON çıktısı.
- **Otopark:** güncel Ek-1 tablosunun tamamı (53 kullanım satırı;
  meskenlerde daire büyüklüğü bantları), yerel artırma katsayısı, küçük parsel
  azaltması; tablo JSON ile değiştirilebilir.
- **Uyum kontrolü:** önerilen proje için her satırı dayanağıyla (“Plan notu”,
  “PAİY m.23/1-a” ...) belirtilen Türkçe rapor; metin ve JSON çıktı.

```bash
pip install tr-imar              # yalnızca standart kütüphane
pip install "tr-imar[shapely]"   # + kesin (Öklid) zarf hesabı
```

Python 3.9 veya üstü gerekir.

> **Uyarı.** Bu paket bir **ön kontrol** aracıdır. Ruhsat esas olarak uygulama
> imar planına, plan notlarına, varsa büyükşehir/il belediyesinin imar
> yönetmeliğine ve ilgili idarenin yorumuna göre verilir. Sonuçları resmi bir
> karar yerine kullanmayın.

## Hızlı başlangıç (komut satırı)

```bash
# Yoğunluk: 1000 m² net parsel, TAKS 0.35, KAKS 1.40
tr-imar yogunluk --parsel 1000 --taks 0.35 --kaks 1.40
```

```
Net parsel alanı        : 1.000,00 m²
Azami taban alanı       : 350,00 m²  (TAKS 0.3500; Plan notu)
Azami emsal alanı       : 1.400,00 m²  (KAKS 1.4000; Plan notu)
Emsal dışı %30 tavanı   : 420,00 m²  (PAİY m.5/8)
```

```bash
tr-imar cekme --kat 6                    # ön 5,00 / yan 4,00 / arka 4,00 m
tr-imar cekme --yukseklik 72.5           # 60,50 m üstü: tüm bahçeler 17,00 m
tr-imar yukseklik --kat 5 --bolge konut  # Hmax = 5 x 3,60 = 18,00 m
tr-imar yukseklik --yol 12               # eski planlarda en çok 4 kat (m.9)
tr-imar zarf --dikdortgen 20x30 --kat 5  # zarf 13,00 x 21,50 = 279,50 m²
tr-imar zarf --poligon "0,0;30,0;30,15;15,15;15,30;0,30" --on-kenar 0 --kat 4 --cikti zarf.geojson
tr-imar otopark --daire 95,95,95,95,95,95 --kullanim dukkan=120   # 3 + 2,4 -> 6
tr-imar otopark --liste                  # Ek-1 tablosu ve anahtarlar
tr-imar kontrol examples/proje.json      # uyum raporu (aykırılık varsa çıkış kodu 1)
tr-imar yapilandirma --kaynaklar         # tüm eşikler, dayanak maddeleri
```

Tüm komutlar `--json` ile makine okunur çıktı verir; `--config yerel.json` ile
ulusal varsayılanlar (ör. büyükşehir imar yönetmeliğindeki farklı ön bahçe)
değiştirilir.

### Proje dosyası (`tr-imar kontrol`)

```json
{
  "plan": {"taks": 0.40, "kaks": 1.60, "kat": 4, "nizam": "ayrik", "bolge": "konut",
           "plan_notlari": ["Bina cephesi yola paralel olacaktır."]},
  "proje": {
    "parsel": [[0, 0], [20, 0], [20, 30], [0, 30]],
    "on_kenarlar": [0],
    "taban_alani": 235, "emsal_alani": 950, "kat": 4, "bina_yuksekligi": 14.20,
    "kat_yukseklikleri": [3.6, 3.6, 3.5, 3.5], "subasman": 0.90,
    "cekme": {"on": 5.0, "yan": 3.0, "arka": 3.5},
    "bb_net_alan": 800,
    "emsal_disi": [{"kategori": "balkon", "alan": 120},
                   {"kategori": "bodrum_zorunlu_otopark", "alan": 300}],
    "otopark": [{"kullanim": "mesken", "daireler": [110, 110, 110, 110, 110, 110, 110, 110]}],
    "otopark_mevcut": 4, "asansor": true
  },
  "yapilandirma": {"front_setback": 5.0},
  "otopark_tablosu": {"dukkan": {"per": 60}}
}
```

Çıktı (kısaltılmış):

```
İMAR UYGUNLUK ÖN KONTROL RAPORU
================================
[UYGUN]   Kat adedi (bodrum hariç): Önerilen 4 kat, izin verilen en çok 4 kat
          Dayanak: Plan notu; PAİY m.5/11
[UYGUN]   Bina yüksekliği: Önerilen 14,20 m, izin verilen en çok 14,40 m
          Dayanak: PAİY m.28/2 (kat adedi x azami kat yüksekliği)
[UYGUN]   Yan bahçe: Önerilen 3,00 m, gereken en az 3,00 m
          Dayanak: PAİY m.23/1-b
[BILGI]   Yapılaşma zarfı: Çekme mesafeleri sonrası zarf alanı 308,00 m² (parallel yöntemi)
[UYGUN]   Taban alanı (TAKS): Önerilen 235,00 m², izin verilen en çok 240,00 m²
[UYGUN]   Emsal dışı alanlar (%30 hesabına girenler): Önerilen 260,00 m², izin verilen en çok 288,00 m²
...
Sonuç: UYGUN (10 uygun, 0 aykırı, 0 uyarı, 2 bilgi)
```

## Python API

```python
from tr_imar import (
    PlanConditions, Project, EmsalDisiItem, ParkingDemand,
    required_setbacks, buildable_envelope, resolve_density,
    max_building_height, parking_requirement, check_compliance,
)

plan = PlanConditions(taks=0.40, kaks=1.60, floors=4, nizam="ayrik", zone="konut")

cekme = required_setbacks(floors=4, plan=plan)            # 5 / 3 / 3 m
zarf = buildable_envelope([(0, 0), (20, 0), (20, 30), (0, 30)], cekme, front_edges=[0])
zarf.area                                                 # 308.0
zarf.to_geojson()                                         # GeoJSON Feature

yog = resolve_density(600, plan, envelope_area=zarf.area)
yog.max_footprint, yog.max_floor_area, yog.emsal_disi_cap # 240.0, 960.0, 288.0

max_building_height(4, "konut")                           # 14.4  (4 x 3.60)
parking_requirement([ParkingDemand("mesken", unit_areas=[110] * 8)]).total   # 4

rapor = check_compliance(Project(parcel_area=600, footprint=250, floors=4), plan)
rapor.ok, [v.message for v in rapor.violations]
print(rapor.to_text())      # Türkçe rapor
rapor.to_dict()             # JSON'a yazılabilir sözlük
```

| Fonksiyon / sınıf | Ne yapar |
|---|---|
| `PlanConditions` | Plan notları / imar durumu: TAKS, KAKS, kat, Hmax, nizam, bölge, plan çekme mesafeleri, yol genişliği, otopark katsayısı |
| `ImarConfig`, `NATIONAL`, `load_config` | Ulusal yönetmelik eşiklerinin tamamı (tek yapılandırma); `FIELD_SOURCES` her alanın dayanağını ve değiştirilemez olup olmadığını verir |
| `resolve_density` | Azami taban alanı, emsal alanı, %30 tavanı (m.5/6, m.20/3, m.21/4) |
| `evaluate_emsal_disi`, `EmsalDisiItem` | Emsal dışı kalemler, kalem sınırları, %30 tavanı (m.5/8, m.22) |
| `required_setbacks`, `tower_spacing` | Ön/yan/arka bahçe, yükseğe bağlı artışlar (m.23) |
| `floors_for_setbacks`, `floors_by_road_width`, `floor_height_limits`, `max_building_height`, `classify_height` | Kat-yükseklik ilişkileri (m.4, m.9, m.23/1-d, m.28) |
| `rectangle_envelope`, `buildable_envelope`, `offset_polygon`, `classify_edges`, `polygon_area` | Parsel geometrisi ve yapılaşma zarfı |
| `parking_requirement`, `ParkingDemand`, `ParkingTable`, `DEFAULT_PARKING_TABLE` | Otopark Yönetmeliği Ek-1 |
| `check_compliance`, `Project`, `ComplianceReport` | Uyum kontrolü ve rapor |

Türkçe takma adlar: `uygunluk_kontrolu`, `bahce_mesafeleri`, `yapilasma_zarfi`,
`otopark_ihtiyaci`, `yogunluk`.

## Ulusal yönetmelik ile plan notlarının ayrımı

PAİY m.69/2'ye göre yönetmeliğin 1., 2., 6., 7., 8., 9. bölümleri, geçici
maddeleri ile 19. ve 20. maddeleri **planlarla ve idarelerin imar
yönetmelikleriyle değiştirilemez**. Diğer hükümlerin çoğu “uygulama imar planında
aksine hüküm yoksa” uygulanır; plan notları ve (m.69/3) büyükşehir/il imar
yönetmelikleri bunları değiştirebilir. Paket bu ayrımı üç katmanda tutar:

| Katman | Nesne | Örnek |
|---|---|---|
| Parsel bazında plan kararı / plan notu | `PlanConditions` | TAKS 0.40, KAKS 1.60, 4 kat, ön bahçe 7 m |
| Yerel imar yönetmeliği | `ImarConfig.replace(...)` / `--config` | Büyükşehirde farklı kat yüksekliği |
| Ulusal varsayılan | `NATIONAL` | Ön 5 m, yan 3 m, %30 tavanı |

Değiştirilemez bir eşiği (ör. `emsal_disi_cap_ratio`, `taks_cap_absolute`)
yapılandırmada değiştirirseniz uyum raporu bunu **uyarı** olarak gösterir.

| Konu | Dayanak | Plan/yerel yönetmelik değiştirebilir mi? |
|---|---|---|
| Taban alanı ve emsal net parsel üzerinden | m.5/5 | Hayır |
| Ayrık/blok nizamda TAKS ≤ %40 (planda açıkça verilmemişse) | m.5/6 | Plan TAKS verebilir; tavanın kendisi değiştirilemez |
| KAKS/TAKS verilmemişse TAKS ≤ %60 | m.5/6 | Hayır |
| Emsal dışı toplam ≤ emsale esas alanın %30'u | m.5/8 | Hayır |
| Emsal dışı kalemler ve sınırları | m.22 | Evet (yerel yönetmelik ek kalem getirebilir; yine %30'a tabi) |
| Bahçe mesafeleri ve artışlar | m.23 | Evet (“planda aksine hüküm yoksa”) |
| Azami kat yükseklikleri | m.28 | Evet (“planda daha fazla belirlenmemiş ise”) |
| Yol genişliğine göre kat | m.9 | Yalnız planında kat/yükseklik olmayan eski planlar |
| Kat adedi / bina yüksekliği aşılamaz | m.5/11 | Planın verdiği değer esastır |
| Asansör zorunluluğu | m.5/27 | Hayır |
| Otopark miktarları | Otopark Yön. m.8/2 | Yalnız **artırılabilir** (meclis kararı) |

## Yöntem ve kaynaklar

Birincil kaynaklar 9 Kasım 2026'da indirilip madde madde karşılaştırılmıştır:

- **Planlı Alanlar İmar Yönetmeliği**, RG 03.07.2017/30113, güncel metin
  (son değişiklik RG 01.07.2026/33297):
  <https://www.mevzuat.gov.tr/mevzuat?MevzuatNo=23722&MevzuatTur=7&MevzuatTertip=5>
- **Otopark Yönetmeliği**, RG 22.02.2018/30340, güncel metin ve Ek-1 (son
  değişiklik RG 27.12.2025/33120):
  <https://www.mevzuat.gov.tr/mevzuat?MevzuatNo=24408&MevzuatTur=7&MevzuatTertip=5>

Kullanılan başlıca hükümler:

| Hesap | Dayanak | Kural |
|---|---|---|
| TAKS, KAKS tanımı | m.4/1-cccc, m.4/1 KAKS | taban alanı / parsel; katlar alanı / parsel |
| Yoğunluk | m.5/5, m.5/6, m.20/3, m.21/4 | net parsel; %40 / %60; min(TAKS, zarf); TAKS x kat |
| Emsal dışı | m.5/8, m.22/1 | %30 tavanı ve muafiyetler; kalem sınırları |
| Bahçeler | m.23/1-a…ğ | 5 / 3 / 3 m; +0,50 m/kat (4 kat üstü); H/3 (artık > 2,50 → +1 kat); ≥ 60,50 m: 15 m + 0,50 m/kat; binalar arası 20 m + 0,50 m / 3 m |
| Kat yüksekliği | m.28/1-2 | konut 3,60 (≤ 3 kat: 4,00); ticaret zemin 4,50 / asma katlı 5,50 / diğer 4,00; karma; zemini ticari konut |
| Yol genişliği - kat | m.9/1-a | ≤7: 2, ≤10: 3, ≤12: 4, ≤15: 5, ≤20: 6, ≤25: 8, ≤35: 10, ≤50: 14, >50: 18 |
| Yüksek yapı | m.4/1-aaaaa | bina H > 21,50 veya yapı H > 30,50; çok yüksek > 51,50 / 60,50 |
| Subasman | m.4/1-yyy, m.9/1-c | 0,00 ile +1,20 arası |
| Asansör | m.5/27 | 3 katta yer, ≥ 4 katta tesis |
| Mahya | m.40/4 | ≤ 5,00 m |
| Otopark | Otopark Yön. m.4/1-ç, m.8, Ek-1 | birim park alanı 20 m²; kesir yukarı yuvarlanır |

**Zarf geometrisi.** `parallel` yöntemi her parsel kenarına kendi mesafesinde
paralel bir yapı yaklaşma sınırı çizer ve komşu sınırları kesiştirir (vaziyet
planlarındaki pratik). Dışbükey parsellerde yarı-düzlem kırpma (Sutherland–Hodgman)
ile kesindir; içbükey parsellerde çöken kısa kenarlar ayıklanır ve sonuç
geçerlilik testinden geçirilir. İçbükey köşelerde paralel çizgilerin kesişimi,
köşeye olan Öklid mesafesinden fazla pay bırakır (fark d²(1 − π/4)); sonuç güvenli
taraftadır. `exact` yöntemi (`shapely`) parselden her kenarın mesafe kadar
tamponunu çıkarır ve birden çok parçaya bölünen zarfları da döndürür.

## Sınırlamalar ve yorumlar

- **Plan notları önceliklidir.** Plan notunda yan/arka bahçe verilmişse,
  m.23/1-ç kat artışı varsayılan olarak yine eklenir (güvenli taraf);
  `PlanConditions(setback_increments=False)` ile kapatılabilir.
- **%30 tabanı.** “Parselin toplam emsale esas alanı” azami emsal alanı (KAKS x net
  parsel) olarak yorumlanmıştır; proje emsal alanını esas almak için
  `evaluate_emsal_disi(..., base_area=...)` kullanın.
- **Hmax.** m.28/2'ye göre kat yüksekliği x kat adedi; m.9/1-c'deki 1,20 m
  subasman payı ayrıca `include_subasman=True` ile eklenebilir. İdareler bu iki
  yaklaşımı farklı uygulayabilir.
- **60,50 m üzeri kat sayısı.** Kat yüksekliği verilmezse 3,00 m varsayılır
  (`typical_floor_height`); kesin sayı `floors_above_very_tall` ile verilmelidir.
- **Otopark yorumları.** Kesirler toplam üzerinden yuvarlanır (`round_each=True`
  ile kullanım başına). Akaryakıt satırındaki “beher pompaj başına 150 m² ve her
  lift/kanal başına 150 m²” ifadesi pompa ve lift/kanal başına 1 otopark olarak;
  kapalı yüzme havuzunda “100 m² ya da 20 oturma yeri” ikisinin büyüğü olarak
  yorumlanmıştır.
- **Asansör** kontrolünde bodrum katlar yalnız `exposed_basements` ile sayılır;
  m.5/27 bağımsız bölüm/ortak alan bulunan tüm bodrumları sayar.
- Kotlandırma (m.10-18), çıkmalar (m.41), çatı arası kullanımları (m.40/7-9),
  bodrumda konut koşulları (m.29/3), yangın ve otopark rampası hesapları kapsam
  dışıdır; yalnız mahya yüksekliği ve açığa çıkan bodrum oturumu (m.20/4)
  kontrol edilir.
- Koordinatlar metrik ve projeksiyonlu olmalıdır (ör. TM 3°, UTM).

## Geliştirme

```bash
pip install -e ".[dev,shapely]"
pytest --cov=tr_imar
ruff check . && ruff format --check src tests && mypy src
```

Testler ağa erişmez; yönetmelik örnekleri elle hesaplanmış değerlerle karşılaştırılır.

## Lisans

MIT © 2026 Yusuf Eminoğlu. Bkz. [LICENSE](LICENSE). Atıf için
[CITATION.cff](CITATION.cff).

## Academic citation

```bibtex
@software{eminoglu_tr_imar,
  author  = {Eminoğlu, Yusuf},
  title   = {tr-imar},
  year    = {2026},
  version = {0.1.0},
  url     = {https://github.com/YusufEminoglu/tr_imar_sdk}
}
```
