tr-imar
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
shapelyile Ö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ı.
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ı)
# 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)
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)
{
"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
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=Trueile 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_tallile verilmelidir. - Otopark yorumları. Kesirler toplam üzerinden yuvarlanır (
round_each=Trueile 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_basementsile 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
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. Atıf için CITATION.cff.
Academic citation
@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}
}
Metadata
Release files for tr-imar 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| tr_imar-0.1.0.tar.gz | 72.6 kB | With provenance | Details for tr_imar-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| tr_imar-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for tr_imar-0.1.0-py3-none-any.whl |
Total release size: 132.1 kB
Release files / tr_imar-0.1.0.tar.gz
| Download URL | tr_imar-0.1.0.tar.gz |
|---|---|
| Size | 72.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4b917217a23c49df99d425dc2d5449a45f3bdca9de11ce8f4f7f2c57d09c2400
|
|
BLAKE2b-256 checksum How to use checksums |
fc5abd96215045593ed1c1b9d2a0fb29b0d189e4a2848a7e4f5c0ce3118a094f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.
Transparency logRelease files / tr_imar-0.1.0-py3-none-any.whl
| Download URL | tr_imar-0.1.0-py3-none-any.whl |
|---|---|
| Size | 59.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
52f133d54695a002e58dafc1e6ff2f44a92fa7d979336d0c9a8a4d6f63593ebf
|
|
BLAKE2b-256 checksum How to use checksums |
2f0b5e765edeadfb179a096aedc46f6df2b67df74ef343f11bb7856a45ae5278
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.
Transparency logSecurity for tr-imar 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for tr_imar-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.