tr-adres 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_adres/__init__.py +85 -0
- tr_adres/__main__.py +7 -0
- tr_adres/_sozluk.py +62 -0
- tr_adres/cli.py +160 -0
- tr_adres/data/gazetteer.json +1 -0
- tr_adres/formatter.py +96 -0
- tr_adres/gazetteer.py +349 -0
- tr_adres/metin.py +124 -0
- tr_adres/model.py +82 -0
- tr_adres/pandas_ext.py +62 -0
- tr_adres/parser.py +1021 -0
- tr_adres/py.typed +0 -0
- tr_adres-0.1.0.dist-info/METADATA +315 -0
- tr_adres-0.1.0.dist-info/RECORD +18 -0
- tr_adres-0.1.0.dist-info/WHEEL +5 -0
- tr_adres-0.1.0.dist-info/entry_points.txt +2 -0
- tr_adres-0.1.0.dist-info/licenses/LICENSE +21 -0
- tr_adres-0.1.0.dist-info/top_level.txt +1 -0
tr_adres/__init__.py
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"""tr-adres: parse and normalise Turkish postal addresses.
|
|
2
|
+
|
|
3
|
+
>>> import tr_adres
|
|
4
|
+
>>> a = tr_adres.parse("Caferaga mh. Moda cd. No:12/3 Kadikoy/Istanbul")
|
|
5
|
+
>>> a.mahalle, a.cadde, a.bina_no, a.daire_no, a.ilce, a.il
|
|
6
|
+
('Caferağa', 'Moda', '12', '3', 'Kadıköy', 'İstanbul')
|
|
7
|
+
>>> tr_adres.normalize("ataturk mah 1234 sk no 5 d 7 bornova izmir")
|
|
8
|
+
'Atatürk Mah. 1234 Sk. No:5 D:7 Bornova/İzmir'
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import sys
|
|
14
|
+
|
|
15
|
+
from .formatter import STILLER, format_adres, normalize
|
|
16
|
+
from .gazetteer import (
|
|
17
|
+
Il,
|
|
18
|
+
Ilce,
|
|
19
|
+
il_bul,
|
|
20
|
+
ilce_ara,
|
|
21
|
+
ilce_bul,
|
|
22
|
+
ilceler,
|
|
23
|
+
iller,
|
|
24
|
+
is_valid_ilce,
|
|
25
|
+
kaynak,
|
|
26
|
+
merkez_ilce,
|
|
27
|
+
plaka,
|
|
28
|
+
posta_kodu_il,
|
|
29
|
+
posta_kodu_ilceler,
|
|
30
|
+
)
|
|
31
|
+
from .metin import ascii_fold, edit_distance, tr_lower, tr_title, tr_upper
|
|
32
|
+
from .model import ALANLAR, Adres
|
|
33
|
+
from .parser import parse, parse_many
|
|
34
|
+
|
|
35
|
+
__version__ = "0.1.0"
|
|
36
|
+
|
|
37
|
+
#: Alias of :func:`format_adres` (``tr_adres.format(adres, style="resmi")``).
|
|
38
|
+
format = format_adres # noqa: A001
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def register_pandas_accessor() -> None:
|
|
42
|
+
"""Register the ``Series.tradres`` accessor (requires the ``pandas`` extra).
|
|
43
|
+
|
|
44
|
+
Called automatically on import when pandas has already been imported; otherwise call
|
|
45
|
+
it yourself or ``import tr_adres.pandas_ext``.
|
|
46
|
+
"""
|
|
47
|
+
from . import pandas_ext # noqa: F401
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
if "pandas" in sys.modules: # pragma: no cover - depends on import order
|
|
51
|
+
try:
|
|
52
|
+
register_pandas_accessor()
|
|
53
|
+
except ImportError:
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
__all__ = [
|
|
57
|
+
"ALANLAR",
|
|
58
|
+
"Adres",
|
|
59
|
+
"Il",
|
|
60
|
+
"Ilce",
|
|
61
|
+
"STILLER",
|
|
62
|
+
"__version__",
|
|
63
|
+
"ascii_fold",
|
|
64
|
+
"edit_distance",
|
|
65
|
+
"format",
|
|
66
|
+
"format_adres",
|
|
67
|
+
"il_bul",
|
|
68
|
+
"ilce_ara",
|
|
69
|
+
"ilce_bul",
|
|
70
|
+
"ilceler",
|
|
71
|
+
"iller",
|
|
72
|
+
"is_valid_ilce",
|
|
73
|
+
"kaynak",
|
|
74
|
+
"merkez_ilce",
|
|
75
|
+
"normalize",
|
|
76
|
+
"parse",
|
|
77
|
+
"parse_many",
|
|
78
|
+
"plaka",
|
|
79
|
+
"posta_kodu_il",
|
|
80
|
+
"posta_kodu_ilceler",
|
|
81
|
+
"register_pandas_accessor",
|
|
82
|
+
"tr_lower",
|
|
83
|
+
"tr_title",
|
|
84
|
+
"tr_upper",
|
|
85
|
+
]
|
tr_adres/__main__.py
ADDED
tr_adres/_sozluk.py
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""Diacritic restoration for ASCII-typed words ("Ataturk" → "Atatürk").
|
|
2
|
+
|
|
3
|
+
Only words whose ASCII-folded form maps to a single Turkish spelling are restored. The
|
|
4
|
+
list is deliberately small: common words of street, neighbourhood and building names plus
|
|
5
|
+
the names of all provinces and of districts with five or more letters. Words not listed
|
|
6
|
+
here are left as typed.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from functools import lru_cache
|
|
12
|
+
from typing import Dict
|
|
13
|
+
|
|
14
|
+
from .metin import anahtar
|
|
15
|
+
|
|
16
|
+
_KELIMELER = """
|
|
17
|
+
Atatürk İstiklal İnönü Paşa Şehit Şehitler Şht Bağdat Büyükdere Çakmak Kazım İsmet
|
|
18
|
+
Yıldız Güneş Çiçek Gül Menekşe Çınar Çamlık Çamlıca Bahçe Bahçeli Bahçesi Yeşil Hürriyet
|
|
19
|
+
Özgürlük İstasyon Çarşı Çarşısı Köprü Köprüsü Kültür Üniversite Ömer Hüseyin Şair Hacı
|
|
20
|
+
Kızılay Gökalp Talatpaşa Nişantaşı Teşvikiye Maçka Kuruçeşme Caferağa Göztepe Erenköy
|
|
21
|
+
Bostancı Kozyatağı Ataköy Yeşilköy Şirinevler Güneşli Mecidiyeköy Karşıyaka Bostanlı
|
|
22
|
+
Mavişehir Batıkent Keçiören Işıklar Görükle Özlüce Çekirge Kardeşler Barış İnci Zümrüt
|
|
23
|
+
Çağlayan Gündoğdu Doğu Batı Güney Üçyol Beşyol Fırat Beyazıt Süleymaniye Şişhane
|
|
24
|
+
Gümüşsuyu Feriköy Kurtuluş Ağaçlı Çağdaş Gökkuşağı Söğüt Söğütlü Meşe Ihlamur Fındık
|
|
25
|
+
Üzüm İkbal İnkılap Bağlar Bağlarbaşı Güzelyalı Güzeltepe Göl Değirmen Değirmendere
|
|
26
|
+
Pınar Köşk Köşkü Sarayı Çıkmazı Bulvarı Sokağı Apartmanı Konutları Hanı Pasajı
|
|
27
|
+
Öğretmenler Öğretmen Özal Çınarlı Güzel Ağa Hanım Şeyh Ilıca Kaplıca Çeşmesi Köyü Gümüş
|
|
28
|
+
Altın Bakır Taşlı Topkapı Kumkapı Edirnekapı Yusufpaşa Cerrahpaşa Şehremini
|
|
29
|
+
Kocamustafapaşa Halkalı Sefaköy Sultançiftliği Fevzipaşa Çayyolu Ümitköy Etlik Şirinyer
|
|
30
|
+
Üçkuyular Kemeraltı Laleli Tarabya Yeniköy İstinye Bebek Çengelköy Kuzguncuk Beylerbeyi
|
|
31
|
+
Kanlıca Paşabahçe Anadoluhisarı Rumelihisarı Hisarüstü Ayazağa Gültepe Okmeydanı
|
|
32
|
+
Kasımpaşa Hasköy Sütlüce Eyüp Alibeyköy Mahmutbey Bahçeşehir Gürpınar Ambarlı Cihangir
|
|
33
|
+
Tarlabaşı Karaköy Kabataş Dolmabahçe Gayrettepe Zincirlikuyu Vişnezade Türkali Abbasağa
|
|
34
|
+
Hükümet Gençlik Sağlık Toptancılar Küçük Büyük Üst Aşağı Yukarı İçerenköy İçmeler
|
|
35
|
+
Geçit Meydanı Yokuşu Kavşağı Çıkmaz Sümer Selçuk Selçuklu Osmanlı Fatih Mehmet Ahmet
|
|
36
|
+
Mahmut Şükrü Rüştü Gürsel Özgür Doğan Gökhan Ümit Türk Türkmen Sakız Şeker Yaşar
|
|
37
|
+
Fevzi Çelebi Ertuğrul Orhangazi Kanuni Muradiye Uğur Ilgaz Şafak Şenlik Şirin
|
|
38
|
+
Gökçe Gökçen Göksu Aydınlık Aydınlıkevler Esenyalı Kartaltepe Şenesenevler Bağcılar
|
|
39
|
+
Eğitim Öğrenci Hastane Müze Kışla Kışlası Tepebaşı Ulubatlı Hasan Kocatepe Dumlupınar
|
|
40
|
+
Sakarya Kocaeli Gazi Mustafa Kemal Paşabahçe Ağaçlı Şükran Gülbahçe Gülistan Gülşen
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@lru_cache(maxsize=1)
|
|
45
|
+
def duzeltme_sozlugu() -> Dict[str, str]:
|
|
46
|
+
"""Folded key → Turkish spelling, for unambiguous words only."""
|
|
47
|
+
from .gazetteer import iller
|
|
48
|
+
|
|
49
|
+
words = list(_KELIMELER.split())
|
|
50
|
+
for il in iller():
|
|
51
|
+
words.append(il.ad)
|
|
52
|
+
words.extend(n for n in il.ilceler if " " not in n and len(anahtar(n)) >= 5)
|
|
53
|
+
out: Dict[str, str] = {}
|
|
54
|
+
clash = set()
|
|
55
|
+
for w in words:
|
|
56
|
+
k = anahtar(w)
|
|
57
|
+
if k in out and out[k] != w:
|
|
58
|
+
clash.add(k)
|
|
59
|
+
out.setdefault(k, w)
|
|
60
|
+
for k in clash:
|
|
61
|
+
del out[k]
|
|
62
|
+
return out
|
tr_adres/cli.py
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"""Command-line interface: ``tr-adres parse`` and ``tr-adres normalize``.
|
|
2
|
+
|
|
3
|
+
Examples::
|
|
4
|
+
|
|
5
|
+
tr-adres parse "Caferağa Mah. Moda Cad. No:12/3 Kadıköy/İstanbul"
|
|
6
|
+
tr-adres normalize "caferaga mh moda cd no 12 kadikoy"
|
|
7
|
+
tr-adres normalize musteriler.csv --column adres -o temiz.csv
|
|
8
|
+
tr-adres parse musteriler.csv --column adres -o ayrik.csv
|
|
9
|
+
cat adresler.txt | tr-adres normalize -
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import argparse
|
|
15
|
+
import csv
|
|
16
|
+
import io
|
|
17
|
+
import json
|
|
18
|
+
import os
|
|
19
|
+
import sys
|
|
20
|
+
from typing import IO, Iterator, List, Optional, Sequence
|
|
21
|
+
|
|
22
|
+
from . import __version__
|
|
23
|
+
from .formatter import STILLER, format_adres
|
|
24
|
+
from .model import ALANLAR
|
|
25
|
+
from .parser import parse
|
|
26
|
+
|
|
27
|
+
__all__ = ["main"]
|
|
28
|
+
|
|
29
|
+
_PARSE_COLUMNS = [*ALANLAR, "il_plaka", "confidence", "kalan"]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _is_file(arg: str, column: Optional[str]) -> bool:
|
|
33
|
+
if column is not None:
|
|
34
|
+
return True
|
|
35
|
+
return arg.lower().endswith((".csv", ".tsv", ".txt")) and os.path.isfile(arg)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _sniff(sample: str) -> str:
|
|
39
|
+
try:
|
|
40
|
+
return csv.Sniffer().sniff(sample, delimiters=",;\t|").delimiter
|
|
41
|
+
except csv.Error:
|
|
42
|
+
return ","
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _stdin_lines() -> Iterator[str]:
|
|
46
|
+
for line in sys.stdin:
|
|
47
|
+
line = line.rstrip("\r\n")
|
|
48
|
+
if line.strip():
|
|
49
|
+
yield line
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _run_text(cmd: str, texts: Sequence[str], style: str, out: IO[str]) -> None:
|
|
53
|
+
for text in texts:
|
|
54
|
+
if cmd == "parse":
|
|
55
|
+
d = parse(text).to_dict()
|
|
56
|
+
indent = 2 if len(texts) == 1 else None
|
|
57
|
+
out.write(json.dumps(d, ensure_ascii=False, indent=indent) + "\n")
|
|
58
|
+
else:
|
|
59
|
+
out.write(format_adres(parse(text), style) + "\n")
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _run_csv(args: argparse.Namespace, out: IO[str]) -> int:
|
|
63
|
+
with open(args.input, encoding=args.encoding, newline="") as fh:
|
|
64
|
+
sample = fh.read(65536)
|
|
65
|
+
fh.seek(0)
|
|
66
|
+
delim = args.delimiter or _sniff(sample)
|
|
67
|
+
reader = csv.DictReader(fh, delimiter=delim)
|
|
68
|
+
fields = list(reader.fieldnames or [])
|
|
69
|
+
column = args.column
|
|
70
|
+
if column is None:
|
|
71
|
+
column = "adres" if "adres" in fields else (fields[0] if len(fields) == 1 else None)
|
|
72
|
+
if column is None or column not in fields:
|
|
73
|
+
print(
|
|
74
|
+
f"tr-adres: column {column or '(none given)'!r} not found; "
|
|
75
|
+
f"available: {', '.join(fields)}",
|
|
76
|
+
file=sys.stderr,
|
|
77
|
+
)
|
|
78
|
+
return 2
|
|
79
|
+
if args.command == "parse":
|
|
80
|
+
prefix = args.prefix if args.prefix is not None else f"{column}_"
|
|
81
|
+
new_cols = [prefix + c for c in _PARSE_COLUMNS]
|
|
82
|
+
else:
|
|
83
|
+
new_cols = [args.output_column or f"{column}_normalize"]
|
|
84
|
+
writer = csv.DictWriter(
|
|
85
|
+
out, fieldnames=fields + [c for c in new_cols if c not in fields], delimiter=delim
|
|
86
|
+
)
|
|
87
|
+
writer.writeheader()
|
|
88
|
+
n = 0
|
|
89
|
+
for row in reader:
|
|
90
|
+
text = row.get(column) or ""
|
|
91
|
+
if args.command == "parse":
|
|
92
|
+
d = parse(text).to_dict()
|
|
93
|
+
for c, name in zip(_PARSE_COLUMNS, new_cols):
|
|
94
|
+
v = d[c]
|
|
95
|
+
row[name] = "" if v is None else v
|
|
96
|
+
else:
|
|
97
|
+
row[new_cols[0]] = format_adres(parse(text), args.style) if text.strip() else ""
|
|
98
|
+
writer.writerow(row)
|
|
99
|
+
n += 1
|
|
100
|
+
print(f"tr-adres: {n} satır işlendi", file=sys.stderr)
|
|
101
|
+
return 0
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _build_parser() -> argparse.ArgumentParser:
|
|
105
|
+
ap = argparse.ArgumentParser(
|
|
106
|
+
prog="tr-adres", description="Parse and normalise Turkish postal addresses."
|
|
107
|
+
)
|
|
108
|
+
ap.add_argument("--version", action="version", version=f"tr-adres {__version__}")
|
|
109
|
+
sub = ap.add_subparsers(dest="command", required=True)
|
|
110
|
+
for name, help_text in (
|
|
111
|
+
("parse", "split an address into its components (JSON, or columns for a CSV)"),
|
|
112
|
+
("normalize", "rewrite an address in canonical one-line form"),
|
|
113
|
+
):
|
|
114
|
+
p = sub.add_parser(name, help=help_text, description=help_text)
|
|
115
|
+
p.add_argument("input", help="address text, a .csv file, or '-' for one address per line")
|
|
116
|
+
p.add_argument("--column", "-c", help="CSV column holding the address (default: adres)")
|
|
117
|
+
p.add_argument("-o", "--output", help="output file (default: stdout)")
|
|
118
|
+
p.add_argument("--style", choices=STILLER, default="kargo", help="normalize style")
|
|
119
|
+
p.add_argument("--delimiter", help="CSV delimiter (default: sniffed)")
|
|
120
|
+
p.add_argument("--encoding", default="utf-8-sig", help="input encoding")
|
|
121
|
+
p.add_argument(
|
|
122
|
+
"--output-encoding",
|
|
123
|
+
default="utf-8",
|
|
124
|
+
help="output file encoding (use utf-8-sig for Excel)",
|
|
125
|
+
)
|
|
126
|
+
if name == "parse":
|
|
127
|
+
p.add_argument("--prefix", help="prefix of the added CSV columns (default: COLUMN_)")
|
|
128
|
+
else:
|
|
129
|
+
p.add_argument("--output-column", help="name of the added CSV column")
|
|
130
|
+
return ap
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def main(argv: Optional[List[str]] = None) -> int:
|
|
134
|
+
"""Entry point of the ``tr-adres`` command; returns the exit status."""
|
|
135
|
+
args = _build_parser().parse_args(argv)
|
|
136
|
+
if args.output:
|
|
137
|
+
out: IO[str] = open(args.output, "w", encoding=args.output_encoding, newline="")
|
|
138
|
+
else:
|
|
139
|
+
out = sys.stdout
|
|
140
|
+
if isinstance(out, io.TextIOWrapper) and out.encoding.lower() not in ("utf-8", "utf8"):
|
|
141
|
+
try:
|
|
142
|
+
out.reconfigure(encoding="utf-8")
|
|
143
|
+
except (AttributeError, ValueError): # pragma: no cover
|
|
144
|
+
pass
|
|
145
|
+
try:
|
|
146
|
+
if args.input != "-" and _is_file(args.input, args.column):
|
|
147
|
+
if not os.path.isfile(args.input):
|
|
148
|
+
print(f"tr-adres: file not found: {args.input}", file=sys.stderr)
|
|
149
|
+
return 2
|
|
150
|
+
return _run_csv(args, out)
|
|
151
|
+
texts = list(_stdin_lines()) if args.input == "-" else [args.input]
|
|
152
|
+
_run_text(args.command, texts, args.style, out)
|
|
153
|
+
return 0
|
|
154
|
+
finally:
|
|
155
|
+
if args.output:
|
|
156
|
+
out.close()
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
if __name__ == "__main__": # pragma: no cover
|
|
160
|
+
sys.exit(main())
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"kaynak":{"ilce_adlari":"T.C. İçişleri Bakanlığı, Mülki İdare Bölümleri Envanteri","posta_kodlari":"PTT posta kodu sorgusu (ilçe başına en küçük-en büyük aralık)","derleme":"tr.wikipedia.org 'Türkiye'nin ilçeleri', revizyon 37373921","erisim":"2026-11-08"},"il_sayisi":81,"ilce_sayisi":973,"iller":[[1,"Adana",[["Aladağ",[[1720,1722]]],["Ceyhan",[[1920,1924]]],["Çukurova",[[1170,1360]]],["Feke",[[1660,1662]]],["İmamoğlu",[[1700,1702]]],["Karaisalı",[[1770,1770]]],["Karataş",[[1900,1900]]],["Kozan",[[1500,1502]]],["Pozantı",[[1470,1490]]],["Saimbeyli",[[1740,1740]]],["Sarıçam",[[1250,1790]]],["Seyhan",[[1020,1355]]],["Tufanbeyli",[[1640,1642]]],["Yumurtalık",[[1680,1682]]],["Yüreğir",[[1220,1415]]]]],[2,"Adıyaman",[["Adıyaman",[[2010,2290]]],["Besni",[[2300,2348]]],["Çelikhan",[[2600,2610]]],["Gerger",[[2702,2702]]],["Gölbaşı",[[2502,2540]]],["Kâhta",[[2402,2450]]],["Samsat",[[2802,2802]]],["Sincik",[[2900,2902]]],["Tut",[[2350,2352]]]]],[3,"Afyonkarahisar",[["Afyonkarahisar",[[3030,3215]]],["Başmakçı",[[3450,3452]]],["Bayat",[[3780,3782]]],["Bolvadin",[[3300,3350]]],["Çay",[[3700,3720]]],["Çobanlar",[[3062,3107]]],["Dazkırı",[[3950,3952]]],["Dinar",[[3400,3490]]],["Emirdağ",[[3602,3680]]],["Evciler",[[3960,3962]]],["Hocalar",[[3532,3532]]],["İhsaniye",[[3370,3384]]],["İscehisar",[[3750,3754]]],["Kızılören",[[3560,3562]]],["Sandıklı",[[3500,3510]]],["Sinanpaşa",[[3110,3880]]],["Sultandağı",[[3900,3940]]],["Şuhut",[[3800,3830]]]]],[4,"Ağrı",[["Ağrı",[[4010,4200]]],["Diyadin",[[4900,4902]]],["Doğubayazıt",[[4400,4402]]],["Eleşkirt",[[4602,4640]]],["Hamur",[[4852,4852]]],["Patnos",[[4500,4510]]],["Taşlıçay",[[4800,4802]]],["Tutak",[[4700,4702]]]]],[5,"Amasya",[["Amasya",[[5100,5240]]],["Göynücek",[[5902,5902]]],["Gümüşhacıköy",[[5700,5702]]],["Hamamözü",[[5720,5722]]],["Merzifon",[[5300,5302]]],["Suluova",[[5500,5502]]],["Taşova",[[5800,5802]]]]],[6,"Ankara",[["Akyurt",[[6750,6750]]],["Altındağ",[[6080,6360]]],["Ayaş",[[6710,6710]]],["Balâ",[[6720,6720]]],["Beypazarı",[[6730,6730]]],["Çamlıdere",[[6740,6740]]],["Çankaya",[[6420,6810]]],["Çubuk",[[6760,6760]]],["Elmadağ",[[6780,6850]]],["Etimesgut",[[6790,6827]]],["Evren",[[6770,6770]]],["Gölbaşı",[[6830,6830]]],["Güdül",[[6840,6840]]],["Haymana",[[6860,6860]]],["Kahramankazan",[[6980,6980]]],["Kalecik",[[6870,6870]]],["Keçiören",[[6010,6300]]],["Kızılcahamam",[[6890,6890]]],["Mamak",[[6260,6852]]],["Nallıhan",[[6920,6920]]],["Polatlı",[[6900,6900]]],["Pursaklar",[[6145,6145]]],["Sincan",[[6909,6946]]],["Şereflikoçhisar",[[6950,6950]]],["Yenimahalle",[[6105,6560]]]]],[7,"Antalya",[["Akseki",[[7630,7650]]],["Aksu",[[7112,7112]]],["Alanya",[[7400,7450]]],["Demre",[[7570,7572]]],["Döşemealtı",[[7190,7190]]],["Elmalı",[[7700,7700]]],["Finike",[[7740,7740]]],["Gazipaşa",[[7900,7900]]],["Gündoğmuş",[[7860,7860]]],["İbradı",[[7680,7680]]],["Kaş",[[7580,7974]]],["Kemer",[[7980,7995]]],["Kepez",[[7020,7320]]],["Konyaaltı",[[7070,7130]]],["Korkuteli",[[7800,7800]]],["Kumluca",[[7350,7350]]],["Manavgat",[[7550,7600]]],["Muratpaşa",[[7040,7300]]],["Serik",[[7500,7500]]]]],[8,"Artvin",[["Ardanuç",[[8390,8390]]],["Arhavi",[[8200,8290]]],["Artvin",[[8100,8100]]],["Borçka",[[8400,8490]]],["Hopa",[[8600,8690]]],["Kemalpaşa",[]],["Murgul",[[8500,8590]]],["Şavşat",[[8700,8790]]],["Yusufeli",[[8800,8890]]]]],[9,"Aydın",[["Bozdoğan",[[9760,9760]]],["Buharkent",[[9670,9670]]],["Çine",[[9500,9500]]],["Didim",[[9270,9270]]],["Efeler",[[9010,9630]]],["Germencik",[[9330,9700]]],["İncirliova",[[9600,9600]]],["Karacasu",[[9370,9370]]],["Karpuzlu",[[9540,9540]]],["Koçarlı",[[9970,9970]]],["Köşk",[[9570,9570]]],["Kuşadası",[[9400,9400]]],["Kuyucak",[[9930,9930]]],["Nazilli",[[9800,9800]]],["Söke",[[9200,9200]]],["Sultanhisar",[[9470,9470]]],["Yenipazar",[[9350,9350]]]]],[10,"Balıkesir",[["Altıeylül",[[10040,10195]]],["Ayvalık",[[10280,10410]]],["Balya",[[10842,10842]]],["Bandırma",[[10200,10250]]],["Bigadiç",[[10440,10463]]],["Burhaniye",[[10700,10702]]],["Dursunbey",[[10802,10802]]],["Edremit",[[10300,10870]]],["Erdek",[[10500,10502]]],["Gömeç",[[10715,10720]]],["Gönen",[[10680,10902]]],["Havran",[[10560,10562]]],["İvrindi",[[10770,10780]]],["Karesi",[[10010,10180]]],["Kepsut",[[10662,10662]]],["Manyas",[[10740,10742]]],["Marmara",[[10360,10940]]],["Savaştepe",[[10580,10582]]],["Sındırgı",[[10330,10332]]],["Susurluk",[[10600,10610]]]]],[11,"Bilecik",[["Bilecik",[[11100,11230]]],["Bozüyük",[[11300,11460]]],["Gölpazarı",[[11700,11702]]],["İnhisar",[[11640,11642]]],["Osmaneli",[[11500,11502]]],["Pazaryeri",[[11800,11802]]],["Söğüt",[[11600,11602]]],["Yenipazar",[[11780,11782]]]]],[12,"Bingöl",[["Adaklı",[[12600,12602]]],["Bingöl",[[12002,12402]]],["Genç",[[12500,12502]]],["Karlıova",[[12902,12902]]],["Kiğı",[[12800,12802]]],["Solhan",[[12700,12702]]],["Yayladere",[[12650,12652]]],["Yedisu",[[12830,12832]]]]],[13,"Bitlis",[["Adilcevaz",[[13500,13504]]],["Ahlat",[[13400,13403]]],["Bitlis",[[13001,13100]]],["Güroymak",[[13800,13810]]],["Hizan",[[13600,13602]]],["Mutki",[[13700,13705]]],["Tatvan",[[13200,13202]]]]],[14,"Bolu",[["Bolu",[[14030,14300]]],["Dörtdivan",[[14910,14912]]],["Gerede",[[14900,14902]]],["Göynük",[[14780,14782]]],["Kıbrıscık",[[14610,14612]]],["Mengen",[[14840,14850]]],["Mudurnu",[[14800,14810]]],["Seben",[[14750,14752]]],["Yeniçağa",[[14650,14652]]]]],[15,"Burdur",[["Ağlasun",[[15800,15802]]],["Altınyayla",[[15420,15422]]],["Bucak",[[15300,15325]]],["Burdur",[[15030,15200]]],["Çavdır",[[15900,15930]]],["Çeltikçi",[[15070,15072]]],["Gölhisar",[[15400,15413]]],["Karamanlı",[[15700,15702]]],["Kemer",[[15090,15092]]],["Tefenni",[[15600,15602]]],["Yeşilova",[[15500,15502]]]]],[16,"Bursa",[["Büyükorhan",[[16990,16990]]],["Gemlik",[[16600,16600]]],["Gürsu",[[16580,16580]]],["Harmancık",[[16770,16770]]],["İnegöl",[[16400,16400]]],["İznik",[[16860,16860]]],["Karacabey",[[16700,16700]]],["Keles",[[16740,16740]]],["Kestel",[[16450,16450]]],["Mudanya",[[16940,16940]]],["Mustafakemalpaşa",[[16500,16500]]],["Nilüfer",[[16215,16290]]],["Orhaneli",[[16980,16980]]],["Orhangazi",[[16800,16800]]],["Osmangazi",[[16010,16190]]],["Yenişehir",[[16900,16900]]],["Yıldırım",[[16300,16370]]]]],[17,"Çanakkale",[["Ayvacık",[[17862,17980]]],["Bayramiç",[[17720,17722]]],["Biga",[[17202,17950]]],["Bozcaada",[[17680,17680]]],["Çan",[[17400,17410]]],["Çanakkale",[[17100,17110]]],["Eceabat",[[17900,17902]]],["Ezine",[[17600,17610]]],["Gelibolu",[[17340,17502]]],["Gökçeada",[[17760,17762]]],["Lapseki",[[17800,17820]]],["Yenice",[[17550,17600]]]]],[18,"Çankırı",[["Atkaracalar",[[18310,18315]]],["Bayramören",[[18320,18322]]],["Çankırı",[[18010,18200]]],["Çerkeş",[[18600,18602]]],["Eldivan",[[18700,18702]]],["Ilgaz",[[18400,18402]]],["Kızılırmak",[[18280,18282]]],["Korgun",[[18260,18262]]],["Kurşunlu",[[18300,18302]]],["Orta",[[18800,18802]]],["Şabanözü",[[18650,18652]]],["Yapraklı",[[18900,18902]]]]],[19,"Çorum",[["Alaca",[[19600,19602]]],["Bayat",[[19800,19802]]],["Boğazkale",[[19310,19312]]],["Çorum",[[19010,19200]]],["Dodurga",[[19060,19062]]],["İskilip",[[19400,19402]]],["Kargı",[[19900,19902]]],["Laçin",[[19020,19022]]],["Mecitözü",[[19700,19702]]],["Oğuzlar",[[19070,19072]]],["Ortaköy",[[19950,19952]]],["Osmancık",[[19500,19502]]],["Sungurlu",[[19300,19302]]],["Uğurludağ",[[19410,19412]]]]],[20,"Denizli",[["Acıpayam",[[20800,20800]]],["Babadağ",[[20480,20480]]],["Baklan",[]],["Bekilli",[[20930,20930]]],["Beyağaç",[[20590,20590]]],["Bozkurt",[[20370,20370]]],["Buldan",[[20400,20400]]],["Çal",[[20700,20700]]],["Çameli",[[20980,20980]]],["Çardak",[[20350,20350]]],["Çivril",[[20600,20600]]],["Güney",[[20460,20460]]],["Honaz",[[20330,20330]]],["Kale",[[20570,20570]]],["Merkezefendi",[[20010,20060]]],["Pamukkale",[[20150,20260]]],["Sarayköy",[[20300,20300]]],["Serinhisar",[[20430,20430]]],["Tavas",[[20500,20500]]]]],[21,"Diyarbakır",[["Bağlar",[[21050,21090]]],["Bismil",[[21500,21500]]],["Çermik",[[21600,21600]]],["Çınar",[[21750,21750]]],["Çüngüş",[[21870,21870]]],["Dicle",[[21830,21830]]],["Eğil",[[21470,21470]]],["Ergani",[[21950,21950]]],["Hani",[[21800,21800]]],["Hazro",[[21560,21560]]],["Kayapınar",[[21070,21070]]],["Kocaköy",[[21450,21450]]],["Kulp",[[21900,21900]]],["Lice",[[21700,21700]]],["Silvan",[[21640,21640]]],["Sur",[[21200,21300]]],["Yenişehir",[[21010,21100]]]]],[22,"Edirne",[["Edirne",[[22100,22130]]],["Enez",[[22700,22750]]],["Havsa",[[22500,22532]]],["İpsala",[[22400,22490]]],["Keşan",[[22272,22880]]],["Lalapaşa",[[22970,22970]]],["Meriç",[[22600,22680]]],["Süloğlu",[[22560,22580]]],["Uzunköprü",[[22200,22402]]]]],[23,"Elazığ",[["Ağın",[[23960,23962]]],["Alacakaya",[[23410,23412]]],["Arıcak",[[23510,23527]]],["Baskil",[[23800,23802]]],["Elazığ",[[23050,23370]]],["Karakoçan",[[23600,23602]]],["Keban",[[23700,23702]]],["Kovancılar",[[23850,23852]]],["Maden",[[23400,23402]]],["Palu",[[23500,23502]]],["Sivrice",[[23900,23902]]]]],[24,"Erzincan",[["Çayırlı",[[24500,24503]]],["Erzincan",[[24002,24100]]],["İliç",[[24700,24710]]],["Kemah",[[24400,24402]]],["Kemaliye",[[24600,24620]]],["Otlukbeli",[[24510,24515]]],["Refahiye",[[24300,24302]]],["Tercan",[[24800,24802]]],["Üzümlü",[[24150,24160]]]]],[25,"Erzurum",[["Aşkale",[[25500,25500]]],["Aziziye",[[25700,25700]]],["Çat",[[25750,25750]]],["Hınıs",[[25600,25600]]],["Horasan",[[25800,25800]]],["İspir",[[25900,25900]]],["Karaçoban",[[25610,25610]]],["Karayazı",[[25830,25830]]],["Köprüköy",[[25320,25320]]],["Narman",[[25530,25530]]],["Oltu",[[25400,25400]]],["Olur",[[25650,25650]]],["Palandöken",[[25070,25080]]],["Pasinler",[[25300,25300]]],["Pazaryolu",[[25930,25930]]],["Şenkaya",[[25360,25360]]],["Tekman",[[25560,25560]]],["Tortum",[[25430,25430]]],["Uzundere",[[25440,25440]]],["Yakutiye",[[25050,25200]]]]],[26,"Eskişehir",[["Alpu",[[26850,26850]]],["Beylikova",[[26750,26750]]],["Çifteler",[[26700,26700]]],["Günyüzü",[[26630,26630]]],["Han",[[26710,26710]]],["İnönü",[[26670,26670]]],["Mahmudiye",[[26800,26800]]],["Mihalgazi",[[26880,26880]]],["Mihalıççık",[[26940,26940]]],["Odunpazarı",[[26004,26576]]],["Sarıcakaya",[[26870,26870]]],["Seyitgazi",[[26950,26950]]],["Sivrihisar",[[26600,26600]]],["Tepebaşı",[[26005,26563]]]]],[27,"Gaziantep",[["Araban",[[27650,27650]]],["İslahiye",[[27800,27800]]],["Karkamış",[[27880,27880]]],["Nizip",[[27700,27700]]],["Nurdağı",[[27840,27840]]],["Oğuzeli",[[27900,27900]]],["Şahinbey",[[27010,27470]]],["Şehitkamil",[[27080,27630]]],["Yavuzeli",[[27970,27970]]]]],[28,"Giresun",[["Alucra",[[28700,28702]]],["Bulancak",[[28300,28310]]],["Çamoluk",[[28710,28712]]],["Çanakçı",[[28810,28810]]],["Dereli",[[28952,28952]]],["Doğankent",[[28510,28512]]],["Espiye",[[28600,28602]]],["Eynesil",[[28850,28860]]],["Giresun",[[28100,28200]]],["Görele",[[28800,28820]]],["Güce",[[28520,28522]]],["Keşap",[[28900,28902]]],["Piraziz",[[28340,28342]]],["Şebinkarahisar",[[28400,28402]]],["Tirebolu",[[28500,28502]]],["Yağlıdere",[]]]],[29,"Gümüşhane",[["Gümüşhane",[[29010,29100]]],["Kelkit",[[29600,29620]]],["Köse",[[29650,29652]]],["Kürtün",[[29830,29832]]],["Şiran",[[29700,29750]]],["Torul",[[29800,29802]]]]],[30,"Hakkâri",[["Çukurca",[[30700,30720]]],["Derecik",[[30600,30650]]],["Hakkâri",[[30110,30110]]],["Şemdinli",[[30800,30802]]],["Yüksekova",[[30300,30400]]]]],[31,"Hatay",[["Altınözü",[[31750,31750]]],["Antakya",[[31030,31070]]],["Arsuz",[[31225,31290]]],["Belen",[[31350,31350]]],["Defne",[[31160,31160]]],["Dörtyol",[[31600,31600]]],["Erzin",[[31960,31960]]],["Hassa",[[31700,31700]]],["İskenderun",[[31200,31300]]],["Kırıkhan",[[31440,31440]]],["Kumlu",[[31520,31520]]],["Payas",[[31900,31900]]],["Reyhanlı",[[31500,31500]]],["Samandağ",[[31800,31800]]],["Yayladağı",[[31550,31550]]]]],[32,"Isparta",[["Aksu",[[32510,32512]]],["Atabey",[[32670,32672]]],["Eğirdir",[[32500,32502]]],["Gelendost",[[32900,32902]]],["Gönen",[[32090,32720]]],["Isparta",[[32005,32300]]],["Keçiborlu",[[32700,32702]]],["Senirkent",[[32600,32610]]],["Sütçüler",[[32950,32952]]],["Şarkikaraağaç",[[32800,32820]]],["Uluborlu",[[32650,32652]]],["Yalvaç",[[32400,32430]]],["Yenişarbademli",[[32850,32852]]]]],[33,"Mersin",[["Akdeniz",[[33010,33300]]],["Anamur",[[33630,33630]]],["Aydıncık",[[33840,33847]]],["Bozyazı",[[33707,33830]]],["Çamlıyayla",[[33580,33582]]],["Erdemli",[[33730,33730]]],["Gülnar",[[33700,33702]]],["Mezitli",[[33170,33210]]],["Mut",[[33600,33600]]],["Silifke",[[33900,33990]]],["Tarsus",[[33400,33800]]],["Toroslar",[[33090,33251]]],["Yenişehir",[[33110,33150]]]]],[34,"İstanbul",[["Adalar",[[34970,34977]]],["Arnavutköy",[[34275,34285]]],["Ataşehir",[[34630,34644]]],["Avcılar",[[34310,34325]]],["Bağcılar",[[34200,34218]]],["Bahçelievler",[[34180,34197]]],["Bakırköy",[[34140,34158]]],["Başakşehir",[[34480,34494]]],["Bayrampaşa",[[34030,34045]]],["Beşiktaş",[[34330,34357]]],["Beykoz",[[34800,34829]]],["Beylikdüzü",[[34520,34528]]],["Beyoğlu",[[34421,34445]]],["Büyükçekmece",[[34530,34537]]],["Çatalca",[[34540,34540]]],["Çekmeköy",[[34782,34799]]],["Esenler",[[34220,34230]]],["Esenyurt",[[34502,34519]]],["Eyüpsultan",[[34050,34077]]],["Fatih",[[34083,34134]]],["Gaziosmanpaşa",[[34240,34255]]],["Güngören",[[34160,34173]]],["Kadıköy",[[34710,34742]]],["Kâğıthane",[[34400,34418]]],["Kartal",[[34860,34882]]],["Küçükçekmece",[[34295,34307]]],["Maltepe",[[34840,34858]]],["Pendik",[[34890,34916]]],["Sancaktepe",[[34650,34656]]],["Sarıyer",[[34450,34475]]],["Silivri",[[34570,34596]]],["Sultanbeyli",[[34920,34935]]],["Sultangazi",[[34260,34270]]],["Şile",[[34980,34990]]],["Şişli",[[34363,34384]]],["Tuzla",[[34940,34959]]],["Ümraniye",[[34760,34775]]],["Üsküdar",[[34660,34700]]],["Zeytinburnu",[[34015,34025]]]]],[35,"İzmir",[["Aliağa",[[35800,35800]]],["Balçova",[[35330,35330]]],["Bayındır",[[35840,35845]]],["Bayraklı",[[35510,35540]]],["Bergama",[[35700,35700]]],["Beydağ",[[35790,35790]]],["Bornova",[[35030,35090]]],["Buca",[[35370,35400]]],["Çeşme",[[35930,35937]]],["Çiğli",[[35610,35650]]],["Dikili",[[35980,35980]]],["Foça",[[35680,35687]]],["Gaziemir",[[35410,35410]]],["Güzelbahçe",[[35310,35310]]],["Karabağlar",[[35110,35160]]],["Karaburun",[[35960,35960]]],["Karşıyaka",[[35550,35600]]],["Kemalpaşa",[[35730,35730]]],["Kınık",[[35990,35990]]],["Kiraz",[[35890,35890]]],["Konak",[[35180,35280]]],["Menderes",[]],["Menemen",[[35660,35660]]],["Narlıdere",[[35320,35320]]],["Ödemiş",[[35750,35750]]],["Seferihisar",[[35460,35485]]],["Selçuk",[[35920,35920]]],["Tire",[[35900,35900]]],["Torbalı",[[35860,35885]]],["Urla",[[35430,35450]]]]],[36,"Kars",[["Akyaka",[[36780,36782]]],["Arpaçay",[]],["Digor",[[36670,36680]]],["Kağızman",[[36700,36702]]],["Kars",[[36002,36100]]],["Sarıkamış",[[36500,36502]]],["Selim",[[36900,36902]]],["Susuz",[[36760,36762]]]]],[37,"Kastamonu",[["Abana",[[37970,37972]]],["Ağlı",[[37920,37920]]],["Araç",[[37800,37802]]],["Azdavay",[[37750,37752]]],["Bozkurt",[[37680,37682]]],["Cide",[[37600,37602]]],["Çatalzeytin",[[37940,37942]]],["Daday",[[37870,37872]]],["Devrekani",[[37700,37702]]],["Doğanyurt",[[37550,37552]]],["Hanönü",[[37450,37542]]],["İhsangazi",[[37250,37252]]],["İnebolu",[[37500,37502]]],["Kastamonu",[[37100,37210]]],["Küre",[[37900,37902]]],["Pınarbaşı",[[37770,37772]]],["Seydiler",[[37270,37272]]],["Şenpazar",[[37650,37652]]],["Taşköprü",[[37400,37402]]],["Tosya",[[37300,37302]]]]],[38,"Kayseri",[["Akkışla",[[38830,38830]]],["Bünyan",[[38600,38600]]],["Develi",[[38400,38400]]],["Felahiye",[[38750,38750]]],["Hacılar",[[38310,38315]]],["İncesu",[[38560,38560]]],["Kocasinan",[[38030,38095]]],["Melikgazi",[[38120,38195]]],["Özvatan",[[38770,38770]]],["Pınarbaşı",[[38700,38700]]],["Sarıoğlan",[[38820,38820]]],["Sarız",[[38660,38660]]],["Talas",[[38280,38300]]],["Tomarza",[[38900,38900]]],["Yahyalı",[[38500,38500]]],["Yeşilhisar",[[38800,38800]]]]],[39,"Kırklareli",[["Babaeski",[[39200,39202]]],["Demirköy",[[39500,39650]]],["Kırklareli",[[39002,39572]]],["Kofçaz",[[39700,39702]]],["Lüleburgaz",[[39750,39752]]],["Pehlivanköy",[[39600,39640]]],["Pınarhisar",[[39300,39310]]],["Vize",[[39400,39652]]]]],[40,"Kırşehir",[["Akçakent",[[40720,40723]]],["Akpınar",[[40320,40322]]],["Boztepe",[[40020,40060]]],["Çiçekdağı",[[40700,40702]]],["Kaman",[[40300,40302]]],["Kırşehir",[[40002,40100]]],["Mucur",[[40500,40502]]]]],[41,"Kocaeli",[["Başiskele",[[41030,41275]]],["Çayırova",[[41420,41420]]],["Darıca",[[41700,41700]]],["Derince",[[41900,41900]]],["Dilovası",[[41455,41455]]],["Gebze",[[41400,41400]]],["Gölcük",[[41650,41950]]],["İzmit",[[41001,41310]]],["Kandıra",[[41600,41600]]],["Karamürsel",[[41500,41500]]],["Kartepe",[[41080,41285]]],["Körfez",[[41780,41800]]]]],[42,"Konya",[["Ahırlı",[[42390,42395]]],["Akören",[[42460,42460]]],["Akşehir",[[42550,42570]]],["Altınekin",[[42450,42450]]],["Beyşehir",[[42700,42705]]],["Bozkır",[[42630,42630]]],["Cihanbeyli",[[42855,42855]]],["Çeltik",[[42920,42920]]],["Çumra",[[42505,42505]]],["Derbent",[[42900,42900]]],["Derebucak",[[42480,42480]]],["Doğanhisar",[[42930,42950]]],["Emirgazi",[[42910,42910]]],["Ereğli",[[42310,42340]]],["Güneysınır",[[42490,42490]]],["Hadim",[[42830,42830]]],["Halkapınar",[[42980,42980]]],["Hüyük",[[42690,42698]]],["Ilgın",[[42600,42620]]],["Kadınhanı",[[42800,42800]]],["Karapınar",[[42400,42400]]],["Karatay",[[42020,42290]]],["Kulu",[[42775,42780]]],["Meram",[[42010,42270]]],["Sarayönü",[[42430,42440]]],["Selçuklu",[[42060,42280]]],["Seydişehir",[[42360,42380]]],["Taşkent",[[42960,42960]]],["Tuzlukçu",[[42970,42970]]],["Yalıhüyük",[[42470,42470]]],["Yunak",[[42530,42530]]]]],[43,"Kütahya",[["Altıntaş",[[43800,43802]]],["Aslanapa",[[43210,43212]]],["Çavdarhisar",[[43710,43712]]],["Domaniç",[[43850,43852]]],["Dumlupınar",[[43820,43822]]],["Emet",[[43700,43702]]],["Gediz",[[43600,43602]]],["Hisarcık",[[43780,43782]]],["Kütahya",[[43020,43290]]],["Pazarlar",[[43530,43532]]],["Simav",[[43500,43520]]],["Şaphane",[[43950,43952]]],["Tavşanlı",[[43300,43900]]]]],[44,"Malatya",[["Akçadağ",[[44600,44600]]],["Arapgir",[[44800,44800]]],["Arguvan",[[44960,44960]]],["Battalgazi",[[44050,44320]]],["Darende",[[44700,44700]]],["Doğanşehir",[[44500,44500]]],["Doğanyol",[[44880,44880]]],["Hekimhan",[[44400,44400]]],["Kale",[[44370,44370]]],["Kuluncak",[[44760,44760]]],["Pütürge",[[44850,44850]]],["Yazıhan",[[44350,44350]]],["Yeşilyurt",[[44080,44900]]]]],[45,"Manisa",[["Ahmetli",[[45450,45450]]],["Akhisar",[[45200,45200]]],["Alaşehir",[[45600,45600]]],["Demirci",[[45900,45900]]],["Gölmarmara",[[45580,45580]]],["Gördes",[[45750,45750]]],["Kırkağaç",[[45700,45730]]],["Köprübaşı",[[45930,45930]]],["Kula",[[45170,45170]]],["Salihli",[[45300,45340]]],["Sarıgöl",[[45470,45470]]],["Saruhanlı",[[45800,45880]]],["Selendi",[[45970,45970]]],["Soma",[[45500,45540]]],["Şehzadeler",[[45010,45050]]],["Turgutlu",[[45400,45400]]],["Yunusemre",[[45030,45125]]]]],[46,"Kahramanmaraş",[["Afşin",[[46500,46500]]],["Andırın",[[46400,46430]]],["Çağlayancerit",[[46720,46720]]],["Dulkadiroğlu",[[46030,46130]]],["Ekinözü",[[46360,46360]]],["Elbistan",[[46300,46300]]],["Göksun",[[46600,46600]]],["Nurhak",[[46370,46370]]],["Onikişubat",[[46040,46140]]],["Pazarcık",[[46700,46700]]],["Türkoğlu",[[46800,46800]]]]],[47,"Mardin",[["Artuklu",[[47060,47420]]],["Dargeçit",[[47750,47750]]],["Derik",[[47800,47800]]],["Kızıltepe",[[47400,47400]]],["Mazıdağı",[[47700,47700]]],["Midyat",[[47500,47500]]],["Nusaybin",[[47300,47300]]],["Ömerli",[[47570,47570]]],["Savur",[[47860,47860]]],["Yeşilli",[[47650,47650]]]]],[48,"Muğla",[["Bodrum",[[48400,48400]]],["Dalaman",[[48770,48770]]],["Datça",[[48900,48900]]],["Fethiye",[[48300,48300]]],["Kavaklıdere",[[48570,48570]]],["Köyceğiz",[[48800,48800]]],["Marmaris",[[48700,48700]]],["Menteşe",[[48050,48050]]],["Milas",[[48200,48200]]],["Ortaca",[[48600,48600]]],["Seydikemer",[[48850,48850]]],["Ula",[[48640,48640]]],["Yatağan",[[48500,48500]]]]],[49,"Muş",[["Bulanık",[[49500,49550]]],["Hasköy",[[49700,49702]]],["Korkut",[[49800,49802]]],["Malazgirt",[[49400,49540]]],["Muş",[[49001,49300]]],["Varto",[[49600,49610]]]]],[50,"Nevşehir",[["Acıgöl",[[50140,50142]]],["Avanos",[[50500,50860]]],["Derinkuyu",[[50700,50706]]],["Gülşehir",[[50900,50902]]],["Hacıbektaş",[[50800,50802]]],["Kozaklı",[[50600,50602]]],["Nevşehir",[[50100,50240]]],["Ürgüp",[[50400,50402]]]]],[51,"Niğde",[["Altunhisar",[[51600,51602]]],["Bor",[[51700,51730]]],["Çamardı",[[51660,51662]]],["Çiftlik",[[51800,51816]]],["Niğde",[[51010,51300]]],["Ulukışla",[[51900,51902]]]]],[52,"Ordu",[["Akkuş",[[52950,52950]]],["Altınordu",[[52210,52210]]],["Aybastı",[[52500,52500]]],["Çamaş",[[52430,52430]]],["Çatalpınar",[[52420,52420]]],["Çaybaşı",[[52310,52310]]],["Fatsa",[[52400,52400]]],["Gölköy",[[52600,52600]]],["Gülyalı",[[52010,52010]]],["Gürgentepe",[[52610,52610]]],["İkizce",[[52320,52320]]],["Kabadüz",[[52020,52020]]],["Kabataş",[[52520,52520]]],["Korgan",[[52700,52700]]],["Kumru",[[52800,52800]]],["Mesudiye",[[52900,52900]]],["Perşembe",[[52750,52750]]],["Ulubey",[[52850,52850]]],["Ünye",[[52300,52300]]]]],[53,"Rize",[["Ardeşen",[[53400,53490]]],["Çamlıhemşin",[[53750,53780]]],["Çayeli",[[53210,53260]]],["Derepazarı",[[53900,53940]]],["Fındıklı",[[53700,53740]]],["Güneysu",[[53350,53390]]],["Hemşin",[[53550,53550]]],["İkizdere",[[53650,53690]]],["İyidere",[[53600,53610]]],["Kalkandere",[[53500,53540]]],["Pazar",[[53300,53340]]],["Rize",[[53020,53950]]]]],[54,"Sakarya",[["Adapazarı",[[54100,54100]]],["Akyazı",[[54400,54400]]],["Arifiye",[[54580,54580]]],["Erenler",[[54200,54200]]],["Ferizli",[[54110,54110]]],["Geyve",[[54700,54700]]],["Hendek",[[54300,54300]]],["Karapürçek",[[54430,54430]]],["Karasu",[[54500,54500]]],["Kaynarca",[[54650,54650]]],["Kocaali",[[54800,54800]]],["Pamukova",[[54900,54900]]],["Sapanca",[[54600,54600]]],["Serdivan",[[54050,54130]]],["Söğütlü",[[54160,54160]]],["Taraklı",[[54750,54750]]]]],[55,"Samsun",[["19 Mayıs",[[55420,55420]]],["Alaçam",[[55800,55800]]],["Asarcık",[[55860,55860]]],["Atakum",[[55200,55270]]],["Ayvacık",[[55550,55550]]],["Bafra",[[55400,55400]]],["Canik",[[55080,55080]]],["Çarşamba",[[55500,55500]]],["Havza",[[55700,55700]]],["İlkadım",[[55020,55100]]],["Kavak",[[55850,55850]]],["Ladik",[[55760,55760]]],["Salıpazarı",[[55530,55530]]],["Tekkeköy",[[55300,55330]]],["Terme",[[55600,55600]]],["Vezirköprü",[[55900,55900]]],["Yakakent",[[55810,55810]]]]],[56,"Siirt",[["Baykan",[[56460,56470]]],["Eruh",[[56540,56802]]],["Kurtalan",[[56500,56502]]],["Pervari",[[56700,56702]]],["Siirt",[[56100,56220]]],["Şirvan",[[56760,56763]]],["Tillo",[[56870,56872]]]]],[57,"Sinop",[["Ayancık",[[57400,57402]]],["Boyabat",[[57200,57202]]],["Dikmen",[[57660,57662]]],["Durağan",[[57700,57702]]],["Erfelek",[[57800,57802]]],["Gerze",[[57600,57602]]],["Saraydüzü",[[57300,57302]]],["Sinop",[[57002,57010]]],["Türkeli",[[57900,57902]]]]],[58,"Sivas",[["Akıncılar",[[58550,58552]]],["Altınyayla",[[58470,58475]]],["Divriği",[[58300,58302]]],["Doğanşar",[[58780,58782]]],["Gemerek",[[58801,58880]]],["Gölova",[[58640,58642]]],["Gürün",[[58800,58802]]],["Hafik",[[58760,58762]]],["İmranlı",[[58980,58982]]],["Kangal",[[58900,58902]]],["Koyulhisar",[[58660,58662]]],["Sivas",[[58010,58060]]],["Suşehri",[[58600,58602]]],["Şarkışla",[[58400,58430]]],["Ulaş",[[58380,58382]]],["Yıldızeli",[[58500,58502]]],["Zara",[[58700,58702]]]]],[59,"Tekirdağ",[["Çerkezköy",[[59500,59500]]],["Çorlu",[[59850,59850]]],["Ergene",[[59930,59930]]],["Hayrabolu",[[59400,59400]]],["Kapaklı",[[59510,59510]]],["Malkara",[[59300,59300]]],["Marmaraereğlisi",[[59740,59740]]],["Muratlı",[[59700,59700]]],["Saray",[[59600,59600]]],["Süleymanpaşa",[[59030,59200]]],["Şarköy",[[59800,59800]]]]],[60,"Tokat",[["Almus",[[60900,60950]]],["Artova",[[60670,60672]]],["Başçiftlik",[[60620,60625]]],["Erbaa",[[60500,60540]]],["Niksar",[[60600,60645]]],["Pazar",[[60800,60820]]],["Reşadiye",[[60700,60740]]],["Sulusaray",[[60870,60872]]],["Tokat",[[60010,60255]]],["Turhal",[[60300,60302]]],["Yeşilyurt",[[60860,60862]]],["Zile",[[60400,60402]]]]],[61,"Trabzon",[["Akçaabat",[[61300,61300]]],["Araklı",[[61700,61700]]],["Arsin",[[61900,61900]]],["Beşikdüzü",[[61800,61800]]],["Çarşıbaşı",[[61420,61420]]],["Çaykara",[[61940,61940]]],["Dernekpazarı",[[61950,61950]]],["Düzköy",[[61390,61390]]],["Hayrat",[[61450,61450]]],["Köprübaşı",[[61630,61630]]],["Maçka",[[61750,61750]]],["Of",[[61830,61830]]],["Ortahisar",[[61030,61080]]],["Sürmene",[[61600,61600]]],["Şalpazarı",[[61670,61670]]],["Tonya",[[61500,61500]]],["Vakfıkebir",[[61400,61400]]],["Yomra",[[61250,61250]]]]],[62,"Tunceli",[["Çemişgezek",[[62600,62602]]],["Hozat",[[62400,62402]]],["Mazgirt",[[62800,62802]]],["Nazımiye",[[62950,62952]]],["Ovacık",[[62900,62901]]],["Pertek",[[62500,62502]]],["Pülümür",[[62700,62702]]],["Tunceli",[[62002,62100]]]]],[63,"Şanlıurfa",[["Akçakale",[[63500,63500]]],["Birecik",[[63400,63400]]],["Bozova",[[63850,63853]]],["Ceylanpınar",[[63570,63570]]],["Eyyübiye",[[63200,63210]]],["Halfeti",[[63950,63950]]],["Haliliye",[[63040,63300]]],["Harran",[[63510,63510]]],["Hilvan",[[63900,63900]]],["Karaköprü",[[63320,63320]]],["Siverek",[[63600,63600]]],["Suruç",[[63800,63800]]],["Viranşehir",[[63700,63700]]]]],[64,"Uşak",[["Banaz",[[64500,64502]]],["Eşme",[[64600,64602]]],["Karahallı",[[64700,64702]]],["Sivaslı",[[64800,64802]]],["Ulubey",[[64900,64902]]],["Uşak",[[64050,64200]]]]],[65,"Van",[["Bahçesaray",[[65710,65710]]],["Başkale",[[65600,65600]]],["Çaldıran",[[65970,65970]]],["Çatak",[[65870,65870]]],["Edremit",[[65170,65300]]],["Erciş",[[65400,65400]]],["Gevaş",[[65700,65700]]],["Gürpınar",[[65900,65900]]],["İpekyolu",[[65100,65210]]],["Muradiye",[[65500,65500]]],["Özalp",[[65800,65800]]],["Saray",[[65830,65830]]],["Tuşba",[[65040,65040]]]]],[66,"Yozgat",[["Akdağmadeni",[[66300,66315]]],["Aydıncık",[[66510,66512]]],["Boğazlıyan",[[66400,66425]]],["Çandır",[[66620,66622]]],["Çayıralan",[[66600,66605]]],["Çekerek",[[66500,66502]]],["Kadışehri",[[66540,66545]]],["Saraykent",[[66320,66325]]],["Sarıkaya",[[66650,66655]]],["Sorgun",[[66700,66790]]],["Şefaatli",[[66800,66802]]],["Yenifakılı",[[66470,66472]]],["Yerköy",[[66900,66902]]],["Yozgat",[[66010,66100]]]]],[67,"Zonguldak",[["Alaplı",[[67850,67856]]],["Çaycuma",[[67900,67970]]],["Devrek",[[67800,67840]]],["Gökçebey",[[67670,67672]]],["Ereğli",[[67300,67390]]],["Kilimli",[[67150,67510]]],["Kozlu",[[67600,67602]]],["Zonguldak",[[67002,67980]]]]],[68,"Aksaray",[["Ağaçören",[[68600,68602]]],["Aksaray",[[68010,68270]]],["Eskil",[[68800,68802]]],["Gülağaç",[[68900,68950]]],["Güzelyurt",[[68470,68570]]],["Ortaköy",[[68400,68601]]],["Sarıyahşi",[[68700,68702]]],["Sultanhanı",[[68190,68190]]]]],[69,"Bayburt",[["Aydıntepe",[[69500,69502]]],["Bayburt",[[69002,69350]]],["Demirözü",[[69400,69450]]]]],[70,"Karaman",[["Ayrancı",[[70500,70502]]],["Başyayla",[[70700,70702]]],["Ermenek",[[70400,70460]]],["Karaman",[[70100,70202]]],["Kazımkarabekir",[[70600,70602]]],["Sarıveliler",[[70800,70810]]]]],[71,"Kırıkkale",[["Bahşılı",[[71460,71462]]],["Balışeyh",[[71520,71522]]],["Çelebi",[[71810,71812]]],["Delice",[[71670,71702]]],["Karakeçili",[[71500,71502]]],["Keskin",[[71800,71860]]],["Kırıkkale",[[71010,71480]]],["Sulakyurt",[[71900,71902]]],["Yahşihan",[[71450,71452]]]]],[72,"Batman",[["Batman",[[72050,72100]]],["Beşiri",[[72200,72202]]],["Gercüş",[[72300,72310]]],["Hasankeyf",[[72350,72352]]],["Kozluk",[[72400,72402]]],["Sason",[[72500,72502]]]]],[73,"Şırnak",[["Beytüşşebap",[[73800,73802]]],["Cizre",[[73200,73202]]],["Güçlükonak",[[73700,73710]]],["İdil",[[73300,73302]]],["Silopi",[[73400,73440]]],["Şırnak",[[73002,73100]]],["Uludere",[[73600,73602]]]]],[74,"Bartın",[["Amasra",[[74300,74310]]],["Bartın",[[74100,74400]]],["Kurucaşile",[[74500,74510]]],["Ulus",[[74410,74602]]]]],[75,"Ardahan",[["Ardahan",[[75002,75210]]],["Çıldır",[[75400,75402]]],["Damal",[[75600,75602]]],["Göle",[[75700,75702]]],["Hanak",[[75900,75902]]],["Posof",[[75802,75802]]]]],[76,"Iğdır",[["Aralık",[[76500,76502]]],["Iğdır",[[76002,76420]]],["Karakoyunlu",[[76700,76702]]],["Tuzluca",[[76900,76902]]]]],[77,"Yalova",[["Altınova",[[77700,77740]]],["Armutlu",[[77500,77502]]],["Çınarcık",[[77300,77340]]],["Çiftlikköy",[[77600,77602]]],["Termal",[[77400,77402]]],["Yalova",[[77200,77210]]]]],[78,"Karabük",[["Eflani",[[78300,78302]]],["Eskipazar",[[78400,78402]]],["Karabük",[[78010,78200]]],["Ovacık",[[78500,78502]]],["Safranbolu",[[78600,78602]]],["Yenice",[[78700,78702]]]]],[79,"Kilis",[["Elbeyli",[[79500,79502]]],["Kilis",[[79020,79090]]],["Musabeyli",[[79600,79602]]],["Polateli",[[79700,79702]]]]],[80,"Osmaniye",[["Bahçe",[[80500,80502]]],["Düziçi",[[80600,80740]]],["Hasanbeyli",[[80850,80852]]],["Kadirli",[[80750,80752]]],["Osmaniye",[[80010,80440]]],["Sumbas",[[80900,80940]]],["Toprakkale",[[80950,80952]]]]],[81,"Düzce",[["Akçakoca",[[81650,81652]]],["Cumayeri",[[81700,81702]]],["Çilimli",[[81750,81752]]],["Düzce",[[81010,81630]]],["Gölyaka",[[81800,81802]]],["Gümüşova",[[81850,81852]]],["Kaynaşlı",[[81900,81902]]],["Yığılca",[[81950,81952]]]]]]}
|
tr_adres/formatter.py
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""Canonical one-line rendering of an :class:`Adres`."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import List, Optional, Union
|
|
6
|
+
|
|
7
|
+
from .metin import tr_upper
|
|
8
|
+
from .model import Adres
|
|
9
|
+
|
|
10
|
+
__all__ = ["STILLER", "format_adres", "normalize"]
|
|
11
|
+
|
|
12
|
+
STILLER = ("kargo", "resmi")
|
|
13
|
+
|
|
14
|
+
_CAD_KISA = {"Cadde": "Cad.", "Bulvar": "Bulv.", "Yol": "Yolu", "Meydan": "Meydanı"}
|
|
15
|
+
_CAD_UZUN = {"Cadde": "Caddesi", "Bulvar": "Bulvarı", "Yol": "Yolu", "Meydan": "Meydanı"}
|
|
16
|
+
_SOK_KISA = {"Sokak": "Sk.", "Çıkmaz": "Çıkmazı"}
|
|
17
|
+
_SOK_UZUN = {"Sokak": "Sokak", "Çıkmaz": "Çıkmazı"}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _konum(a: Adres, resmi: bool) -> Optional[str]:
|
|
21
|
+
il = tr_upper(a.il) if (resmi and a.il) else a.il
|
|
22
|
+
if a.ilce and il:
|
|
23
|
+
yer = f"{a.ilce}/{il}"
|
|
24
|
+
else:
|
|
25
|
+
yer = a.ilce or il or ""
|
|
26
|
+
if a.posta_kodu:
|
|
27
|
+
yer = f"{a.posta_kodu} {yer}".strip()
|
|
28
|
+
return yer or None
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def format_adres(
|
|
32
|
+
adres: Union[Adres, str], style: str = "kargo", include_remainder: bool = True
|
|
33
|
+
) -> str:
|
|
34
|
+
"""Render an address on one line.
|
|
35
|
+
|
|
36
|
+
``style="kargo"`` (default) is the compact form used on shipping labels::
|
|
37
|
+
|
|
38
|
+
Caferağa Mah. Moda Cad. No:12 K:3 D:5 34710 Kadıköy/İstanbul
|
|
39
|
+
|
|
40
|
+
``style="resmi"`` spells every type word out, separates components with commas and
|
|
41
|
+
writes the province in capitals, as in official correspondence::
|
|
42
|
+
|
|
43
|
+
Caferağa Mahallesi, Moda Caddesi, No: 12, Kat: 3, İç Kapı No: 5, 34710 Kadıköy/İSTANBUL
|
|
44
|
+
|
|
45
|
+
Unparsed text (``adres.kalan``) is kept just before the location unless
|
|
46
|
+
``include_remainder=False``. A string argument is parsed first.
|
|
47
|
+
"""
|
|
48
|
+
if style not in STILLER:
|
|
49
|
+
raise ValueError(f"style must be one of {STILLER}, not {style!r}")
|
|
50
|
+
if isinstance(adres, str):
|
|
51
|
+
from .parser import parse
|
|
52
|
+
|
|
53
|
+
adres = parse(adres)
|
|
54
|
+
a = adres
|
|
55
|
+
resmi = style == "resmi"
|
|
56
|
+
parts: List[str] = []
|
|
57
|
+
if a.mahalle:
|
|
58
|
+
parts.append(f"{a.mahalle} {'Mahallesi' if resmi else 'Mah.'}")
|
|
59
|
+
if a.koy:
|
|
60
|
+
parts.append(f"{a.koy} Köyü")
|
|
61
|
+
if a.cadde:
|
|
62
|
+
tip = a.cadde_tipi or "Cadde"
|
|
63
|
+
parts.append(f"{a.cadde} {(_CAD_UZUN if resmi else _CAD_KISA).get(tip, tip)}")
|
|
64
|
+
if a.sokak:
|
|
65
|
+
tip = a.sokak_tipi or "Sokak"
|
|
66
|
+
parts.append(f"{a.sokak} {(_SOK_UZUN if resmi else _SOK_KISA).get(tip, tip)}")
|
|
67
|
+
if a.site:
|
|
68
|
+
parts.append(a.site)
|
|
69
|
+
if a.apartman:
|
|
70
|
+
apt = a.apartman
|
|
71
|
+
if not resmi and apt.endswith(" Apartmanı"):
|
|
72
|
+
apt = apt[: -len(" Apartmanı")] + " Apt."
|
|
73
|
+
parts.append(apt)
|
|
74
|
+
if a.blok:
|
|
75
|
+
parts.append(f"{a.blok} Blok")
|
|
76
|
+
if a.bina_no:
|
|
77
|
+
parts.append(f"No: {a.bina_no}" if resmi else f"No:{a.bina_no}")
|
|
78
|
+
if a.kat:
|
|
79
|
+
parts.append(f"Kat: {a.kat}" if resmi else f"K:{a.kat}")
|
|
80
|
+
if a.daire_no:
|
|
81
|
+
parts.append(f"İç Kapı No: {a.daire_no}" if resmi else f"D:{a.daire_no}")
|
|
82
|
+
if include_remainder and a.kalan:
|
|
83
|
+
parts.append(a.kalan)
|
|
84
|
+
yer = _konum(a, resmi)
|
|
85
|
+
if yer:
|
|
86
|
+
parts.append(yer)
|
|
87
|
+
return (", " if resmi else " ").join(parts)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def normalize(text: str, style: str = "kargo") -> str:
|
|
91
|
+
"""Parse ``text`` and return its canonical one-line form.
|
|
92
|
+
|
|
93
|
+
>>> normalize("caferaga mh. moda cd. no:12/3 kadikoy istanbul")
|
|
94
|
+
'Caferağa Mah. Moda Cad. No:12 D:3 Kadıköy/İstanbul'
|
|
95
|
+
"""
|
|
96
|
+
return format_adres(text, style)
|