tr-donati 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. tr_donati-0.1.0/CHANGELOG.md +22 -0
  2. tr_donati-0.1.0/CITATION.cff +21 -0
  3. tr_donati-0.1.0/LICENSE +21 -0
  4. tr_donati-0.1.0/MANIFEST.in +10 -0
  5. tr_donati-0.1.0/PKG-INFO +262 -0
  6. tr_donati-0.1.0/README.md +227 -0
  7. tr_donati-0.1.0/examples/ornek_plan.geojson +725 -0
  8. tr_donati-0.1.0/examples/quickstart.py +57 -0
  9. tr_donati-0.1.0/pyproject.toml +110 -0
  10. tr_donati-0.1.0/setup.cfg +4 -0
  11. tr_donati-0.1.0/src/tr_donati/__init__.py +97 -0
  12. tr_donati-0.1.0/src/tr_donati/__main__.py +7 -0
  13. tr_donati-0.1.0/src/tr_donati/_version.py +1 -0
  14. tr_donati-0.1.0/src/tr_donati/access.py +247 -0
  15. tr_donati-0.1.0/src/tr_donati/cli.py +342 -0
  16. tr_donati-0.1.0/src/tr_donati/compliance.py +427 -0
  17. tr_donati-0.1.0/src/tr_donati/data/default_mapping.json +69 -0
  18. tr_donati-0.1.0/src/tr_donati/data/ek2_2017.json +172 -0
  19. tr_donati-0.1.0/src/tr_donati/data/service_radii.json +18 -0
  20. tr_donati-0.1.0/src/tr_donati/geometry.py +195 -0
  21. tr_donati-0.1.0/src/tr_donati/landuse.py +354 -0
  22. tr_donati-0.1.0/src/tr_donati/py.typed +0 -0
  23. tr_donati-0.1.0/src/tr_donati/report.py +343 -0
  24. tr_donati-0.1.0/src/tr_donati/requirements.py +105 -0
  25. tr_donati-0.1.0/src/tr_donati/standards.py +287 -0
  26. tr_donati-0.1.0/src/tr_donati.egg-info/PKG-INFO +262 -0
  27. tr_donati-0.1.0/src/tr_donati.egg-info/SOURCES.txt +34 -0
  28. tr_donati-0.1.0/src/tr_donati.egg-info/dependency_links.txt +1 -0
  29. tr_donati-0.1.0/src/tr_donati.egg-info/entry_points.txt +2 -0
  30. tr_donati-0.1.0/src/tr_donati.egg-info/requires.txt +6 -0
  31. tr_donati-0.1.0/src/tr_donati.egg-info/top_level.txt +1 -0
  32. tr_donati-0.1.0/tests/test_access.py +111 -0
  33. tr_donati-0.1.0/tests/test_cli_report.py +255 -0
  34. tr_donati-0.1.0/tests/test_geometry_landuse.py +206 -0
  35. tr_donati-0.1.0/tests/test_requirements_compliance.py +210 -0
  36. tr_donati-0.1.0/tests/test_standards.py +156 -0
@@ -0,0 +1,22 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [Unreleased]
6
+
7
+ ## [0.1.0] - 2026-11-09
8
+ ### Added
9
+ - Bundled, data-driven EK-2 standards table of the Mekânsal Planlar Yapım Yönetmeliği
10
+ (RG 14/6/2014-29030; EK-2 as amended by RG 17/5/2017-30069), transcribed from the official
11
+ annex file on mevzuat.gov.tr, with regulation version/date metadata and the 13 explanations.
12
+ - `StandardsTable` with population-band lookup, per-capita standards, minimum unit areas,
13
+ deep-merge overrides and JSON loading.
14
+ - `required_areas` / `total_per_capita` by planned population, settlement (ilçe projection)
15
+ population and il/ilçe scope.
16
+ - `check_compliance`: provided vs required areas, deficits, per-capita indicators, minimum
17
+ parcel size checks (`check_parcel`) and the open/green-area rules of explanations 9 and 10.
18
+ - GeoJSON/CSV plan input with planar or spherical polygon areas and a configurable land-use
19
+ code -> donatı type mapping (JSON/CSV, share splits).
20
+ - Service-radius coverage analysis (Euclidean, haversine or user distance matrix).
21
+ - Turkish Markdown/CSV reports and the `tr-donati` CLI (`standartlar`, `ihtiyac`, `denetle`,
22
+ `erisim`).
@@ -0,0 +1,21 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use this software, please cite it as below."
3
+ authors:
4
+ - family-names: "Eminoğlu"
5
+ given-names: "Yusuf"
6
+ email: "geospacephilo@gmail.com"
7
+ orcid: "https://orcid.org/0009-0005-6000-2934"
8
+ title: "tr-donati"
9
+ version: "0.1.0"
10
+ date-released: "2026-11-09"
11
+ license: "MIT"
12
+ repository-code: "https://github.com/YusufEminoglu/tr_donati_sdk"
13
+ url: "https://pypi.org/project/tr-donati/"
14
+ abstract: "Donatı (social and technical infrastructure) area standards for Turkish spatial plans based on EK-2 of the Mekânsal Planlar Yapım Yönetmeliği: required areas by population, plan compliance checks with deficits and per-capita indicators, minimum parcel sizes, service-radius analysis and Turkish Markdown/CSV reports."
15
+ keywords:
16
+ - urban planning
17
+ - spatial planning
18
+ - Turkey
19
+ - social infrastructure
20
+ - planning standards
21
+ - gis
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Yusuf Eminoğlu
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,10 @@
1
+ include LICENSE
2
+ include README.md
3
+ include CHANGELOG.md
4
+ include CITATION.cff
5
+ include pyproject.toml
6
+ include src/tr_donati/py.typed
7
+ recursive-include src/tr_donati *.py
8
+ recursive-include src/tr_donati/data *.json
9
+ recursive-include tests *.py
10
+ recursive-include examples *.py *.geojson
@@ -0,0 +1,262 @@
1
+ Metadata-Version: 2.4
2
+ Name: tr-donati
3
+ Version: 0.1.0
4
+ Summary: Donatı (social and technical infrastructure) area standards for Turkish spatial plans: EK-2 of the Mekânsal Planlar Yapım Yönetmeliği, required areas, plan compliance checks, per-capita indicators and service-radius analysis.
5
+ Author-email: Yusuf Eminoğlu <geospacephilo@gmail.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/YusufEminoglu/tr_donati_sdk
8
+ Project-URL: Repository, https://github.com/YusufEminoglu/tr_donati_sdk
9
+ Project-URL: Issues, https://github.com/YusufEminoglu/tr_donati_sdk/issues
10
+ Project-URL: Changelog, https://github.com/YusufEminoglu/tr_donati_sdk/blob/main/CHANGELOG.md
11
+ Keywords: turkish,turkey,turkiye,urban-planning,spatial-planning,imar-plani,donati,donati-alani,mekansal-planlar-yapim-yonetmeligi,social-infrastructure,green-space,planning-standards,accessibility,geojson,gis
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.9
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Operating System :: OS Independent
20
+ Classifier: Environment :: Console
21
+ Classifier: Natural Language :: Turkish
22
+ Classifier: Topic :: Scientific/Engineering :: GIS
23
+ Classifier: Intended Audience :: Science/Research
24
+ Classifier: Intended Audience :: Developers
25
+ Classifier: Typing :: Typed
26
+ Requires-Python: >=3.9
27
+ Description-Content-Type: text/markdown
28
+ License-File: LICENSE
29
+ Provides-Extra: dev
30
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
31
+ Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
32
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
33
+ Requires-Dist: mypy>=1.0.0; extra == "dev"
34
+ Dynamic: license-file
35
+
36
+ # tr-donati
37
+
38
+ [![PyPI](https://img.shields.io/pypi/v/tr-donati.svg)](https://pypi.org/project/tr-donati/)
39
+ [![Python](https://img.shields.io/pypi/pyversions/tr-donati.svg)](https://pypi.org/project/tr-donati/)
40
+ [![CI](https://github.com/YusufEminoglu/tr_donati_sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/YusufEminoglu/tr_donati_sdk/actions/workflows/ci.yml)
41
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
42
+
43
+ **English summary.** `tr-donati` implements the minimum social and technical infrastructure
44
+ ("donatı") area standards that Turkish spatial plans must meet: Annex 2 (EK-2) of the
45
+ *Mekânsal Planlar Yapım Yönetmeliği* (Official Gazette 14 June 2014, no. 29030; annex as
46
+ amended on 17 May 2017). It computes required areas for a planned population, checks a plan's
47
+ land-use polygons (GeoJSON/CSV) against those standards with deficits, per-capita indicators
48
+ and minimum parcel sizes, runs service-radius checks, and writes Turkish Markdown/CSV reports.
49
+ Pure Python, no dependencies.
50
+
51
+ ---
52
+
53
+ **Türk imar planları için donatı alanı standartları.** `tr-donati`, Mekânsal Planlar Yapım
54
+ Yönetmeliği'nin **EK-2** tablosundaki ("Farklı nüfus gruplarında asgari sosyal ve teknik
55
+ altyapı alanlarına ilişkin standartlar ve asgari alan büyüklükleri tablosu") kişi başı
56
+ standartları ve asgari birim alanları veri olarak içerir ve bunlarla:
57
+
58
+ - planlanan nüfus için **gerekli donatı alanlarını** hesaplar (nüfus grubuna ve il/ilçe
59
+ kapsamına göre),
60
+ - plan arazi kullanım poligonlarını (GeoJSON/CSV) okuyup **sunulan ve gerekli alanları
61
+ karşılaştırır**, açıkları ve kişi başı göstergeleri verir,
62
+ - tesis parsellerini **asgari birim alana** göre denetler (ör. ilkokul ≥ 5.000 m², devlet
63
+ hastanesi yatak başına 130 m²),
64
+ - EK-2 açıklama 9 ve 10'daki **açık-yeşil alan kurallarını** denetler,
65
+ - okul/park gibi tesisler için **hizmet yarıçapı (etki alanı)** analizi yapar (kuş uçuşu ya da
66
+ kullanıcının verdiği ağ mesafeleri),
67
+ - Türkçe **Markdown/CSV rapor** üretir.
68
+
69
+ Standart tablosu veri tabanlıdır (JSON); yönetmelik sürümü ve tarihi tabloda kayıtlıdır ve
70
+ tüm değerler kullanıcı tarafından değiştirilebilir. Saf Python, bağımlılık yok, Python 3.9+.
71
+
72
+ ## Kurulum
73
+
74
+ ```bash
75
+ pip install tr-donati
76
+ ```
77
+
78
+ ## Hızlı başlangıç (Python)
79
+
80
+ ```python
81
+ >>> import tr_donati as td
82
+ >>> {r.category: r.required_area for r in td.required_areas(120_000)}["acik_yesil_ilce"]
83
+ 1200000.0
84
+ >>> td.population_group(120_000).label
85
+ '75.001 - 150.000'
86
+ >>> rep = td.check_compliance(
87
+ ... {"park": 80_000, "cocuk_bahcesi": 15_000, "ilkokul": 16_500},
88
+ ... population=10_000,
89
+ ... settlement_population=200_000, # ilçe projeksiyon nüfusu -> nüfus grubu
90
+ ... )
91
+ >>> green = rep.result("acik_yesil_ilce")
92
+ >>> green.required_area, green.provided_area, green.deficit
93
+ (100000.0, 95000.0, 5000.0)
94
+ >>> rep.result("ilkokul").deficit
95
+ 3500.0
96
+ >>> td.check_parcel("ilkokul", 4_500, 200_000).status
97
+ 'asgari alanın altında'
98
+
99
+ ```
100
+
101
+ Plan dosyasından rapor:
102
+
103
+ ```python
104
+ import tr_donati as td
105
+
106
+ feats = td.read_plan("plan.geojson", code_field="KULLANIM") # alan geometriden hesaplanır
107
+ summary = td.summarize(feats) # varsayılan eşleştirme
108
+ rep = td.check_compliance(summary.provided, population=10_000, settlement_population=200_000,
109
+ parcels=summary.parcels, unmapped=summary.unmapped,
110
+ plan_area=summary.plan_area)
111
+ open("rapor.md", "w", encoding="utf-8").write(rep.to_markdown())
112
+ ```
113
+
114
+ Daha fazlası için `examples/quickstart.py` ve `examples/ornek_plan.geojson` dosyalarına bakın.
115
+
116
+ ## Komut satırı
117
+
118
+ ```bash
119
+ # EK-2 tablosu
120
+ tr-donati standartlar
121
+
122
+ # 120 000 kişi için gerekli alanlar
123
+ tr-donati ihtiyac --nufus 120000
124
+
125
+ # 10 000 kişilik plan, 200 000 nüfuslu ilçede; il bütünü kapsamında; CSV çıktı
126
+ tr-donati ihtiyac --nufus 10000 --yerlesme-nufusu 200000 --kapsam il --bicim csv
127
+
128
+ # Plan uygunluk denetimi (GeoJSON veya CSV)
129
+ tr-donati denetle examples/ornek_plan.geojson --nufus 10000 --yerlesme-nufusu 200000 \
130
+ --kod-alani KULLANIM --kimlik-alani ADA_PARSEL --birim-alani YATAK -o rapor.md
131
+
132
+ # Kendi kodlarınız ve standartlarınızla
133
+ tr-donati denetle plan.csv --nufus 25000 --kod-alani KOD --alan-alani ALAN_M2 \
134
+ --eslestirme eslestirme.json --standartlar cdp_standartlari.json --siki
135
+
136
+ # İlkokul etki alanı: konut adalarından 800 m
137
+ tr-donati erisim --tesisler plan.geojson --tesis-filtre-alani KULLANIM --tesis-filtre-degeri İlkokul \
138
+ --talep plan.geojson --talep-filtre-alani KULLANIM --talep-filtre-degeri Konut \
139
+ --agirlik-alani NUFUS --yaricap 800
140
+ ```
141
+
142
+ `--siki` verildiğinde standart sağlanmazsa çıkış kodu 1 olur (CI/otomasyon için).
143
+ `--cografi` / `--projeksiyonlu` koordinat türünü zorlar; verilmezse otomatik algılanır.
144
+
145
+ ## API özeti
146
+
147
+ | İşlev / sınıf | Açıklama |
148
+ | --- | --- |
149
+ | `StandardsTable.default()` | Gömülü EK-2 tablosu; `with_overrides()`, `from_json()`, `group_for()`, `per_capita()`, `min_area()` |
150
+ | `required_areas(pop, settlement_population=None, scope="ilce")` | Kategori bazında gerekli alanlar (`Requirement`) |
151
+ | `total_per_capita(pop, scope)` | Toplam kişi başı standart (m²/kişi) |
152
+ | `check_compliance(provided, pop, ...)` | `ComplianceReport`: açıklar, kurallar, parsel kontrolleri, `indicators()`, `to_markdown()`, `to_csv()` |
153
+ | `check_parcel(facility, area, pop, units=None)` | Tek parselin asgari birim alan kontrolü |
154
+ | `LandUseMapping` | Kullanım kodu → tesis türü (paylı bölme destekli), JSON/CSV'den yükleme |
155
+ | `read_plan`, `read_geojson`, `read_csv`, `summarize` | Plan girdisi okuma ve alan toplama |
156
+ | `service_coverage(demand, facilities, radius, metric, distances)` | Etki alanı / en yakın tesis analizi |
157
+ | `read_points`, `read_distance_matrix` | Nokta ve mesafe matrisi okuma |
158
+
159
+ ### Kategoriler ve tesis türleri
160
+
161
+ Kişi başı standart taşıyan kategoriler: `anaokulu`, `ilkokul`, `ortaokul`, `ortaogretim`
162
+ (lise + diğer eğitim tesisleri, tabloda tek birleşik hücre), `acik_yesil_ilce` (10 m²/kişi),
163
+ `acik_yesil_il` (il bütününde +5 m²/kişi), `saglik`, `sosyal_kulturel`, `ibadet`,
164
+ `teknik_altyapi` (yol ve otopark hariç). `otopark` ve `resmi_kurum` EK-2'de standart
165
+ içermez; yalnızca sunulan alan raporlanır (isterseniz `with_overrides` ile standart ekleyin).
166
+
167
+ Tesis türleri (örnek): `anaokulu`, `ilkokul`, `ortaokul`, `gunduzlu_lise`, `yatili_lise`,
168
+ `meslek_lisesi`, `ozel_egitim`, `halk_egitim`, `cocuk_bahcesi`, `oyun_alani`, `park`,
169
+ `meydan`, `semt_spor_alani`, `botanik_parki`, `mesire_yeri`, `rekreasyon`, `kent_ormani`,
170
+ `aile_sagligi_merkezi`, `devlet_hastanesi`, `saglik_kampusu`, `kulturel_tesis`,
171
+ `sosyal_tesis`, `kucuk_ibadet_yeri`, `orta_ibadet_yeri`, `buyuk_ibadet_yeri`,
172
+ `teknik_altyapi`, `otopark`, `resmi_kurum`. Tam liste: `tr-donati standartlar --json`.
173
+
174
+ ### Eşleştirme dosyası
175
+
176
+ Kullanım adları normalize edilir (`"Çocuk Bahçesi"` → `cocuk_bahcesi`). Varsayılan eşleştirme
177
+ tesis kimliklerini, etiketlerini ve yaygın eş anlamlıları (Kreş, ASM, Cami, Hastane, Trafo...)
178
+ tanır. Kendi kodlarınız için:
179
+
180
+ ```json
181
+ {"mapping": {"1101": "park", "1204": {"ilkokul": 0.5, "ortaokul": 0.5}}}
182
+ ```
183
+
184
+ veya CSV (`kod;tesis;pay`). Varsayılan olarak "İlköğretim alanı" ilkokul/ortaokul arasında
185
+ %50-%50 bölünür; bu bir varsayımdır, gerekirse değiştirin.
186
+
187
+ ### Standartları değiştirme
188
+
189
+ Yönetmelik Md. 11/2 kentsel asgari standartların çevre düzeni planıyla belirlenebileceğini,
190
+ EK-2 açıklama 13 ise asgari alan büyüklüklerinin ilgili bakanlık düzenlemelerine göre
191
+ belirlenebileceğini söyler. Bu yüzden tüm değerler değiştirilebilir:
192
+
193
+ ```python
194
+ t = td.StandardsTable.default().with_overrides({
195
+ "meta": {"annex_version": "X Çevre Düzeni Planı hükümleri"},
196
+ "categories": {"acik_yesil_ilce": {"per_capita": [12, 12, 12, 12]}},
197
+ "facilities": {"ilkokul": {"min_area": [[6000, 9000]] * 4}},
198
+ })
199
+ ```
200
+
201
+ Değiştirilmiş tablo raporlarda "kullanıcı tarafından değiştirilmiştir" uyarısıyla belirtilir.
202
+
203
+ ## Yöntem ve kaynaklar
204
+
205
+ - **Birincil kaynak:** Mekânsal Planlar Yapım Yönetmeliği, RG 14/6/2014 sayı 29030, Md. 11 ve
206
+ EK-2 (Değişik: RG 17/5/2017-30069). Değerler mevzuat.gov.tr'de yayımlanan resmi ek dosyasından
207
+ (`7.5.19788-ek.zip` → `EK-2.xlsx`) aktarılmış, RG 22/1/2026-33145 değişikliği işlenmiş
208
+ konsolide metinle karşılaştırılmıştır (EK-2 2017'den bu yana değişmemiştir). Kaynak bilgisi
209
+ `src/tr_donati/data/ek2_2017.json` içindeki `meta` alanındadır; EK-2'nin 13 açıklaması
210
+ aynen `notes` alanında yer alır.
211
+ - **Nüfus grubu:** EK-2 açıklama 1'e göre ilçe projeksiyon nüfusuyla seçilir
212
+ (`settlement_population`). Gerekli alan = kişi başı standart × planlanan nüfus.
213
+ - **Açık-yeşil alan kuralı (açıklama 9):** çocuk bahçesi, oyun alanı, park, meydan ve semt spor
214
+ alanı toplamı %75'in altına düşemez. Paydanın metinde açıkça belirtilmemesi nedeniyle paket
215
+ bunu standardın %75'i (0,75 × 10 m²/kişi × nüfus) olarak denetler ve sunulan yeşil alan
216
+ içindeki payı ayrıca raporlar.
217
+ - **İl bütünü (açıklama 10):** `scope="il"` ile hayvanat bahçesi, kent ormanı, ağaçlandırılacak
218
+ alan, fuar ve hipodrom için +5 m²/kişi; toplam 15 m²/kişi kuralı denetlenir.
219
+ - **Asgari birim alan:** tablodaki aralığın alt sınırı asgari değer olarak kullanılır; yatak/ünit
220
+ bazlı tesislerde alan = birim alan × yatak/ünit sayısı. Md. 11/3 ve açıklama 13 istisnaları
221
+ nedeniyle bu kontroller uyarı niteliğindedir.
222
+ - **Alan hesabı:** projeksiyonlu koordinatlarda shoelace formülü; boylam/enlem koordinatlarında
223
+ küre üzerinde Chamberlain & Duquette (2007, *Some algorithms for polygons on a sphere*, JPL
224
+ 07-03) çizgi integrali (R = 6.371.008,8 m; elipsoide göre hata < ~%0,5). Kesin alan için verinizi
225
+ TUREF/TM gibi metrik bir projeksiyona dönüştürün.
226
+ - **Mesafe:** düzlemde Öklid, coğrafi koordinatta haversine veya kullanıcı mesafe matrisi.
227
+
228
+ ## Sınırlamalar
229
+
230
+ - **Hizmet yarıçapları yönetmelikte yoktur.** `DEFAULT_SERVICE_RADII` (çocuk bahçesi 300 m,
231
+ park 500 m, anaokulu 500 m, ilkokul 800 m, ortaokul 1.000 m, lise 1.500 m, ASM 1.000 m,
232
+ ibadet yeri 500 m, semt spor alanı 1.000 m) planlama eğitiminde kullanılan **gösterge**
233
+ değerlerdir; birincil kaynakla doğrulanmamıştır. Resmi değerlendirmelerde `--yaricap` ile
234
+ kendi değerinizi verin.
235
+ - Kuş uçuşu mesafe gerçek yürüme mesafesini olduğundan kısa gösterir; ağ analizi sonuçlarını
236
+ `--mesafeler` ile verebilirsiniz.
237
+ - Otopark ihtiyacı Otopark Yönetmeliği'ne tabidir ve bu pakette hesaplanmaz.
238
+ - Kaynak tabloda son nüfus grubu "501.000 +" olarak yazılmıştır; 500.001-500.999 aralığı bu
239
+ gruba atanmıştır.
240
+ - Varsayılan eşleştirmedeki eş anlamlılar (ör. "Hastane" → devlet hastanesi, "İlköğretim" →
241
+ %50 ilkokul + %50 ortaokul) varsayımdır.
242
+ - Koruma amaçlı imar planları (Md. 11/4), turizm alanları (Md. 11/5) ve 6306 sayılı Kanun
243
+ planları (açıklama 11) için özel hükümler otomatik uygulanmaz.
244
+ - Bu araç karar desteği içindir; resmi plan onay ve denetim süreçlerinin yerine geçmez.
245
+
246
+ ## Akademik atıf
247
+
248
+ ```bibtex
249
+ @software{eminoglu_tr_donati,
250
+ author = {Eminoğlu, Yusuf},
251
+ title = {tr-donati},
252
+ year = {2026},
253
+ version = {0.1.0},
254
+ url = {https://github.com/YusufEminoglu/tr_donati_sdk}
255
+ }
256
+ ```
257
+
258
+ Ayrıca bkz. `CITATION.cff`.
259
+
260
+ ## Lisans
261
+
262
+ MIT © 2026 Yusuf Eminoğlu. Bkz. [LICENSE](LICENSE).
@@ -0,0 +1,227 @@
1
+ # tr-donati
2
+
3
+ [![PyPI](https://img.shields.io/pypi/v/tr-donati.svg)](https://pypi.org/project/tr-donati/)
4
+ [![Python](https://img.shields.io/pypi/pyversions/tr-donati.svg)](https://pypi.org/project/tr-donati/)
5
+ [![CI](https://github.com/YusufEminoglu/tr_donati_sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/YusufEminoglu/tr_donati_sdk/actions/workflows/ci.yml)
6
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
7
+
8
+ **English summary.** `tr-donati` implements the minimum social and technical infrastructure
9
+ ("donatı") area standards that Turkish spatial plans must meet: Annex 2 (EK-2) of the
10
+ *Mekânsal Planlar Yapım Yönetmeliği* (Official Gazette 14 June 2014, no. 29030; annex as
11
+ amended on 17 May 2017). It computes required areas for a planned population, checks a plan's
12
+ land-use polygons (GeoJSON/CSV) against those standards with deficits, per-capita indicators
13
+ and minimum parcel sizes, runs service-radius checks, and writes Turkish Markdown/CSV reports.
14
+ Pure Python, no dependencies.
15
+
16
+ ---
17
+
18
+ **Türk imar planları için donatı alanı standartları.** `tr-donati`, Mekânsal Planlar Yapım
19
+ Yönetmeliği'nin **EK-2** tablosundaki ("Farklı nüfus gruplarında asgari sosyal ve teknik
20
+ altyapı alanlarına ilişkin standartlar ve asgari alan büyüklükleri tablosu") kişi başı
21
+ standartları ve asgari birim alanları veri olarak içerir ve bunlarla:
22
+
23
+ - planlanan nüfus için **gerekli donatı alanlarını** hesaplar (nüfus grubuna ve il/ilçe
24
+ kapsamına göre),
25
+ - plan arazi kullanım poligonlarını (GeoJSON/CSV) okuyup **sunulan ve gerekli alanları
26
+ karşılaştırır**, açıkları ve kişi başı göstergeleri verir,
27
+ - tesis parsellerini **asgari birim alana** göre denetler (ör. ilkokul ≥ 5.000 m², devlet
28
+ hastanesi yatak başına 130 m²),
29
+ - EK-2 açıklama 9 ve 10'daki **açık-yeşil alan kurallarını** denetler,
30
+ - okul/park gibi tesisler için **hizmet yarıçapı (etki alanı)** analizi yapar (kuş uçuşu ya da
31
+ kullanıcının verdiği ağ mesafeleri),
32
+ - Türkçe **Markdown/CSV rapor** üretir.
33
+
34
+ Standart tablosu veri tabanlıdır (JSON); yönetmelik sürümü ve tarihi tabloda kayıtlıdır ve
35
+ tüm değerler kullanıcı tarafından değiştirilebilir. Saf Python, bağımlılık yok, Python 3.9+.
36
+
37
+ ## Kurulum
38
+
39
+ ```bash
40
+ pip install tr-donati
41
+ ```
42
+
43
+ ## Hızlı başlangıç (Python)
44
+
45
+ ```python
46
+ >>> import tr_donati as td
47
+ >>> {r.category: r.required_area for r in td.required_areas(120_000)}["acik_yesil_ilce"]
48
+ 1200000.0
49
+ >>> td.population_group(120_000).label
50
+ '75.001 - 150.000'
51
+ >>> rep = td.check_compliance(
52
+ ... {"park": 80_000, "cocuk_bahcesi": 15_000, "ilkokul": 16_500},
53
+ ... population=10_000,
54
+ ... settlement_population=200_000, # ilçe projeksiyon nüfusu -> nüfus grubu
55
+ ... )
56
+ >>> green = rep.result("acik_yesil_ilce")
57
+ >>> green.required_area, green.provided_area, green.deficit
58
+ (100000.0, 95000.0, 5000.0)
59
+ >>> rep.result("ilkokul").deficit
60
+ 3500.0
61
+ >>> td.check_parcel("ilkokul", 4_500, 200_000).status
62
+ 'asgari alanın altında'
63
+
64
+ ```
65
+
66
+ Plan dosyasından rapor:
67
+
68
+ ```python
69
+ import tr_donati as td
70
+
71
+ feats = td.read_plan("plan.geojson", code_field="KULLANIM") # alan geometriden hesaplanır
72
+ summary = td.summarize(feats) # varsayılan eşleştirme
73
+ rep = td.check_compliance(summary.provided, population=10_000, settlement_population=200_000,
74
+ parcels=summary.parcels, unmapped=summary.unmapped,
75
+ plan_area=summary.plan_area)
76
+ open("rapor.md", "w", encoding="utf-8").write(rep.to_markdown())
77
+ ```
78
+
79
+ Daha fazlası için `examples/quickstart.py` ve `examples/ornek_plan.geojson` dosyalarına bakın.
80
+
81
+ ## Komut satırı
82
+
83
+ ```bash
84
+ # EK-2 tablosu
85
+ tr-donati standartlar
86
+
87
+ # 120 000 kişi için gerekli alanlar
88
+ tr-donati ihtiyac --nufus 120000
89
+
90
+ # 10 000 kişilik plan, 200 000 nüfuslu ilçede; il bütünü kapsamında; CSV çıktı
91
+ tr-donati ihtiyac --nufus 10000 --yerlesme-nufusu 200000 --kapsam il --bicim csv
92
+
93
+ # Plan uygunluk denetimi (GeoJSON veya CSV)
94
+ tr-donati denetle examples/ornek_plan.geojson --nufus 10000 --yerlesme-nufusu 200000 \
95
+ --kod-alani KULLANIM --kimlik-alani ADA_PARSEL --birim-alani YATAK -o rapor.md
96
+
97
+ # Kendi kodlarınız ve standartlarınızla
98
+ tr-donati denetle plan.csv --nufus 25000 --kod-alani KOD --alan-alani ALAN_M2 \
99
+ --eslestirme eslestirme.json --standartlar cdp_standartlari.json --siki
100
+
101
+ # İlkokul etki alanı: konut adalarından 800 m
102
+ tr-donati erisim --tesisler plan.geojson --tesis-filtre-alani KULLANIM --tesis-filtre-degeri İlkokul \
103
+ --talep plan.geojson --talep-filtre-alani KULLANIM --talep-filtre-degeri Konut \
104
+ --agirlik-alani NUFUS --yaricap 800
105
+ ```
106
+
107
+ `--siki` verildiğinde standart sağlanmazsa çıkış kodu 1 olur (CI/otomasyon için).
108
+ `--cografi` / `--projeksiyonlu` koordinat türünü zorlar; verilmezse otomatik algılanır.
109
+
110
+ ## API özeti
111
+
112
+ | İşlev / sınıf | Açıklama |
113
+ | --- | --- |
114
+ | `StandardsTable.default()` | Gömülü EK-2 tablosu; `with_overrides()`, `from_json()`, `group_for()`, `per_capita()`, `min_area()` |
115
+ | `required_areas(pop, settlement_population=None, scope="ilce")` | Kategori bazında gerekli alanlar (`Requirement`) |
116
+ | `total_per_capita(pop, scope)` | Toplam kişi başı standart (m²/kişi) |
117
+ | `check_compliance(provided, pop, ...)` | `ComplianceReport`: açıklar, kurallar, parsel kontrolleri, `indicators()`, `to_markdown()`, `to_csv()` |
118
+ | `check_parcel(facility, area, pop, units=None)` | Tek parselin asgari birim alan kontrolü |
119
+ | `LandUseMapping` | Kullanım kodu → tesis türü (paylı bölme destekli), JSON/CSV'den yükleme |
120
+ | `read_plan`, `read_geojson`, `read_csv`, `summarize` | Plan girdisi okuma ve alan toplama |
121
+ | `service_coverage(demand, facilities, radius, metric, distances)` | Etki alanı / en yakın tesis analizi |
122
+ | `read_points`, `read_distance_matrix` | Nokta ve mesafe matrisi okuma |
123
+
124
+ ### Kategoriler ve tesis türleri
125
+
126
+ Kişi başı standart taşıyan kategoriler: `anaokulu`, `ilkokul`, `ortaokul`, `ortaogretim`
127
+ (lise + diğer eğitim tesisleri, tabloda tek birleşik hücre), `acik_yesil_ilce` (10 m²/kişi),
128
+ `acik_yesil_il` (il bütününde +5 m²/kişi), `saglik`, `sosyal_kulturel`, `ibadet`,
129
+ `teknik_altyapi` (yol ve otopark hariç). `otopark` ve `resmi_kurum` EK-2'de standart
130
+ içermez; yalnızca sunulan alan raporlanır (isterseniz `with_overrides` ile standart ekleyin).
131
+
132
+ Tesis türleri (örnek): `anaokulu`, `ilkokul`, `ortaokul`, `gunduzlu_lise`, `yatili_lise`,
133
+ `meslek_lisesi`, `ozel_egitim`, `halk_egitim`, `cocuk_bahcesi`, `oyun_alani`, `park`,
134
+ `meydan`, `semt_spor_alani`, `botanik_parki`, `mesire_yeri`, `rekreasyon`, `kent_ormani`,
135
+ `aile_sagligi_merkezi`, `devlet_hastanesi`, `saglik_kampusu`, `kulturel_tesis`,
136
+ `sosyal_tesis`, `kucuk_ibadet_yeri`, `orta_ibadet_yeri`, `buyuk_ibadet_yeri`,
137
+ `teknik_altyapi`, `otopark`, `resmi_kurum`. Tam liste: `tr-donati standartlar --json`.
138
+
139
+ ### Eşleştirme dosyası
140
+
141
+ Kullanım adları normalize edilir (`"Çocuk Bahçesi"` → `cocuk_bahcesi`). Varsayılan eşleştirme
142
+ tesis kimliklerini, etiketlerini ve yaygın eş anlamlıları (Kreş, ASM, Cami, Hastane, Trafo...)
143
+ tanır. Kendi kodlarınız için:
144
+
145
+ ```json
146
+ {"mapping": {"1101": "park", "1204": {"ilkokul": 0.5, "ortaokul": 0.5}}}
147
+ ```
148
+
149
+ veya CSV (`kod;tesis;pay`). Varsayılan olarak "İlköğretim alanı" ilkokul/ortaokul arasında
150
+ %50-%50 bölünür; bu bir varsayımdır, gerekirse değiştirin.
151
+
152
+ ### Standartları değiştirme
153
+
154
+ Yönetmelik Md. 11/2 kentsel asgari standartların çevre düzeni planıyla belirlenebileceğini,
155
+ EK-2 açıklama 13 ise asgari alan büyüklüklerinin ilgili bakanlık düzenlemelerine göre
156
+ belirlenebileceğini söyler. Bu yüzden tüm değerler değiştirilebilir:
157
+
158
+ ```python
159
+ t = td.StandardsTable.default().with_overrides({
160
+ "meta": {"annex_version": "X Çevre Düzeni Planı hükümleri"},
161
+ "categories": {"acik_yesil_ilce": {"per_capita": [12, 12, 12, 12]}},
162
+ "facilities": {"ilkokul": {"min_area": [[6000, 9000]] * 4}},
163
+ })
164
+ ```
165
+
166
+ Değiştirilmiş tablo raporlarda "kullanıcı tarafından değiştirilmiştir" uyarısıyla belirtilir.
167
+
168
+ ## Yöntem ve kaynaklar
169
+
170
+ - **Birincil kaynak:** Mekânsal Planlar Yapım Yönetmeliği, RG 14/6/2014 sayı 29030, Md. 11 ve
171
+ EK-2 (Değişik: RG 17/5/2017-30069). Değerler mevzuat.gov.tr'de yayımlanan resmi ek dosyasından
172
+ (`7.5.19788-ek.zip` → `EK-2.xlsx`) aktarılmış, RG 22/1/2026-33145 değişikliği işlenmiş
173
+ konsolide metinle karşılaştırılmıştır (EK-2 2017'den bu yana değişmemiştir). Kaynak bilgisi
174
+ `src/tr_donati/data/ek2_2017.json` içindeki `meta` alanındadır; EK-2'nin 13 açıklaması
175
+ aynen `notes` alanında yer alır.
176
+ - **Nüfus grubu:** EK-2 açıklama 1'e göre ilçe projeksiyon nüfusuyla seçilir
177
+ (`settlement_population`). Gerekli alan = kişi başı standart × planlanan nüfus.
178
+ - **Açık-yeşil alan kuralı (açıklama 9):** çocuk bahçesi, oyun alanı, park, meydan ve semt spor
179
+ alanı toplamı %75'in altına düşemez. Paydanın metinde açıkça belirtilmemesi nedeniyle paket
180
+ bunu standardın %75'i (0,75 × 10 m²/kişi × nüfus) olarak denetler ve sunulan yeşil alan
181
+ içindeki payı ayrıca raporlar.
182
+ - **İl bütünü (açıklama 10):** `scope="il"` ile hayvanat bahçesi, kent ormanı, ağaçlandırılacak
183
+ alan, fuar ve hipodrom için +5 m²/kişi; toplam 15 m²/kişi kuralı denetlenir.
184
+ - **Asgari birim alan:** tablodaki aralığın alt sınırı asgari değer olarak kullanılır; yatak/ünit
185
+ bazlı tesislerde alan = birim alan × yatak/ünit sayısı. Md. 11/3 ve açıklama 13 istisnaları
186
+ nedeniyle bu kontroller uyarı niteliğindedir.
187
+ - **Alan hesabı:** projeksiyonlu koordinatlarda shoelace formülü; boylam/enlem koordinatlarında
188
+ küre üzerinde Chamberlain & Duquette (2007, *Some algorithms for polygons on a sphere*, JPL
189
+ 07-03) çizgi integrali (R = 6.371.008,8 m; elipsoide göre hata < ~%0,5). Kesin alan için verinizi
190
+ TUREF/TM gibi metrik bir projeksiyona dönüştürün.
191
+ - **Mesafe:** düzlemde Öklid, coğrafi koordinatta haversine veya kullanıcı mesafe matrisi.
192
+
193
+ ## Sınırlamalar
194
+
195
+ - **Hizmet yarıçapları yönetmelikte yoktur.** `DEFAULT_SERVICE_RADII` (çocuk bahçesi 300 m,
196
+ park 500 m, anaokulu 500 m, ilkokul 800 m, ortaokul 1.000 m, lise 1.500 m, ASM 1.000 m,
197
+ ibadet yeri 500 m, semt spor alanı 1.000 m) planlama eğitiminde kullanılan **gösterge**
198
+ değerlerdir; birincil kaynakla doğrulanmamıştır. Resmi değerlendirmelerde `--yaricap` ile
199
+ kendi değerinizi verin.
200
+ - Kuş uçuşu mesafe gerçek yürüme mesafesini olduğundan kısa gösterir; ağ analizi sonuçlarını
201
+ `--mesafeler` ile verebilirsiniz.
202
+ - Otopark ihtiyacı Otopark Yönetmeliği'ne tabidir ve bu pakette hesaplanmaz.
203
+ - Kaynak tabloda son nüfus grubu "501.000 +" olarak yazılmıştır; 500.001-500.999 aralığı bu
204
+ gruba atanmıştır.
205
+ - Varsayılan eşleştirmedeki eş anlamlılar (ör. "Hastane" → devlet hastanesi, "İlköğretim" →
206
+ %50 ilkokul + %50 ortaokul) varsayımdır.
207
+ - Koruma amaçlı imar planları (Md. 11/4), turizm alanları (Md. 11/5) ve 6306 sayılı Kanun
208
+ planları (açıklama 11) için özel hükümler otomatik uygulanmaz.
209
+ - Bu araç karar desteği içindir; resmi plan onay ve denetim süreçlerinin yerine geçmez.
210
+
211
+ ## Akademik atıf
212
+
213
+ ```bibtex
214
+ @software{eminoglu_tr_donati,
215
+ author = {Eminoğlu, Yusuf},
216
+ title = {tr-donati},
217
+ year = {2026},
218
+ version = {0.1.0},
219
+ url = {https://github.com/YusufEminoglu/tr_donati_sdk}
220
+ }
221
+ ```
222
+
223
+ Ayrıca bkz. `CITATION.cff`.
224
+
225
+ ## Lisans
226
+
227
+ MIT © 2026 Yusuf Eminoğlu. Bkz. [LICENSE](LICENSE).