CoolFace
Modelpublic

dineth554/sri-lanka-location-intelligence

sourceHugging Faceodblupdated 4mo agoView on Hugging Face
0likes
Model Card

๐Ÿ‡ฑ๐Ÿ‡ฐ Sri Lanka Location Intelligence System

Find every location, business, and place in Sri Lanka using AI-powered semantic search.

A comprehensive geospatial intelligence system covering 117,446 locations across Sri Lanka โ€” including police stations, hospitals, schools, places of worship, businesses, roads, buildings, natural features, and more. Powered by multilingual-e5-large (1024-dim embeddings, 100 languages) with FAISS IVFFlat vector search for instant semantic lookup.

Model Details

PropertyValue
Base Modelintfloat/multilingual-e5-large
ArchitectureXLMRobertaModel (24 layers, 16 heads)
Embedding Dimension1024
Model Size2.2 GB (SafeTensors)
Max Sequence Length512 tokens
Languages100 languages (English, Sinhala, Tamil, Hindi, Arabic, Chinese, Japanese, Korean, French, German, Spanish, and 90+ more)
LicenseMIT (model) + ODbL (location data)

Repository Contents

FileSizeDescription
model.safetensors2.2 GBmultilingual-e5-large model weights
models/โ€”Tokenizer, config, and sentence-transformers config
srilanka_places.db38 MBSQLite database of 117,446 Sri Lanka locations
srilanka_embeddings_large.npy~480 MBPre-computed 1024-dim embeddings (117,446 x 1024)
faiss_index_large.bin~480 MBFAISS IVFFlat index (nlist=200) for instant semantic search
id_mapping_large.npy~2 MBID-to-index mapping for result retrieval
metadata.json1 KBModel metadata and usage information

Road Coverage โ€” 38,874 Named Roads

Every named road in Sri Lanka is indexed โ€” from major highways (A1 Colombo-Kandy, E01 Southern Expressway) down to local streets (Galle Road, Marine Drive, Ward Place, Kollupitiya Road, etc.). Search by road name, find locations along roads, or discover nearby amenities.

Categories Covered

CategoryCountExamples
๐Ÿ›ฃ๏ธ Named Roads38,874A1, E01, Galle Road, Marine Drive
๐Ÿ  Buildings11,751Commercial, residential, government
๐Ÿ˜๏ธ Populated Places4,482Cities, towns, villages (Colombo, Kandy, Galle, Jaffna, etc.)
๐Ÿช Shops4,463Retail stores, supermarkets, pharmacies
โ›ช Places of Worship4,401Buddhist temples, churches, mosques, kovils
๐Ÿซ Schools4,401Government schools, international schools, universities
๐Ÿฅ Hospitals902Government hospitals, private clinics, Ayurvedic
๐Ÿš” Police Stations420Police stations and posts
๐Ÿฆ Banks & ATMs1,200+Commercial banks (BOC, People's Bank, HNB, Commercial Bank, etc.)
๐Ÿจ Hotels850+Hotels, guesthouses, resorts
๐Ÿฝ๏ธ Restaurants2,000+Restaurants, cafes, food outlets
๐Ÿ›๏ธ Government Offices1,500+Divisional secretariats, municipal councils, government departments
โ›ฝ Fuel Stations600+Petrol stations (Ceypetco, Lanka IOC, etc.)
๐ŸŒฟ Natural Features2,500+Rivers, mountains, forests, beaches
๐Ÿš‰ Transport Hubs350+Railway stations, bus stands, airports
๐ŸŸ๏ธ Landmarks1,200+Monuments, parks, stadiums, museums
๐Ÿ“ฆ And 10+ more categoriesโ€”Industrial, agricultural, utilities, etc.

Usage

Quick Start โ€” Semantic Search

python
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
import sqlite3
import json

# Load the model
model = SentenceTransformer('deathlegionteam/sri-lanka-location-intelligence')

# Load FAISS index and ID mapping
index = faiss.read_index('faiss_index_large.bin')
id_mapping = np.load('id_mapping_large.npy', allow_pickle=True)

# Connect to database
conn = sqlite3.connect('srilanka_places.db')
cursor = conn.cursor()

def search_locations(query, top_k=10):
    """Search any location in Sri Lanka by semantic query."""
    # Encode query
    query_vec = model.encode(['query: ' + query], normalize_embeddings=True)
    
    # Search FAISS index
    distances, indices = index.search(query_vec.astype(np.float32), top_k)
    
    # Fetch results from database
    results = []
    for i, idx in enumerate(indices[0]):
        location_id = id_mapping[idx]
        cursor.execute("SELECT * FROM locations WHERE id=?", (int(location_id),))
        row = cursor.fetchone()
        if row:
            # Convert sqlite3.Row to dict
            cols = [d[0] for d in cursor.description]
            location = dict(zip(cols, row))
            location['similarity'] = float(distances[0][i])
            results.append(location)
    
    return results

# Examples
results = search_locations("police station in Colombo")
for r in results[:5]:
    print(f"{r['name']} โ€” {r['category']} ({r['latitude']}, {r['longitude']})")

results = search_locations("Buddhist temple near Kandy")
results = search_locations("hospital with emergency services")
results = search_locations("Colombo 7 restaurant")

Category Filtering

python
def search_by_category(query, category, top_k=10):
    """Search within a specific category."""
    query_vec = model.encode(['query: ' + query], normalize_embeddings=True)
    distances, indices = index.search(query_vec.astype(np.float32), top_k * 3)
    
    results = []
    for idx in indices[0]:
        location_id = id_mapping[idx]
        cursor.execute("SELECT * FROM locations WHERE id=? AND category=?", 
                      (int(location_id), category))
        row = cursor.fetchone()
        if row:
            cols = [d[0] for d in cursor.description]
            location = dict(zip(cols, row))
            location['similarity'] = float(distances[0][list(indices[0]).index(idx)])
            results.append(location)
        if len(results) >= top_k:
            break
    return results

# Find hospitals in the Western Province
results = search_by_category("government hospital", "hospital", 5)

Nearby Search

python
import math

def haversine(lat1, lon1, lat2, lon2):
    """Calculate distance in km between two coordinates."""
    R = 6371
    dlat = math.radians(lat2 - lat1)
    dlon = math.radians(lon2 - lon1)
    a = math.sin(dlat/2)**2 + math.cos(math.radians(lat1)) * \
        math.cos(math.radians(lat2)) * math.sin(dlon/2)**2
    return R * 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))

def find_nearby(lat, lon, radius_km=5, limit=50):
    """Find locations near a point."""
    # Bounding box pre-filter
    lat_delta = radius_km / 111.0
    lon_delta = radius_km / (111.0 * abs(math.cos(math.radians(lat))) + 0.001)
    
    cursor.execute("""
        SELECT * FROM locations 
        WHERE latitude BETWEEN ? AND ?
        AND longitude BETWEEN ? AND ?
        ORDER BY ABS(latitude - ?) + ABS(longitude - ?)
        LIMIT ?
    """, (lat - lat_delta, lat + lat_delta,
          lon - lon_delta, lon + lon_delta,
          lat, lon, limit * 2))
    
    rows = cursor.fetchall()
    cols = [d[0] for d in cursor.description]
    
    results = []
    for row in rows:
        loc = dict(zip(cols, row))
        dist = haversine(lat, lon, loc['latitude'], loc['longitude'])
        if dist <= radius_km:
            loc['distance_km'] = round(dist, 2)
            results.append(loc)
            if len(results) >= limit:
                break
    
    return results

# Find everything near Colombo Fort
nearby = find_nearby(6.9344, 79.8428, radius_km=2)

Search Examples (query โ†’ actual results)

QueryFinds
"police emergency"Police stations near you
"Colombo hospital"National Hospital of Sri Lanka, private hospitals in Colombo
"temple tooth relic"Temple of the Tooth, Kandy
"galle road restaurant"Restaurants along Galle Road, Colombo
"Kandy school"Schools in Kandy district
"fuel station A1"Petrol stations along the A1 highway
"beach hotel"Beach resorts and hotels
"central bank"Central Bank of Sri Lanka, Colombo
"เท€เท’เท„เทเถปเถบ" (Sinhala)Buddhist temples
"เฎ•เฏ‹เฎตเฎฟเฎฒเฏ" (Tamil)Hindu temples/kovils

Data Sources

  • โ€”OpenStreetMap (via Geofabrik download: sri-lanka-latest.osm.pbf, 136 MB)
  • โ€”License: Open Database License (ODbL) โ€” data from OpenStreetMap contributors

Coverage

  • โ€”117,446 total locations indexed
  • โ€”27 classification categories
  • โ€”38,874 named roads
  • โ€”100+ languages supported for search queries
  • โ€”Full coverage of all 9 provinces (Western, Central, Southern, Northern, Eastern, North Western, North Central, Uva, Sabaragamuwa)

Technical Architecture

User Query (in any language)
        โ†“
multilingual-e5-large (1024-dim embedding)
        โ†“
FAISS IVFFlat Index (nlist=200, cosine similarity)
        โ†“
SQLite Database โ†’ Location Name + Coordinates + Category + Tags
        โ†“
Structured Results with similarity scores

License

  • โ€”Model: MIT License (intfloat/multilingual-e5-large)
  • โ€”Location Data: Open Database License (ODbL) โ€” ยฉ OpenStreetMap contributors
  • โ€”System: MIT License

Links