bd_locations 🇧🇩

pub package License: MIT Dart 3

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 const Dart objects—no JSON asset loading or async/await required.
  • 🌐 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, and upazila.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.