انتخاب محل از استان تا آبادی، بر اساس دادههای مرکز آمار ایران
{}
دادهها در سه قالب آمادهاند و به هیچ ابزار خاصی نیاز ندارند. آخرین سال همیشه در ریشه مخزن است؛ داده هر سال جدا هم زیر data/<سال>/ نگهداری میشود.
| فایل | توضیح |
|---|---|
data/1404/iran.csv | سادهترین قالب، پنج ستون |
data/1404/iran.json | آرایهای از آبجکتها |
data/1404/iran.sql | MySQL · MariaDB · PostgreSQL · SQLite |
data/1404/iran.sqlserver.sql | Microsoft SQL Server |
data/1404/metadata.json | تعداد هر نوع و اطلاعات منبع |
سالهای ۱۳۹۷ و ۱۳۹۸ هم با همین ساختار در data/1397/ و data/1398/ موجودند.
هر ردیف پنج ستون دارد:
| ستون | توضیح |
|---|---|
Id | شناسه ردیف. بین سالها ثابت نیست؛ برای اتصال بین سالها از Code یا جدول نگاشت استفاده کنید. |
ParentCountryDivisionId | شناسه والد. فقط برای ردیف کشور خالی است. |
Name | نام محل، با کاراکترهای استاندارد فارسی |
Code | کد مرکز آمار |
DivisionType | نوع محل |
| مقدار | نوع | والد | تعداد در ۱۴۰۴ |
|---|---|---|---|
0 | کشور | — | ۱ |
1 | استان | کشور | ۳۱ |
2 | شهرستان | استان | ۴۸۴ |
3 | بخش | شهرستان | ۱۱۹۳ |
4 | دهستان | بخش | ۲۷۷۷ |
5 | شهر | بخش | ۱۴۸۱ |
6 | آبادی | دهستان | ۹۹۳۱۷ |
7 | منطقه شهری | شهر | ۱۹۱ |
ParentCountryDivisionId بگیرید و شرطهایی مثل WHERE DivisionType < 5 را بازبینی کنید.
00 تا 30010100011001–1699 و 2000–2999کد شهر و منطقه شهری و کد آبادی در کل کشور یکتا هستند. به همین دلیل میشود یک شهر یا آبادی را بین سالها فقط با کدش دنبال کرد، حتی اگر شهرستان یا بخشش عوض شده باشد. کد بخش و دهستان یکتا نیست و برای آنها به مسیر کامل نیاز دارید.
در فایل مرکز آمار، فیلد coderec = 5 رسماً «شهرها و مناطق شهری» است و هر دو کد چهار رقمی یکتا میگیرند. نتیجهاش این بود که «اراک» شش بار در یک بخش تکرار میشد:
| کد | نام | نسخه ۲ | نسخه ۳ |
|---|---|---|---|
1101 | اراک | شهر | شهر |
1678 | اراک ۱ | شهر | منطقه شهری، زیر اراک |
1679 | اراک ۲ | شهر | منطقه شهری، زیر اراک |
1680 | اراک ۳ | شهر | منطقه شهری، زیر اراک |
2858 | اراک ۴ | شهر | منطقه شهری، زیر اراک |
2859 | اراک ۵ | شهر | منطقه شهری، زیر اراک |
در نسخه ۳، ۱۹۱ ردیف در ۳۹ شهر (تهران با ۲۲ منطقه، اصفهان ۱۵، مشهد ۱۲ و …) به DivisionType = 7 تبدیل شدند و والدشان شهر پایه در همان بخش شد. هیچ ردیفی حذف نشده است.
نتیجه: WHERE DivisionType = 5 فهرست تمیز شهرها را میدهد و اگر مناطق را هم بخواهید در DivisionType = 7 هستند.
فایل مرکز آمار حروف عربی و اعراب و کاراکترهای نامتعارف دارد. در تولید داده اینها اصلاح میشوند:
| از | به | نمونه |
|---|---|---|
ي ى | ی | مرکزي ← مرکزی |
ك | ک | كرمانشاه ← کرمانشاه |
أ إ ة ۀ | ا ا ه ه | |
| اعراب و کشیده | حذف | تهــران ← تهران |
| ارقام فارسی و عربی | ارقام لاتین | |
| نیمفاصله بیاثر | حذف | احمدآباد ← احمدآباد |
نیمفاصله بعد از حرفی که به حرف بعد نمیچسبد (ا د ذ ر ز ژ و و …) هیچ اثر بصری ندارد و فقط مقایسه رشتهها را خراب میکند؛ این موارد حذف میشوند. نیمفاصلههای معنادار مثل «اسلامشهر» دستنخورده میمانند.
نگارش خود مرکز آمار در برخی نامها ناهماهنگ است («بندرعباس» و «بندر عباس» هر دو در فایل هستند). این موارد تغییر داده نشدهاند، چون یکسانسازیشان حدس است نه اصلاح.
# MySQL / MariaDB
mysql -u root -p mydb < data/1404/iran.sql
# PostgreSQL
psql -d mydb -f data/1404/iran.sql
# SQLite
sqlite3 iran.db < data/1404/iran.sql
# SQL Server
sqlcmd -S localhost -d mydb -f 65001 -i data/1404/iran.sqlserver.sql
utf8mb4 بسازید وگرنه حروف فارسی درست ذخیره نمیشوند:CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_persian_ci;
SELECT city.Name, county.Name AS County
FROM CountryDivisions city
JOIN CountryDivisions district ON district.Id = city.ParentCountryDivisionId
JOIN CountryDivisions county ON county.Id = district.ParentCountryDivisionId
JOIN CountryDivisions province ON province.Id = county.ParentCountryDivisionId
WHERE province.Name = 'تهران' AND city.DivisionType = 5
ORDER BY county.Name, city.Name;
فایل پورتابل روی PostgreSQL و SQLite واقعاً اجرا و تست شده است. برای MySQL و MariaDB فقط از دستورات استاندارد پشتیبانیشده استفاده شده.
شناسهها بین سالها ثابت نیستند، پس نمیشود جدول را ساده جایگزین کرد. پوشه migrations/1398-to-1404/ جدول نگاشت CountryDivisionIdMap را میسازد تا کلیدهای خارجی خودتان را بهروز کنید.
# ۱) پشتیبان بگیرید
# ۲) جدول قدیمی حفظ و جدول نگاشت ساخته میشود
psql -d mydb -f migrations/1398-to-1404/upgrade.sql
# ۳) داده سال ۱۴۰۴ بارگذاری میشود
psql -d mydb -f data/1404/iran.sql
# ۴) بخش ۴ فایل upgrade.sql را روی جدولهای خودتان اجرا کنید
جدول CountryDivisions_1398 دستنخورده باقی میماند تا هر وقت خواستید مقایسه کنید. ستون MatchType میگوید نگاشت چقدر قابل اعتماد است:
| MatchType | تعداد | معنی |
|---|---|---|
path | ۹۴۴۲۱ | مسیر کدها دستنخورده مانده؛ محل جابهجا نشده. |
code | ۸۴۷۷ | مسیر عوض شده ولی کد یکتای ملی همان است — محل زیر شهرستان یا بخش تازهتشکیلشدهای رفته. چون کد شهر و آبادی در کل کشور یکتاست، این تطبیق هم قطعی است. |
| خالی | ۹۷۲ | معادلی در ۱۴۰۴ ندارد؛ حذف یا ادغام شده. NewId تهی است و تصمیمش با شماست. |
۹۷۲ ردیف بیمعادل شامل ۷۷۷ آبادی، ۱۵۶ دهستان، ۳۷ بخش و ۲ شهر است. برای بخش و دهستان کد یکتای ملی وجود ندارد، پس وقتی هم مسیر و هم نام عوض شده باشد تطبیق خودکار ممکن نیست.
npm install @hameds/iran-country-divisions
import { load, DivisionType } from "@hameds/iran-country-divisions";
const ir = load(); // جدیدترین سال موجود
const tehran = ir.search("تهران", { type: DivisionType.Province })[0];
ir.children(tehran.id); // شهرستانهای تهران
ir.cities(); // همه شهرها، بدون مناطق شهری
ir.urbanZones(cityId); // مناطق یک شهر
ir.villages(ruralDistrictId); // آبادیها؛ فقط اینجا lazy load میشوند
ir.path(id); // مسیر کامل از کشور تا محل
پکیج هیچ وابستگی ندارد و آبادیها را فقط وقتی میخوانید بارگذاری میکند. جستوجو به ی و ک عربی، اعراب، فاصله و نیمفاصله حساس نیست.
registry.npmjs.org است که بدون احراز هویت نصب میشود؛ نسخه روی GitHub Packages فقط آینه است.
صفحه دادهها را با fetch میگیرد و مرورگرها این کار را روی file:// بلاک میکنند، پس باز کردن مستقیم فایل جواب نمیدهد. یک وبسرور ساده کافی است:
cd docs && python3 -m http.server 8000
# سپس http://localhost:8000
اگر پایتون ندارید:
npx serve docs
php -S localhost:8000 -t docs
برای میزبانی روی GitHub Pages در فورک خودتان: Settings ← Pages ← Deploy from a branch ← Branch: master /docs.
بر اساس سند استاندارد آدرسدهی مرکز آمار ایران که در source/geo_standard.pdf مخزن است.
DivisionType = 7 دارد و والدش شهر است.| coderec | معنی در سند مرکز آمار | DivisionType |
|---|---|---|
1 | استان | 1 |
2 | شهرستان | 2 |
3 | بخش | 3 |
4 | دهستان | 4 |
5 | شهرها و مناطق شهری | 5 یا 7 |
6 | آبادیهای نقطهای | 6 |
7 | بلوکها | در فایل سالانه نیست |
8 | آبادیهای دارای نقشه بلوکه | 6 |
F | نقاط فرعی | در فایل سالانه نیست |
H | حوزه | فقط در فایل سرشماری |
ردیفهای coderec = 8 هم آبادی هستند و تنها تفاوتشان این است که نقشه بلوکه دارند؛ فیلد diag کد چهار رقمی آدرسدهی همان آبادی است.
کد و ساختار مخزن با مجوز MIT. دادهها از مرکز آمار ایران.
گزارش اشکال و درخواست سالهای بیشتر در issues مخزن.