bd_locations đ§đŠ
A fast, zero-dependency, 100% offline geographic dataset of Bangladesh (8 Divisions, 64 Districts, and 495 Upazilas) in both Bengali (āĻŦāĻžāĻāϞāĻž) and English, complete with relational extensions, legacy-spelling-aware search, and GPS nearest-location helpers.
⨠Features
- đ Zero Async Overhead: All data is compiled as
constDart objectsâno JSON asset loading orasync/awaitrequired. - đ Bilingual Dataset: Every Division, District, and Upazila includes both English (
nameEn) and Bengali (nameBn) names plus official portal URLs. - đ Relational Extensions: Navigate effortlessly with
division.districts,district.upazilas,upazila.district, andupazila.division. - đ Smart Bilingual & Legacy Search: Search in Bengali (
āĻāĻā§āĻāĻā§āϰāĻžāĻŽ,āϝāĻļā§āϰ) or Englishâincluding legacy spellings (ChittagongâChattogram,JessoreâJashore,ComillaâCumilla,BograâBogura,BarisalâBarishal). - đ Geolocation Helpers: Find the nearest District or Division from any
(latitude, longitude)using the Haversine formula.
đĻ Installation
Add bd_locations to your pubspec.yaml:
# For Flutter projects
flutter pub add bd_locations
# For Pure Dart projects
dart pub add bd_locations
đ Quick Start
import 'package:bd_locations/bd_locations.dart';
void main() {
// 1. Access complete datasets
final divisions = BdLocations.divisions; // 8 Divisions
final districts = BdLocations.districts; // 64 Districts
final upazilas = BdLocations.upazilas; // 495 Upazilas
// 2. Navigate hierarchy using relational extensions
final dhakaDiv = BdLocations.getDivisionById(6)!;
print(dhakaDiv.nameBn); // āĻĸāĻžāĻāĻž
print(dhakaDiv.districts.length); // 13
final sylhetDistrict = BdLocations.searchDistricts('Sylhet').first;
for (final upazila in sylhetDistrict.upazilas) {
print('${upazila.nameBn} (${upazila.nameEn})');
}
// 3. Search in Bengali, English, or legacy spellings
final jashore = BdLocations.searchDistricts('Jessore').first;
print('${jashore.nameEn} - ${jashore.nameBn}'); // Jashore - āϝāĻļā§āϰ
final savar = BdLocations.searchUpazilas('āϏāĻžāĻāĻžāϰ').first;
print('${savar.nameEn}, ${savar.district.nameEn}'); // Savar, Dhaka
// 4. Find nearest district from GPS coordinates
final nearest = BdLocations.findNearestDistrict(21.4272, 92.0058);
print(nearest.nameEn); // Cox's Bazar
}
đą Flutter Cascading Dropdown Example (Division â District â Upazila)
import 'package:bd_locations/bd_locations.dart';
import 'package:flutter/material.dart';
class BdAddressPicker extends StatefulWidget {
const BdAddressPicker({super.key});
@override
State<BdAddressPicker> createState() => _BdAddressPickerState();
}
class _BdAddressPickerState extends State<BdAddressPicker> {
Division? selectedDivision;
District? selectedDistrict;
Upazila? selectedUpazila;
@override
Widget build(BuildContext context) {
final districts = selectedDivision?.districts ?? [];
final upazilas = selectedDistrict?.upazilas ?? [];
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
DropdownButtonFormField<Division>(
value: selectedDivision,
hint: const Text('āĻŦāĻŋāĻāĻžāĻ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰā§āύ (Select Division)'),
items: BdLocations.divisions.map((div) {
return DropdownMenuItem(
value: div,
child: Text('${div.nameBn} (${div.nameEn})'),
);
}).toList(),
onChanged: (division) {
setState(() {
selectedDivision = division;
selectedDistrict = null;
selectedUpazila = null;
});
},
),
const SizedBox(height: 12),
DropdownButtonFormField<District>(
value: selectedDistrict,
hint: const Text('āĻā§āϞāĻž āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰā§āύ (Select District)'),
items: districts.map((dist) {
return DropdownMenuItem(
value: dist,
child: Text('${dist.nameBn} (${dist.nameEn})'),
);
}).toList(),
onChanged: (district) {
setState(() {
selectedDistrict = district;
selectedUpazila = null;
});
},
),
const SizedBox(height: 12),
DropdownButtonFormField<Upazila>(
value: selectedUpazila,
hint: const Text('āĻāĻĒāĻā§āϞāĻž āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰā§āύ (Select Upazila)'),
items: upazilas.map((upa) {
return DropdownMenuItem(
value: upa,
child: Text('${upa.nameBn} (${upa.nameEn})'),
);
}).toList(),
onChanged: (upazila) {
setState(() => selectedUpazila = upazila);
},
),
],
);
}
}
đ API Overview
| Method / Property | Return Type | Description |
|---|---|---|
BdLocations.divisions |
List<Division> |
All 8 divisions of Bangladesh |
BdLocations.districts |
List<District> |
All 64 districts of Bangladesh |
BdLocations.upazilas |
List<Upazila> |
All 495 upazilas of Bangladesh |
BdLocations.getDivisionById(id) |
Division? |
Lookup division by ID (1..8) |
BdLocations.getDistrictById(id) |
District? |
Lookup district by ID (1..64) |
BdLocations.getUpazilaById(id) |
Upazila? |
Lookup upazila by ID (1..495) |
BdLocations.getDistrictsByDivision(id) |
List<District> |
All districts in a division |
BdLocations.getUpazilasByDistrict(id) |
List<Upazila> |
All upazilas in a district |
BdLocations.searchDivisions(query) |
List<Division> |
Search divisions in Bangla/English |
BdLocations.searchDistricts(query) |
List<District> |
Search districts (supports legacy names) |
BdLocations.searchUpazilas(query) |
List<Upazila> |
Search upazilas in Bangla/English |
BdLocations.findNearestDistrict(lat, lng) |
District |
Nearest district by GPS coordinates |
BdLocations.findNearestDivision(lat, lng) |
Division |
Nearest division by GPS coordinates |
đ License
This package is licensed under the MIT License.
Libraries
- bd_locations
- Complete offline geographic dataset of Bangladesh (Divisions, Districts, and Upazilas) in both Bengali and English with fast search and geolocation utilities.