প্রতিটি খুচরা ব্র্যান্ড, ফ্র্যাঞ্চাইজ এবং সেবা ব্যবসার অবশেষে একটি স্টোর লোকেটর প্রয়োজন। এটি সেই পৃষ্ঠা যা গ্রাহকরা পরিদর্শন করে যখন তারা ইতিমধ্যে কিনতে চায়, তাদের শুধু জানতে হবে কোন শাখায় প্রবেশ করবে। সেই পৃষ্ঠাটি ভুল পেলে প্রকৃত রূপান্তর খরচ হয়। এটি সঠিক পেলে বেশিরভাগ ডেভেলপার যা আশা করেন তার চেয়ে সহজ।
স্ট্যান্ডার্ড পদ্ধতি Google Maps হয়েছে, কিন্তু এর একটি খরচ কাঠামো রয়েছে যা স্কেলে কামড় দেয়। মাসে ৫০,০০০ দর্শক সহ একটি ব্যস্ত খুচরা সাইট ম্যাপ পৃষ্ঠা লোড করলে রাতারাতি শত শত ইউরো ম্যাপ লোড এবং জিওকোডিং চার্জ জমা হতে পারে। উৎপাদন ব্যবহারের জন্য আর বিনামূল্যে স্তর নেই, বিলিং অস্পষ্ট, এবং EU ব্যবসার জন্য একটি US-ভিত্তিক ম্যাপিং সেবা ব্যবহারের GDPR পরিস্থিতি সম্মতির ওপরে অতিরিক্ত ওভারহেড যোগ করে।
এই টিউটোরিয়ালটি একটি সম্পূর্ণ স্টোর লোকেটর তৈরি করে, ইন্টারঅ্যাক্টিভ ম্যাপ, ঠিকানা অনুসন্ধান, সিঙ্ক লিস্ট প্যানেল, মার্কার ক্লাস্টারিং এবং ক্লিক-টু-ডিটেইল পপআপ, MapAtlas Maps API এবং Geocoding API ব্যবহার করে। কোনো ফ্রেমওয়ার্ক প্রয়োজন নেই। সম্পূর্ণ কাজের উদাহরণ মোটামুটি 80 লাইন HTML এবং JavaScript-এ ফিট করে। আপনি এটি একটি WordPress কাস্টম HTML ব্লক, একটি Shopify বিভাগ বা যেকোনো CMS-এ এই একই দুপুরে রাখতে পারেন যখন আপনি এটি পড়েন।
শেষের দিকে আপনার কাছে থাকবে:
- আপনার স্টোর নেটওয়ার্কে কেন্দ্রীভূত একটি রেন্ডার করা ভেক্টর ম্যাপ
- JSON ডেটা অ্যারে থেকে লোড করা মার্কার যা কম জুমে ক্লাস্টার করা
- Geocoding API দ্বারা চালিত একটি ঠিকানা অনুসন্ধান বার
- একটি সিঙ্ক লিস্ট প্যানেল যা ম্যাপ ক্লিকে হাইলাইট করে
- একটি মোবাইল-প্রতিক্রিয়াশীল দুই-কলাম লেআউট
স্টোর লোকেটরের প্রকৃত প্রয়োজন
কোনো কোড লেখার আগে, প্রয়োজনীয়তা সম্পর্কে সুনির্দিষ্ট হওয়া সাহায্য করে। একটি কাজকর করা স্টোর লোকেটরের চারটি গতিশীল অংশ রয়েছে:
- একটি ম্যাপ যা টাইলস রেন্ডার করে, প্যান এবং জুম গ্রহণ করে এবং মার্কার দেখায়।
- একটি অনুসন্ধান ইনপুট যা ব্যবহারকারীর টাইপ করা ঠিকানা জিওকোড করে স্থানাঙ্ক পর্যন্ত, তারপর ম্যাপ পুনরায় কেন্দ্র করে।
- একটি মার্কার লেয়ার যা প্রতিটি স্টোর অবস্থান প্লট করে, কম জুমে কাছাকাছি পিনগুলি ক্লাস্টার করে এবং ক্লিকে একটি বিস্তারিত পপআপ খোলে।
- একটি লিস্ট প্যানেল যা অনুসন্ধান অবস্থান থেকে দূরত্ব দ্বারা সাজানো স্টোর দেখায়, সক্রিয় স্টোর হাইলাইট করে এবং ম্যাপের সাথে সিঙ্কে স্ক্রল করে।
এটিই। অন্য প্রতিটি বৈশিষ্ট্য, দিকনির্দেশনা, খোলার সময়, ইনভেন্টরি স্টক, এই চারটির উপরে স্তরযুক্ত একটি উন্নতি। প্রথমে কোর তৈরি করুন।
ধাপ 1: MapAtlas SDK লোড করুন
MapAtlas Maps API Mapbox GL JS ইন্টারফেসের সাথে সামঞ্জস্যপূর্ণ, তাই যেকোনো Mapbox GL JS টিউটোরিয়াল বা প্লাগইন সরাসরি কাজ করে। আপনার পৃষ্ঠার <head>-এ CDN লিঙ্ক যোগ করুন:
<link
rel="stylesheet"
href="https://unpkg.com/@mapmetrics/mapmetrics-gl/dist/mapmetrics-gl.css"
/>
<script src="https://unpkg.com/@mapmetrics/mapmetrics-gl/dist/mapmetrics-gl.js"></script>
If you are using npm:
npm install @mapmetrics/mapmetrics-gl
আপনার বিনামূল্যের API কী portal.mapmetrics.org/signup-এ পান। একটি কী ম্যাপ টাইলস, জিওকোডিং এবং রাউটিং কভার করে, জগলিং করার জন্য আলাদা প্রমাণপত্র নেই।
ধাপ 2: আপনার স্টোর ডেটা সংজ্ঞায়িত করুন
স্টোর ডেটা শুধু একটি GeoJSON FeatureCollection। প্রতিটি বৈশিষ্ট্য স্টোরের স্থানাঙ্ক এবং আপনার পপআপ যা কিছু প্রয়োজন তা বহন করে: নাম, ঠিকানা, ফোন, খোলার সময়।
const stores = {
type: "FeatureCollection",
features: [
{
type: "Feature",
geometry: { type: "Point", coordinates: [4.9041, 52.3676] },
properties: {
id: 1,
name: "Amsterdam Central",
address: "Stationsplein 12, 1012 AB Amsterdam",
phone: "+31 20 123 4567",
hours: "Mon–Sat 09:00–20:00"
}
},
{
type: "Feature",
geometry: { type: "Point", coordinates: [4.4777, 51.9244] },
properties: {
id: 2,
name: "Rotterdam Lijnbaan",
address: "Lijnbaan 10, 3012 EL Rotterdam",
phone: "+31 10 987 6543",
hours: "Mon–Sat 09:00–21:00"
}
},
{
type: "Feature",
geometry: { type: "Point", coordinates: [5.1214, 52.0907] },
properties: {
id: 3,
name: "Utrecht Centrum",
address: "Oudegracht 45, 3511 AB Utrecht",
phone: "+31 30 555 1234",
hours: "Mon–Sun 10:00–19:00"
}
}
]
};
উৎপাদনে আপনি এটি একটি API এন্ডপয়েন্ট বা CMS থেকে নিয়ে আসবেন। কাঠামো একই থাকে, একমাত্র পার্থক্য হল ডেটা কোথা থেকে আসে।
ধাপ 3: ম্যাপ রেন্ডার করুন এবং ক্লাস্টারিং যোগ করুন
ম্যাপ ইনিশিয়ালাইজ করুন, স্টোর ডেটা একটি GeoJSON উৎস হিসাবে যোগ করুন ক্লাস্টারিং সক্ষম সহ, এবং ক্লাস্টার সার্কেল এবং পৃথক পিন লেয়ার আঁকুন। Mapbox GL JS ক্লাস্টারিং উৎস সংজ্ঞায়িতে নির্মিত, কোনো প্লাগইন প্রয়োজন নেই।
const map = new mapmetricsgl.Map({
container: 'map',
style: 'https://tiles.mapatlas.eu/styles/basic/style.json?key=YOUR_API_KEY',
center: [5.2913, 52.1326], // Centre of the Netherlands
zoom: 7
});
map.on('load', () => {
// Add GeoJSON source with clustering
map.addSource('stores', {
type: 'geojson',
data: stores,
cluster: true,
clusterMaxZoom: 12,
clusterRadius: 50
});
// Cluster circles
map.addLayer({
id: 'clusters',
type: 'circle',
source: 'stores',
filter: ['has', 'point_count'],
paint: {
'circle-color': '#3B82F6',
'circle-radius': ['step', ['get', 'point_count'], 20, 10, 28, 30, 36]
}
});
// Cluster count labels
map.addLayer({
id: 'cluster-count',
type: 'symbol',
source: 'stores',
filter: ['has', 'point_count'],
layout: {
'text-field': '{point_count_abbreviated}',
'text-size': 13
},
paint: { 'text-color': '#ffffff' }
});
// Individual store pins
map.addLayer({
id: 'unclustered-point',
type: 'circle',
source: 'stores',
filter: ['!', ['has', 'point_count']],
paint: {
'circle-color': '#EF4444',
'circle-radius': 8,
'circle-stroke-width': 2,
'circle-stroke-color': '#ffffff'
}
});
});
একটি ক্লাস্টারে ক্লিক করলে পৃথক স্টোর প্রকাশ করতে জুম করে। একটি অসমন্বিত পিনে ক্লিক করলে একটি পপআপ খোলে।
ধাপ 4: পপআপ এবং লিস্ট প্যানেল সংযোগ করুন
যখন একজন ব্যবহারকারী একটি স্টোর পিনে ক্লিক করে, ম্যাপে একটি পপআপ দেখান এবং লিস্ট প্যানেলে মিলে যাওয়া কার্ড হাইলাইট করুন। উভয় ইন্টারঅ্যাকশন দ্বিমুখী হওয়া উচিত, একটি লিস্ট কার্ডে ক্লিক করা উচিত ম্যাপও সেই স্টোরে ফ্লাই করা।
// Click unclustered store → open popup + highlight list card
map.on('click', 'unclustered-point', (e) => {
const { coordinates } = e.features[0].geometry;
const { name, address, phone, hours, id } = e.features[0].properties;
new mapmetricsgl.Popup()
.setLngLat(coordinates)
.setHTML(`
<strong>${name}</strong>
<p>${address}</p>
<p>${phone}</p>
<p>${hours}</p>
`)
.addTo(map);
highlightCard(id);
});
// Click cluster → zoom in
map.on('click', 'clusters', (e) => {
const features = map.queryRenderedFeatures(e.point, { layers: ['clusters'] });
const clusterId = features[0].properties.cluster_id;
map.getSource('stores').getClusterExpansionZoom(clusterId, (err, zoom) => {
if (err) return;
map.easeTo({ center: features[0].geometry.coordinates, zoom });
});
});
function highlightCard(id) {
document.querySelectorAll('.store-card').forEach(card => {
card.classList.toggle('active', card.dataset.id === String(id));
});
}
// Build list panel from store data
function buildListPanel() {
const list = document.getElementById('store-list');
stores.features.forEach(({ properties, geometry }) => {
const card = document.createElement('div');
card.className = 'store-card';
card.dataset.id = properties.id;
card.innerHTML = `
<strong>${properties.name}</strong>
<p>${properties.address}</p>
<small>${properties.hours}</small>
`;
card.addEventListener('click', () => {
map.flyTo({ center: geometry.coordinates, zoom: 14 });
highlightCard(properties.id);
});
list.appendChild(card);
});
}
ধাপ 5: Geocoding API-এর সাথে ঠিকানা অনুসন্ধান যোগ করুন
অনুসন্ধান বার ব্যবহারকারীর টাইপ করা অবস্থান গ্রহণ করে, এটি Geocoding API-এর মাধ্যমে জিওকোড করে, ম্যাপ সেই পয়েন্টে ফ্লাই করে এবং লিস্ট প্যানেল দূরত্ব দ্বারা পুনরায় সাজায়।
async function searchLocation(query) {
const url = new URL('https://api.mapatlas.eu/geocoding/v1/search');
url.searchParams.set('text', query);
url.searchParams.set('key', 'YOUR_API_KEY');
const res = await fetch(url);
const data = await res.json();
if (!data.features.length) {
alert('Address not found. Try a city or postcode.');
return;
}
const [lng, lat] = data.features[0].geometry.coordinates;
// Fly map to searched location
map.flyTo({ center: [lng, lat], zoom: 10 });
// Sort list by distance from searched point
const sorted = [...stores.features].sort((a, b) => {
const distA = haversine(lat, lng, a.geometry.coordinates[1], a.geometry.coordinates[0]);
const distB = haversine(lat, lng, b.geometry.coordinates[1], b.geometry.coordinates[0]);
return distA - distB;
});
document.getElementById('store-list').innerHTML = '';
sorted.forEach(feature => {
// Re-render each card (reuse buildListPanel logic)
});
}
function haversine(lat1, lon1, lat2, lon2) {
const R = 6371;
const dLat = ((lat2 - lat1) * Math.PI) / 180;
const dLon = ((lon2 - lon1) * Math.PI) / 180;
const a =
Math.sin(dLat / 2) ** 2 +
Math.cos((lat1 * Math.PI) / 180) *
Math.cos((lat2 * Math.PI) / 180) *
Math.sin(dLon / 2) ** 2;
return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
}
document.getElementById('search-btn').addEventListener('click', () => {
const query = document.getElementById('search-input').value.trim();
if (query) searchLocation(query);
});
ধাপ 6: মোবাইল-প্রতিক্রিয়াশীল লেআউট
মোবাইলে একটি স্টোর লোকেটর অবশ্যই উল্লম্বভাবে স্ট্যাক করতে হবে, উপরে ম্যাপ, নিচে তালিকা, পাশাপাশি নয়। বিশ টি লাইন CSS একটি একক মিডিয়া কোয়েরি ব্রেকপয়েন্ট সহ এটি পরিচালনা করে।
#locator-wrapper {
display: flex;
height: 600px;
gap: 0;
}
#store-list {
width: 300px;
overflow-y: auto;
border-right: 1px solid #e5e7eb;
padding: 12px;
}
#map {
flex: 1;
}
.store-card {
padding: 12px;
border-radius: 8px;
cursor: pointer;
margin-bottom: 8px;
border: 2px solid transparent;
transition: border-color 0.2s;
}
.store-card.active {
border-color: #3B82F6;
background: #EFF6FF;
}
@media (max-width: 640px) {
#locator-wrapper {
flex-direction: column;
height: auto;
}
#store-list {
width: 100%;
border-right: none;
border-top: 1px solid #e5e7eb;
height: 280px;
}
#map {
height: 350px;
}
}
Google Maps-এর সাথে বিলিং এবং GDPR তুলনা
যদি আপনি একটি খুচরা সাইটে Google Maps চালু করছেন এবং আশ্চর্য করছেন এই মাসের বিল প্রত্যাশার চেয়ে বেশি কেন আসল, আপনি একা নন। Maps JavaScript API প্রতি ম্যাপ লোড চার্জ করে। Places API প্রতিটি অটোকমপ্লিট সেশন এবং প্রতিটি জিওকোডিং অনুরোধে চার্জ করে। সেই খরচগুলি দ্রুত যৌগিক হয়। মাসে ৫০,০০০ ভিজিট করা একটি সাইট, প্রতিটি একবার স্টোর লোকেটর পৃষ্ঠা লোড করে, একটি একক জিওকোডিং কলের আগে মাত্র ম্যাপ লোডে মাসে প্রায় €140 খরচ করে।
MapAtlas সমতল মাসিক পরিকল্পনা ব্যবহার করে। কোনো প্রতি-লোড বা প্রতি-অনুরোধ চার্জ নেই যা সতর্কতা ছাড়াই স্পাইক করে। আপনি Google Maps API প্রাইসিং 2026-এ সম্পূর্ণ খরচ ব্রেকডাউন এবং MapAtlas বনাম Google Maps তুলনা-তে সম্পূর্ণ ব্রেকডাউন পড়তে পারেন।
EU ডেভেলপারদের জন্য GDPR কোণও গুরুত্বপূর্ণ। Google Maps US অবকাঠামোর মাধ্যমে ডেটা রাউট করে। MapAtlas EU-হোস্টেড, ISO 27001 সার্টিফাইড এবং EU-এর মধ্যে সমস্ত অনুরোধ প্রক্রিয়া করে। খুচরা ব্যবসার জন্য যারা ইতিমধ্যে গ্রাহক সম্মতি সাবধানে পরিচালনা করছে, একটি EU-স্থানীয় ম্যাপিং প্রদানকারী ব্যবহার করা আপনার গোপনীয়তা নীতি থেকে আরও একটি তৃতীয় পক্ষের স্থানান্তর সরিয়ে দেয়।
সবকিছু একসাথে রাখা
সম্পূর্ণ স্টোর লোকেটর, HTML কাঠামো, CSS লেআউট, ম্যাপ init, ক্লাস্টারিং, পপআপ হ্যান্ডলিং, লিস্ট প্যানেল, অনুসন্ধান এবং দূরত্ব সাজান, আরামদায়কভাবে একটি ফাইলে ফিট করে। কাঠামো এইরকম দেখায়:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Store Locator</title>
<link rel="stylesheet"
href="https://unpkg.com/@mapmetrics/mapmetrics-gl/dist/mapmetrics-gl.css" />
<script src="https://unpkg.com/@mapmetrics/mapmetrics-gl/dist/mapmetrics-gl.js"></script>
<style>
/* paste the CSS from Step 6 here */
</style>
</head>
<body>
<div id="search-bar">
<input id="search-input" type="text" placeholder="Enter your city or postcode…" />
<button id="search-btn">Search</button>
</div>
<div id="locator-wrapper">
<div id="store-list"></div>
<div id="map"></div>
</div>
<script>
// paste store data, map init, clustering, popup, list panel, and search from Steps 2–5
</script>
</body>
</html>
ফলাফল হল MapAtlas SDK-এর বাইরে শূন্য বাহ্যিক নির্ভরতা সহ একটি উৎপাদন-প্রস্তুত স্টোর লোকেটর। কোনো বিল্ড ধাপ নেই, কোনো ফ্রেমওয়ার্ক নেই এবং চলমান বিলিং অবাক করা নেই।
যদি আপনি রাউটিং যোগ করতে চান, "আমার অবস্থান থেকে এই স্টোরে দিকনির্দেশনা পান", Routing API ব্যবহারকারীর স্থানাঙ্ক এবং স্টোরের স্থানাঙ্ক নেয় এবং একটি সম্পূর্ণ টার্ন-বাই-টার্ন রুট রিটার্ন করে যা আপনি একটি লাইন লেয়ার হিসাবে ম্যাপে আঁকতে পারেন। কীভাবে আপনার ওয়েবসাইটে ইন্টারঅ্যাক্টিভ ম্যাপ যোগ করবেন টিউটোরিয়াল সেই পরবর্তী ধাপটি বিস্তারিতভাবে কভার করে।
পরবর্তী পদক্ষেপ
- একটি বিনামূল্যের MapAtlas API কী-তে সাইন আপ করুন, কোনো ক্রেডিট কার্ড প্রয়োজন নেই
- ক্লাস্টারিং, কাস্টম স্টাইলিং এবং লেয়ার বিকল্পগুলির জন্য Maps API ডকুমেন্টেশন ব্রাউজ করুন
- পোস্টকোড লুকআপ, রিভার্স জিওকোডিং এবং ঠিকানা অটোকমপ্লিট-এর জন্য Geocoding API অন্বেষণ করুন
Frequently Asked Questions
Can I build a store locator without Google Maps?
Yes. MapAtlas provides a Mapbox GL JS-compatible Maps API and a Geocoding API that cover every feature a store locator needs, interactive map, address search, marker clustering, and popups, with no per-load billing and full GDPR compliance.
How much does a store locator cost to run on MapAtlas vs Google Maps?
MapAtlas is roughly 75% cheaper than Google Maps for equivalent usage. Google Maps charges per map load and per geocoding request, which adds up fast on a busy retail site. MapAtlas uses flat monthly plans with no per-request surprises.
Does MapAtlas work on WordPress and Shopify?
Yes. Because MapAtlas is pure JavaScript with no framework dependency, you can embed it in a WordPress custom HTML block, a Shopify theme section, or any CMS that lets you add a script tag and a div.

