tr-dop 0.1.0__py3-none-any.whl

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.
tr_dop/__init__.py ADDED
@@ -0,0 +1,115 @@
1
+ """tr_dop: Turkish land readjustment (arazi ve arsa düzenlemesi, İmar Kanunu m.18) calculations.
2
+
3
+ Quick start::
4
+
5
+ from tr_dop import Owner, Parcel, PlanUse, NewParcel, Scheme, run, to_markdown
6
+
7
+ scheme = Scheme(
8
+ parcels=[
9
+ Parcel("101/1", 2000, [Owner("Ali", "1/2"), Owner("Ayşe", "1/2")]),
10
+ Parcel("101/2", 3000, [Owner("Mehmet", "1")]),
11
+ ],
12
+ plan_uses=[PlanUse("yol", 1200), PlanUse("park", 500), PlanUse("konut", 3300)],
13
+ new_parcels=[NewParcel("1/1", 1650), NewParcel("1/2", 1650)],
14
+ )
15
+ result = run(scheme)
16
+ print(result.dop.ratio) # 0.34
17
+ print(to_markdown(result))
18
+ """
19
+
20
+ from ._version import __version__
21
+ from .area import AreaBasis, area_tolerance, basis_area
22
+ from .distribution import Distribution, Placement, ShareRow, distribute, split_cents, tapu_shares
23
+ from .dop import (
24
+ DopResult,
25
+ ParcelDop,
26
+ UseCoverage,
27
+ compute_dop,
28
+ conversion_payments,
29
+ round_area,
30
+ round_ratio,
31
+ )
32
+ from .engine import Check, ReadjustmentResult, run, run_checks
33
+ from .errors import InputError, TrDopError
34
+ from .io import (
35
+ coverage_table,
36
+ distribution_table,
37
+ dop_table,
38
+ load_scheme,
39
+ read_allocations_csv,
40
+ read_new_parcels_csv,
41
+ read_parcels_csv,
42
+ read_plan_csv,
43
+ result_to_mapping,
44
+ scheme_from_mapping,
45
+ scheme_to_mapping,
46
+ write_csv,
47
+ write_outputs,
48
+ )
49
+ from .landuse import PRIORITY_ORDER, LandUse, LandUseCatalog, default_catalog, load_catalog
50
+ from .models import (
51
+ Allocation,
52
+ NewParcel,
53
+ Owner,
54
+ Parcel,
55
+ PlanUse,
56
+ Scheme,
57
+ Settings,
58
+ format_share,
59
+ parse_share,
60
+ )
61
+ from .report import to_markdown
62
+
63
+ __all__ = [
64
+ "PRIORITY_ORDER",
65
+ "Allocation",
66
+ "AreaBasis",
67
+ "Check",
68
+ "Distribution",
69
+ "DopResult",
70
+ "InputError",
71
+ "LandUse",
72
+ "LandUseCatalog",
73
+ "NewParcel",
74
+ "Owner",
75
+ "Parcel",
76
+ "ParcelDop",
77
+ "Placement",
78
+ "PlanUse",
79
+ "ReadjustmentResult",
80
+ "Scheme",
81
+ "Settings",
82
+ "ShareRow",
83
+ "TrDopError",
84
+ "UseCoverage",
85
+ "__version__",
86
+ "area_tolerance",
87
+ "basis_area",
88
+ "compute_dop",
89
+ "conversion_payments",
90
+ "coverage_table",
91
+ "default_catalog",
92
+ "distribute",
93
+ "distribution_table",
94
+ "dop_table",
95
+ "format_share",
96
+ "load_catalog",
97
+ "load_scheme",
98
+ "parse_share",
99
+ "read_allocations_csv",
100
+ "read_new_parcels_csv",
101
+ "read_parcels_csv",
102
+ "read_plan_csv",
103
+ "result_to_mapping",
104
+ "round_area",
105
+ "round_ratio",
106
+ "run",
107
+ "run_checks",
108
+ "scheme_from_mapping",
109
+ "scheme_to_mapping",
110
+ "split_cents",
111
+ "tapu_shares",
112
+ "to_markdown",
113
+ "write_csv",
114
+ "write_outputs",
115
+ ]
tr_dop/__main__.py ADDED
@@ -0,0 +1,7 @@
1
+ """``python -m tr_dop``."""
2
+
3
+ import sys
4
+
5
+ from .cli import main
6
+
7
+ sys.exit(main())
tr_dop/_version.py ADDED
@@ -0,0 +1 @@
1
+ __version__ = "0.1.0"
tr_dop/area.py ADDED
@@ -0,0 +1,109 @@
1
+ """Registered (tapu) versus computed (kadastro) area: which area the scheme uses.
2
+
3
+ Arazi ve Arsa Düzenlemeleri Hakkında Yönetmelik m.31:
4
+
5
+ 1. The area of each cadastral parcel is computed from its coordinates and compared with the
6
+ registered area. If the difference is within the error limit (yanılma sınırı), the
7
+ *registered* area is used; otherwise the area corrected under the cadastral rules is used.
8
+ 2. For a parcel only partly inside the readjustment boundary, the computed area of the part
9
+ inside is used; the area error stays with the part outside.
10
+ 3. The error limit. The original 2020 text gave two formulas (``F`` area in m², ``M`` sheet
11
+ scale denominator)::
12
+
13
+ built-up village / neighbourhood: f = 0.013 * sqrt(M * F) + 0.0003 * F
14
+ elsewhere: f = 0.0004 * M * sqrt(F) + 0.0003 * F
15
+
16
+ Since RG 11/9/2025-33014 the paragraph refers instead to the *Tapu Planlarında Yanılma
17
+ Sınırının Belirlenmesi Hakkında Yönetmelik* (RG 27/9/2022-31966). That regulation's
18
+ formulas were not verified for this package, so pass ``tolerance=`` (or set
19
+ ``Parcel.tolerance``) when the current limit differs. The square root in the first formula
20
+ is read as spanning ``M * F``; the Resmî Gazete PDF typesetting is ambiguous on this.
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ import math
26
+ from dataclasses import dataclass
27
+ from typing import Optional
28
+
29
+ from .errors import InputError
30
+
31
+
32
+ def area_tolerance(area: float, scale: int, built_up: bool = True) -> float:
33
+ """Error limit ``f`` (m²) for a parcel of ``area`` m² on a sheet of scale ``1:scale``.
34
+
35
+ Formulas of Yönetmelik m.31/3 as published in RG 22/2/2020-31047 (see module docstring;
36
+ replaced by a reference to the 2022 tolerance regulation in 2025).
37
+
38
+ >>> round(area_tolerance(1000, 1000, built_up=True), 2)
39
+ 13.3
40
+ >>> round(area_tolerance(1000, 1000, built_up=False), 2)
41
+ 12.95
42
+ """
43
+ if area <= 0 or scale <= 0:
44
+ raise InputError("Alan ve ölçek paydası pozitif olmalı.")
45
+ if built_up:
46
+ return 0.013 * math.sqrt(scale * area) + 0.0003 * area
47
+ return 0.0004 * scale * math.sqrt(area) + 0.0003 * area
48
+
49
+
50
+ @dataclass(frozen=True)
51
+ class AreaBasis:
52
+ """The area adopted for a parcel and why.
53
+
54
+ ``source`` is ``"tapu"`` (registered area, difference within limit or no computed area),
55
+ ``"hesap"`` (computed/corrected area, difference outside limit) or ``"kismi"``
56
+ (partly included parcel, computed area of the included part).
57
+ """
58
+
59
+ area: float
60
+ source: str
61
+ difference: Optional[float] = None
62
+ tolerance: Optional[float] = None
63
+
64
+ @property
65
+ def within_tolerance(self) -> Optional[bool]:
66
+ if self.difference is None or self.tolerance is None:
67
+ return None
68
+ return abs(self.difference) <= self.tolerance
69
+
70
+
71
+ def basis_area(
72
+ registered_area: float,
73
+ computed_area: Optional[float] = None,
74
+ *,
75
+ included_area: Optional[float] = None,
76
+ scale: Optional[int] = None,
77
+ built_up: bool = True,
78
+ tolerance: Optional[float] = None,
79
+ ) -> AreaBasis:
80
+ """Choose the area that enters the readjustment (Yönetmelik m.31/1-2).
81
+
82
+ Args:
83
+ registered_area: Tapu alanı.
84
+ computed_area: Area computed from coordinates (``None``: registered area is used).
85
+ included_area: Computed area of the included part of a partly included parcel.
86
+ scale: Sheet scale denominator for the error limit.
87
+ built_up: Selects the error-limit formula.
88
+ tolerance: Explicit error limit (m²); overrides the formula.
89
+
90
+ Raises:
91
+ InputError: if a computed area is given without ``scale`` or ``tolerance``.
92
+ """
93
+ if included_area is not None:
94
+ if included_area <= 0:
95
+ raise InputError("Düzenlemeye giren kısmın alanı pozitif olmalı.")
96
+ return AreaBasis(float(included_area), "kismi")
97
+ if computed_area is None:
98
+ return AreaBasis(float(registered_area), "tapu")
99
+ if tolerance is None:
100
+ if scale is None:
101
+ raise InputError(
102
+ "Hesaplanan alan verildiğinde yanılma sınırı için ölçek paydası (scale) "
103
+ "veya doğrudan yanılma sınırı (tolerance) gerekli."
104
+ )
105
+ tolerance = area_tolerance(registered_area, scale, built_up)
106
+ diff = float(computed_area) - float(registered_area)
107
+ if abs(diff) <= tolerance:
108
+ return AreaBasis(float(registered_area), "tapu", diff, tolerance)
109
+ return AreaBasis(float(computed_area), "hesap", diff, tolerance)
tr_dop/cli.py ADDED
@@ -0,0 +1,196 @@
1
+ """Komut satırı arayüzü: ``tr-dop``.
2
+
3
+ Alt komutlar:
4
+
5
+ * ``hesapla`` - DOP/KOP hesabı, dağıtım cetveli ve kontroller (JSON proje veya CSV'ler)
6
+ * ``kullanimlar`` - plan kullanımları kataloğu (DOP'tan karşılanıp karşılanamayacağı)
7
+ * ``yanilma`` - tapu/hesap alanı karşılaştırması ve yanılma sınırı
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import argparse
13
+ import json
14
+ import sys
15
+ from pathlib import Path
16
+ from typing import Optional, Sequence
17
+
18
+ from ._version import __version__
19
+ from .area import area_tolerance, basis_area
20
+ from .engine import run
21
+ from .errors import TrDopError
22
+ from .io import (
23
+ load_scheme,
24
+ read_allocations_csv,
25
+ read_new_parcels_csv,
26
+ read_parcels_csv,
27
+ read_plan_csv,
28
+ result_to_mapping,
29
+ settings_from_mapping,
30
+ write_outputs,
31
+ )
32
+ from .landuse import load_catalog
33
+ from .models import Scheme
34
+ from .report import to_markdown
35
+
36
+
37
+ def _parser() -> argparse.ArgumentParser:
38
+ p = argparse.ArgumentParser(
39
+ prog="tr-dop",
40
+ description=(
41
+ "3194 sayılı İmar Kanunu 18. madde (arazi ve arsa düzenlemesi) hesapları: "
42
+ "DOP oranı, parsel bazında DOP/KOP kesintileri, dağıtım ve hisselendirme."
43
+ ),
44
+ )
45
+ p.add_argument("--version", action="version", version=f"tr-dop {__version__}")
46
+ sub = p.add_subparsers(dest="komut", metavar="KOMUT")
47
+
48
+ h = sub.add_parser("hesapla", help="DOP hesabı, dağıtım cetveli ve kontroller")
49
+ h.add_argument("proje", nargs="?", help="JSON proje dosyası (examples/proje.json gibi)")
50
+ h.add_argument("--parseller", help="Parsel/malik CSV dosyası (malik başına bir satır)")
51
+ h.add_argument("--plan", help="Plan kullanımları CSV dosyası (kullanim, alan)")
52
+ h.add_argument("--yeni-parseller", help="Yeni imar parselleri CSV dosyası")
53
+ h.add_argument("--tahsisler", help="Elle tahsis CSV dosyası (parsel, yeni_parsel, alan)")
54
+ h.add_argument("--katalog", help="Kullanım kataloğunu değiştiren/genişleten JSON dosyası")
55
+ h.add_argument("--yontem", choices=["dengeli", "dogrudan"], help="DOP oranı yöntemi")
56
+ h.add_argument("--kop", choices=["orantili", "cakisma", "yok"], help="KOP paylaştırma")
57
+ h.add_argument("--ust-sinir", type=float, help="DOP üst sınırı (varsayılan 0.45)")
58
+ h.add_argument("--kapanan-yol", type=float, help="Kapanan imar/kadastro yolları (m²)")
59
+ h.add_argument("--hazine-taskin", type=float, help="Taşkın kontrolü için Hazine alanı (m²)")
60
+ h.add_argument("--kamu-alani", type=float, help="%%45 aşımı için bedelsiz kamu alanı (m²)")
61
+ h.add_argument("--asgari-parsel", type=float, help="Varsayılan asgari parsel alanı (m²)")
62
+ h.add_argument("-o", "--rapor", help="Markdown raporun yazılacağı dosya ('-' ekrana)")
63
+ h.add_argument("--csv-klasoru", help="CSV cetvellerinin yazılacağı klasör")
64
+ h.add_argument("--ayrac", default=",", help="CSV ayracı (varsayılan ',')")
65
+ h.add_argument("--json", dest="json_out", help="Sonuçların JSON olarak yazılacağı dosya")
66
+
67
+ k = sub.add_parser("kullanimlar", help="Plan kullanımları kataloğunu listele")
68
+ k.add_argument("--katalog", help="Katalog değişiklik JSON dosyası")
69
+ k.add_argument("--json", action="store_true", help="JSON çıktı")
70
+
71
+ y = sub.add_parser("yanilma", help="Tapu ve hesap alanı karşılaştırması (Yön. m.31)")
72
+ y.add_argument("--tapu", type=float, required=True, help="Tapu alanı (m²)")
73
+ y.add_argument("--hesap", type=float, help="Koordinattan hesaplanan alan (m²)")
74
+ y.add_argument("--olcek", type=int, required=True, help="Pafta ölçek paydası (ör. 1000)")
75
+ y.add_argument(
76
+ "--yerlesik-degil",
77
+ action="store_true",
78
+ help="Yapılaşmanın olduğu köy içi/mahalle dışındaki yerler formülü",
79
+ )
80
+ return p
81
+
82
+
83
+ def _load(args: argparse.Namespace) -> Scheme:
84
+ if args.proje:
85
+ scheme = load_scheme(args.proje)
86
+ else:
87
+ if not (args.parseller and args.plan):
88
+ raise TrDopError("Bir JSON proje dosyası ya da --parseller ve --plan verilmeli.")
89
+ scheme = Scheme(
90
+ parcels=read_parcels_csv(args.parseller), plan_uses=read_plan_csv(args.plan)
91
+ )
92
+ if args.parseller and args.proje:
93
+ scheme.parcels = read_parcels_csv(args.parseller)
94
+ if args.plan and args.proje:
95
+ scheme.plan_uses = read_plan_csv(args.plan)
96
+ if args.yeni_parseller:
97
+ scheme.new_parcels = read_new_parcels_csv(args.yeni_parseller)
98
+ if args.tahsisler:
99
+ scheme.allocations = read_allocations_csv(args.tahsisler)
100
+ overrides = {
101
+ "method": args.yontem,
102
+ "kop_mode": args.kop,
103
+ "cap": args.ust_sinir,
104
+ "closed_roads_area": args.kapanan_yol,
105
+ "treasury_flood_area": args.hazine_taskin,
106
+ "excess_cover_area": args.kamu_alani,
107
+ "min_parcel_area": args.asgari_parsel,
108
+ }
109
+ if any(v is not None for v in overrides.values()):
110
+ merged = dict(scheme.settings.__dict__)
111
+ merged.update({k: v for k, v in overrides.items() if v is not None})
112
+ scheme.settings = settings_from_mapping(merged)
113
+ scheme.__post_init__()
114
+ return scheme
115
+
116
+
117
+ def _cmd_hesapla(args: argparse.Namespace) -> int:
118
+ scheme = _load(args)
119
+ result = run(scheme, load_catalog(args.katalog))
120
+ md = to_markdown(result)
121
+ if args.rapor and args.rapor != "-":
122
+ Path(args.rapor).write_text(md, encoding="utf-8")
123
+ print(f"Rapor yazıldı: {args.rapor}")
124
+ if args.csv_klasoru:
125
+ for path in write_outputs(result, args.csv_klasoru, args.ayrac):
126
+ print(f"CSV yazıldı: {path}")
127
+ if args.json_out:
128
+ Path(args.json_out).write_text(
129
+ json.dumps(result_to_mapping(result), ensure_ascii=False, indent=2), encoding="utf-8"
130
+ )
131
+ print(f"JSON yazıldı: {args.json_out}")
132
+ if args.rapor == "-" or not (args.rapor or args.csv_klasoru or args.json_out):
133
+ print(md)
134
+ else:
135
+ d = result.dop
136
+ print(f"DOP oranı: {d.ratio:.7f} (%{d.ratio * 100:.5f})")
137
+ for c in result.failed:
138
+ print(f"[{c.level}] {c.message}")
139
+ return 0 if result.ok else 1
140
+
141
+
142
+ def _cmd_kullanimlar(args: argparse.Namespace) -> int:
143
+ cat = load_catalog(args.katalog)
144
+ if args.json:
145
+ print(json.dumps(cat.to_list(), ensure_ascii=False, indent=2))
146
+ return 0
147
+ print(f"{'Kod':<24} {'DOP':<6} {'Bent':<7} Ad / dayanak")
148
+ for u in cat:
149
+ flag = "evet" if u.dop else "hayır"
150
+ mark = "" if u.verified else " (*)"
151
+ print(f"{u.code:<24} {flag:<6} {u.priority or '-':<7} {u.name} [{u.ref}]{mark}")
152
+ print("(*) Birincil kaynakta adıyla doğrulanamadı; gerekirse --katalog ile değiştirin.")
153
+ return 0
154
+
155
+
156
+ def _cmd_yanilma(args: argparse.Namespace) -> int:
157
+ built = not args.yerlesik_degil
158
+ f = area_tolerance(args.tapu, args.olcek, built)
159
+ print(f"Yanılma sınırı: {f:.2f} m² (Yön. m.31/3, 2020 metni formülü)")
160
+ if args.hesap is not None:
161
+ b = basis_area(args.tapu, args.hesap, scale=args.olcek, built_up=built)
162
+ diff = b.difference or 0.0
163
+ if b.source == "tapu":
164
+ print(f"Fark {diff:+.2f} m² sınır içinde: tapu alanı ({b.area:.2f} m²) esas alınır.")
165
+ else:
166
+ print(
167
+ f"Fark {diff:+.2f} m² sınır dışında: düzeltilmiş alan ({b.area:.2f} m²) esas "
168
+ "alınır (kadastro müdürlüğü düzeltmesi gerekir, Yön. m.11/6-7, m.31/1)."
169
+ )
170
+ return 0
171
+
172
+
173
+ def main(argv: Optional[Sequence[str]] = None) -> int:
174
+ """Entry point; returns 0 on success, 1 if a check failed, 2 on input errors."""
175
+ for stream in (sys.stdout, sys.stderr):
176
+ reconfigure = getattr(stream, "reconfigure", None)
177
+ if reconfigure is not None:
178
+ try:
179
+ reconfigure(encoding="utf-8")
180
+ except (ValueError, OSError): # pragma: no cover
181
+ pass
182
+ parser = _parser()
183
+ args = parser.parse_args(list(argv) if argv is not None else None)
184
+ commands = {
185
+ "hesapla": _cmd_hesapla,
186
+ "kullanimlar": _cmd_kullanimlar,
187
+ "yanilma": _cmd_yanilma,
188
+ }
189
+ if args.komut not in commands:
190
+ parser.print_help()
191
+ return 2
192
+ try:
193
+ return commands[args.komut](args)
194
+ except (TrDopError, OSError) as exc:
195
+ print(f"Hata: {exc}", file=sys.stderr)
196
+ return 2
@@ -0,0 +1,51 @@
1
+ {
2
+ "_kaynak": [
3
+ "3194 sayili Imar Kanunu m.18/3 (7181 ve 7534 sayili Kanunlarla degisik; mevzuat.gov.tr metni, 2026)",
4
+ "Arazi ve Arsa Duzenlemeleri Hakkinda Yonetmelik (RG 22/2/2020-31047) m.4/1-p ve m.14/2; RG 11/9/2025-33014 ile degisik"
5
+ ],
6
+ "_not": "priority: Yonetmelik m.14/2 oncelik bendi. dop: DOP'tan karsilanabilir mi. verified=false olan satirlarda DOP kapsami Kanun metninde adiyla gecmez veya oncelik bendi tahminidir; m.14/2-a, c, ç, f, ğ, h, i bentleri 2020 metninden alinmis, 2025 degisikligiyle yalnizca a (ilk kismi), b, d, e, g ve ı bentlerinin degistigi dogrulanmistir. Gerekirse override edin.",
7
+ "uses": [
8
+ {"code": "yol", "name": "Yol", "dop": true, "priority": "a", "ref": "3194 m.18/3; Yon. m.14/2-a", "verified": true},
9
+ {"code": "meydan", "name": "Meydan", "dop": true, "priority": "a", "ref": "3194 m.18/3; Yon. m.14/2-a", "verified": true},
10
+ {"code": "park", "name": "Park", "dop": true, "priority": "a", "ref": "3194 m.18/3; Yon. m.14/2-a", "verified": true},
11
+ {"code": "otopark", "name": "Otopark", "dop": true, "priority": "a", "ref": "3194 m.18/3; Yon. m.14/2-a", "verified": true},
12
+ {"code": "cocuk_bahcesi", "name": "Çocuk bahçesi/parkı", "dop": true, "priority": "a", "ref": "3194 m.18/3; Yon. m.14/2-a", "verified": true},
13
+ {"code": "yesil_alan", "name": "Yeşil alan", "dop": true, "priority": "a", "ref": "3194 m.18/3; Yon. m.14/2-a", "verified": true},
14
+ {"code": "ibadet_yeri", "name": "İbadet yeri", "dop": true, "priority": "b", "ref": "3194 m.18/3; Yon. m.14/2-b", "verified": true},
15
+ {"code": "karakol", "name": "Karakol", "dop": true, "priority": "b", "ref": "3194 m.18/3; Yon. m.14/2-b", "verified": true},
16
+ {"code": "egitim", "name": "MEB'e bağlı öğretime yönelik eğitim tesis alanı", "dop": true, "priority": "b", "ref": "3194 m.18/3; Yon. m.14/2-b", "verified": true},
17
+ {"code": "kres", "name": "Kamuya ait kreş ve gündüz bakımevi", "dop": true, "priority": "b", "ref": "3194 m.18/3; Yon. m.14/2-b (2025 değişik)", "verified": true},
18
+ {"code": "pazar_yeri", "name": "Pazar yeri", "dop": true, "priority": "c", "ref": "3194 m.18/3; Yon. m.14/2-c", "verified": true},
19
+ {"code": "semt_spor_alani", "name": "Semt spor alanı", "dop": true, "priority": "c", "ref": "3194 m.18/3; Yon. m.14/2-c", "verified": true},
20
+ {"code": "toplu_tasima", "name": "Toplu taşıma istasyonu ve durağı", "dop": true, "priority": "c", "ref": "3194 m.18/3; Yon. m.14/2-c", "verified": true},
21
+ {"code": "saglik", "name": "Sağlık Bakanlığına bağlı sağlık tesis alanı", "dop": true, "priority": "ç", "ref": "3194 m.18/3; Yon. m.14/2-ç", "verified": true},
22
+ {"code": "erisme_kontrollu_yol", "name": "Erişme kontrolünün uygulandığı yol (otoyol hariç)", "dop": true, "priority": "d", "ref": "3194 m.18/3; Yon. m.14/2-d", "verified": true},
23
+ {"code": "su_yolu", "name": "Su yolu", "dop": true, "priority": "d", "ref": "3194 m.18/3; Yon. m.14/2-d (2025 değişik)", "verified": true},
24
+ {"code": "spor_alani", "name": "Bölgenin geneline hizmet veren spor alanı", "dop": true, "priority": "e", "ref": "3194 m.18/3; Yon. m.14/2-e (2025 değişik)", "verified": true},
25
+ {"code": "belediye_hizmet_alani", "name": "Belediye hizmet alanı", "dop": true, "priority": "f", "ref": "3194 m.18/3; Yon. m.14/2-f", "verified": true},
26
+ {"code": "sosyal_kulturel_tesis", "name": "Sosyal ve kültürel tesis alanı", "dop": true, "priority": "f", "ref": "3194 m.18/3; Yon. m.14/2-f", "verified": true},
27
+ {"code": "teknik_altyapi", "name": "Kamu hizmeti için planlanan teknik altyapı alanı", "dop": true, "priority": "g", "ref": "3194 m.18/3; Yon. m.14/2-g (2025 değişik)", "verified": true},
28
+ {"code": "trafo", "name": "Kamu hizmeti için planlanan trafo alanı", "dop": true, "priority": "g", "ref": "3194 m.18/3; Yon. m.14/2-g (2025 değişik)", "verified": true},
29
+ {"code": "rekreasyon", "name": "Rekreasyon alanı", "dop": true, "priority": "ğ", "ref": "3194 m.18/3; Yon. m.14/2-ğ", "verified": true},
30
+ {"code": "mesire", "name": "Mesire alanı", "dop": true, "priority": "ğ", "ref": "3194 m.18/3; Yon. m.14/2-ğ", "verified": true},
31
+ {"code": "agaclandirilacak_alan", "name": "Özel tesis yapılmasına konu olmayan ağaçlandırılacak alan", "dop": true, "priority": "ğ", "ref": "3194 m.18/3; Yon. m.14/2-ğ", "verified": true},
32
+ {"code": "resmi_kurum", "name": "Resmî kurum alanı", "dop": true, "priority": "h", "ref": "3194 m.18/3; Yon. m.14/2-h", "verified": true},
33
+ {"code": "idari_tesis", "name": "İdari tesis alanı", "dop": true, "priority": "ı", "ref": "Yon. m.4/1-p; m.14/2-ı (diğer)", "verified": false},
34
+ {"code": "kent_meydani", "name": "Kent meydanı", "dop": true, "priority": "ı", "ref": "Yon. m.4/1-p; 2025 değişikliğiyle m.14/2-e'den çıkarıldı, 'diğer' sayıldı", "verified": false},
35
+ {"code": "kent_parki", "name": "Kent parkı", "dop": true, "priority": "ı", "ref": "Yon. m.4/1-p; 2025 değişikliğiyle m.14/2-e'den çıkarıldı, 'diğer' sayıldı", "verified": false},
36
+ {"code": "diger_kamu", "name": "Uygulama imar planı kararıyla belirlenen diğer umumi ve kamu hizmet alanı", "dop": true, "priority": "ı", "ref": "3194 m.18/3; Yon. m.14/2-ı (2025 değişik)", "verified": true},
37
+ {"code": "mezarlik", "name": "Mezarlık alanı", "dop": true, "priority": "i", "ref": "Yon. m.14/2-i (2020 metni); Kanun listesinde adıyla yok", "verified": false},
38
+ {"code": "otogar", "name": "Otogar alanı", "dop": true, "priority": "i", "ref": "3194 m.18/3; Yon. m.14/2-i", "verified": true},
39
+ {"code": "taskin_kontrol", "name": "Taşkın kontrol tesisi", "dop": true, "priority": "taşkın", "flood_control": true, "ref": "3194 m.18/3 (7534 değişik); Yon. m.14/3", "verified": true},
40
+ {"code": "konut", "name": "Konut alanı", "dop": false, "ref": "Özel mülkiyete konu kullanım", "verified": true},
41
+ {"code": "ticaret", "name": "Ticaret alanı", "dop": false, "ref": "Özel mülkiyete konu kullanım", "verified": true},
42
+ {"code": "konut_ticaret", "name": "Konut + ticaret (karma) alanı", "dop": false, "ref": "Özel mülkiyete konu kullanım", "verified": true},
43
+ {"code": "sanayi", "name": "Sanayi alanı", "dop": false, "ref": "Özel mülkiyete konu kullanım", "verified": true},
44
+ {"code": "depolama", "name": "Depolama alanı", "dop": false, "ref": "Özel mülkiyete konu kullanım", "verified": true},
45
+ {"code": "turizm", "name": "Turizm tesis alanı", "dop": false, "ref": "Özel mülkiyete konu kullanım", "verified": true},
46
+ {"code": "akaryakit", "name": "Akaryakıt servis istasyonu", "dop": false, "ref": "Özel mülkiyete konu kullanım", "verified": true},
47
+ {"code": "ozel_egitim", "name": "Özel eğitim tesis alanı", "dop": false, "ref": "Kanun MEB'e bağlı (kamu) eğitimi sayar", "verified": true},
48
+ {"code": "ozel_saglik", "name": "Özel sağlık tesis alanı", "dop": false, "ref": "Kanun Sağlık Bakanlığına bağlı tesisi sayar", "verified": true},
49
+ {"code": "otoyol", "name": "Otoyol", "dop": false, "ref": "3194 m.18/3: 'otoyol hariç'", "verified": true}
50
+ ]
51
+ }