Skip to main content
सिटी इवेंट्स मैप कैसे बनाएं: वेन्यू, कैटेगरी और लाइव डिस्कवरी
Tutorials

सिटी इवेंट्स मैप कैसे बनाएं: वेन्यू, कैटेगरी और लाइव डिस्कवरी

सिटी इवेंट्स मैप बनाने की एक व्यावहारिक गाइड: वेन्यू को geocode करें, marker प्लॉट और cluster करें, कैटेगरी और इलाके के हिसाब से फ़िल्टर करें, और लिस्टिंग को खोजने-योग्य बनाएं।

Brent van der Heiden7 min read
#events map#interactive map#geocoding#poi search#javascript map#local discovery

ज़्यादातर local discovery प्रोडक्ट्स एक ही स्क्रीन पर जीते या मरते हैं: map। एक यूज़र आपका app एक सरल सवाल का जवाब पाने के लिए खोलता है, अभी मेरे पास क्या हो रहा है, और map ही वह ज़रिया है जिससे वे इसका जवाब पाते हैं। उस map को सही बनाना, सही pin, तेज़ फ़िल्टरिंग, और ऐसी लिस्टिंग के साथ जिन्हें search engine वाकई पढ़ सकें, यही किसी भी events गाइड के पीछे की मुख्य इंजीनियरिंग है।

यह गाइड शुरू से एक सिटी इवेंट्स मैप बनाने के हर कदम को समझाती है: इवेंट डेटा को मॉडल करना, वेन्यू को coordinates में geocode करना, marker प्लॉट और cluster करना, कैटेगरी और इलाके के हिसाब से फ़िल्टर करना, और लिस्टिंग को खोजने-योग्य बनाना। यह मान कर चलती है कि आप पहले से एक base map रेंडर करना जानते हैं। अगर नहीं जानते, तो हमारे ट्यूटोरियल अपनी वेबसाइट पर interactive map कैसे जोड़ें से शुरू करें और events से जुड़े हिस्सों के लिए यहाँ वापस आएं।

इवेंट को उसके वेन्यू के इर्द-गिर्द मॉडल करें

एक इवेंट एक समय-बद्ध चीज़ है जो किसी जगह पर होती है। जगह ही वह चीज़ है जो map पर जाती है, इसलिए वेन्यू आपके डेटा मॉडल का लंगर है। एक न्यूनतम इवेंट रिकॉर्ड ऐसा दिखता है:

const event = {
  id: 'evt_8471',
  title: 'Late Night Jazz at The Vortex',
  category: 'live-music',
  venue: 'The Vortex Jazz Club, 11 Gillett Square, London N16 8AZ',
  coords: null,        // geocoding से भरा जाता है, एक बार
  neighbourhood: null, // reverse geocoding से भरा जाता है, एक बार
  startsAt: '2026-07-09T20:30:00Z',
  url: 'https://example.com/tickets/8471',
};

दोनों null फ़ील्ड मायने रखते हैं। आप हर बार map load होने पर एक वेन्यू को geocode नहीं करना चाहते। एक बार geocode करें, जब इवेंट बनाया या import किया जाए, फिर coordinates को स्टोर करें और उन्हें स्थायी मानें।

स्टेप 1: हर वेन्यू को coordinates में geocode करें

Geocoding एक इंसानी पते को एक latitude और longitude में बदल देता है जिसे आप प्लॉट कर सकते हैं। वेन्यू की string को Geocoding API पर भेजें और सबसे ऊपर वाले नतीजे से coordinates पढ़ें:

async function geocodeVenue(address) {
  const url = new URL('https://api.mapatlas.eu/geocoding/v1/search');
  url.searchParams.set('text', address);
  url.searchParams.set('size', '1');

  const res = await fetch(url, { headers: { Authorization: `Bearer ${API_KEY}` } });
  const data = await res.json();
  const top = data.features?.[0];
  if (!top) return null;

  const [lon, lat] = top.geometry.coordinates;
  return { lat, lon, label: top.properties.label };
}

इसे write टाइम पर चलाएं, जब कोई इवेंट आपके सिस्टम में आए, और लौटाए गए coordinates को रिकॉर्ड पर सुरक्षित रखें। इस बात की पूरी व्याख्या के लिए कि pin की सटीक जगह क्यों मायने रखती है, और छत के coordinates उस दरवाज़े से कैसे अलग होते हैं जहाँ लोग असल में चल कर जाते हैं, building-entrance geocoding देखें।

स्टेप 2: इवेंट्स को marker के रूप में प्लॉट करें

हर इवेंट पर coordinates होने के साथ, प्लॉट करना एक loop है। हर कैटेगरी को उसका अपना रंग दें ताकि map एक नज़र में पढ़ने योग्य रहे:

const CATEGORY_COLORS = {
  'live-music': '#E75480',
  'theatre':    '#006BA6',
  'comedy':     '#EE7C0E',
  'food':       '#16A34A',
  'nightlife':  '#7C3AED',
};

function plotEvents(map, events) {
  events.forEach((evt) => {
    if (!evt.coords) return;
    const popup = new mapmetricsgl.Popup().setHTML(
      `<strong>${evt.title}</strong><br>${new Date(evt.startsAt).toLocaleString()}` +
      `<br><a href="${evt.url}">Tickets</a>`,
    );
    new mapmetricsgl.Marker({ color: CATEGORY_COLORS[evt.category] || '#0c3456' })
      .setLngLat([evt.coords.lon, evt.coords.lat])
      .setPopup(popup)
      .addTo(map);
  });
}

यह असली प्रोडक्ट्स के पीछे का पैटर्न है। एक जीता-जागता उदाहरण है OnlyHere, लंदन में करने लायक चीज़ों की एक रोज़ाना गाइड जो हर वेन्यू को geocode करती है और दिन के इवेंट्स को एक interactive MapAtlas map पर प्लॉट करती है, ताकि एक यूज़र एक सपाट लिस्ट को स्क्रॉल करने के बजाय वेन्यू और इलाके के हिसाब से देख सके कि क्या हो रहा है।

स्टेप 3: जब शहर भर जाए तब cluster करें

मुट्ठी भर इवेंट्स के लिए अलग-अलग marker ठीक हैं। एक पूरे शहर का feed मुट्ठी भर नहीं होता। जैसे ही आप लगभग 100 से 200 pin पार करते हैं, इवेंट्स को एक GeoJSON source में ले जाएं और map को उन्हें cluster करने दें:

map.addSource('events', {
  type: 'geojson',
  cluster: true,
  clusterRadius: 50,
  data: {
    type: 'FeatureCollection',
    features: events.filter((e) => e.coords).map((e) => ({
      type: 'Feature',
      geometry: { type: 'Point', coordinates: [e.coords.lon, e.coords.lat] },
      properties: { title: e.title, category: e.category },
    })),
  },
});

अब शहर के बीचोबीच एक व्यस्त रात सौ ओवरलैप करते pin के बजाय एक गिनती वाला अकेला बबल दिखाती है, और जैसे-जैसे यूज़र zoom करता है, cluster अलग हो जाता है।

स्टेप 4: कैटेगरी और इलाके के हिसाब से फ़िल्टर करें

फ़िल्टरिंग वह जगह है जहाँ एक events map एक events प्रोडक्ट बन जाता है। पूरी लिस्ट memory में रखें और array को फ़िल्टर करें, फिर हाथ से marker दोबारा बनाने के बजाय फ़िल्टर किए गए सेट को map source को सौंप दें:

function applyFilters(map, allEvents, { category, neighbourhood }) {
  const filtered = allEvents.filter((e) =>
    (!category || e.category === category) &&
    (!neighbourhood || e.neighbourhood === neighbourhood),
  );
  map.getSource('events').setData({
    type: 'FeatureCollection',
    features: filtered.filter((e) => e.coords).map((e) => ({
      type: 'Feature',
      geometry: { type: 'Point', coordinates: [e.coords.lon, e.coords.lat] },
      properties: { title: e.title },
    })),
  });
  return filtered;
}

neighbourhood फ़ील्ड भरने के लिए, हर वेन्यू के coordinates को एक बार reverse geocode करें और admin क्षेत्र का नाम स्टोर करें। वह एक अकेली वैल्यू एक इलाके के dropdown, एक "इस क्षेत्र में क्या हो रहा है" व्यू, और एक साफ़-सुथरे लिस्टिंग पेज को शक्ति देती है, यह सब run टाइम पर किसी और lookup के बिना।

स्टेप 5: लिस्टिंग को खोजने-योग्य बनाएं

एक map उस व्यक्ति के लिए सवाल का जवाब देता है जो पहले से आपके app में है। यह उस कहीं बड़े दर्शक वर्ग के लिए कुछ नहीं करता जो किसी search engine या AI असिस्टेंट से पूछ रहा है, "आज रात Shoreditch में क्या हो रहा है"। वे सिस्टम structured data पढ़ते हैं, pixel नहीं।

हर इवेंट को schema.org Event फ़ील्ड्स के साथ मार्कअप करें, और उन्हीं coordinates का दोबारा इस्तेमाल करें जो आपके पास पहले से हैं:

{
  "@context": "https://schema.org",
  "@type": "Event",
  "name": "Late Night Jazz at The Vortex",
  "startDate": "2026-07-09T20:30:00Z",
  "location": {
    "@type": "Place",
    "name": "The Vortex Jazz Club",
    "geo": { "@type": "GeoCoordinates", "latitude": 51.5462, "longitude": -0.0753 }
  }
}

जो coordinates pin खींचते हैं वही structured data को भी feed करते हैं, इसलिए display और discovery एक ही सच के स्रोत से आते हैं। यही उस map के बीच का फ़र्क है जो अच्छा दिखता है और उस प्रोडक्ट के बीच जो खोजा जाता है। इस बारे में और जानने के लिए कि machine-readable location data AI search में दृश्यता को क्यों बढ़ाता है, AI search के लिए location-specific FAQ की हमारी गाइड देखें।

सब कुछ एक साथ लाना

एक सिटी इवेंट्स मैप पाँच चलते-फिरते हिस्से हैं: एक वेन्यू-आधारित डेटा मॉडल, write टाइम पर geocoding, रंगीन marker, बड़े पैमाने पर clustering, और array-आधारित फ़िल्टरिंग, यह सब उस structured data के ऊपर टिका है जो लिस्टिंग को खोजने-योग्य रखता है। उन हिस्सों को एक ही geospatial प्लेटफ़ॉर्म पर बनाएं और coordinates geocoder से map तक और schema तक साफ़-सुथरे बहते हैं, बिना किसी दोहराए गए lookup और बिना किसी खिसकते डेटा के।

MapAtlas आपको यह सब EU-होस्टेड, GDPR-अनुरूप इंफ्रास्ट्रक्चर पर बनाने के लिए geocoding, reverse geocoding, place search और map rendering देता है। अपना खुद का शहर प्लॉट करना शुरू करने के लिए Geocoding API और Search API एक्सप्लोर करें।

अक्सर पूछे जाने वाले प्रश्न

सिटी इवेंट्स मैप बनाने के लिए मुझे किस डेटा की ज़रूरत है?

कम से कम, हर इवेंट के लिए एक वेन्यू का पता, एक कैटेगरी और एक शुरू होने का समय चाहिए। पता ही वह चीज़ है जो एक इवेंट को map pin में बदलती है: आप इसे एक बार geocode करके latitude और longitude पा लेते हैं, उन coordinates को स्टोर करते हैं, और हर बार इवेंट दिखाते समय उन्हीं का दोबारा इस्तेमाल करते हैं। बाकी सब कुछ, जैसे ticket लिंक, images और विवरण, वह metadata है जिसे आप marker के popup से जोड़ते हैं।

मैं एक वेन्यू के पते को map coordinates में कैसे बदलूं?

वेन्यू के पते की string के साथ एक geocoding API कॉल करें और response से latitude और longitude पढ़ें। MapAtlas Geocoding API के साथ आप पते को एक text query के रूप में https://api.mapatlas.eu/geocoding/v1/search पर भेजते हैं और सबसे ऊपर वाले नतीजे के coordinates इस्तेमाल करते हैं। हर वेन्यू को तब एक बार geocode करें जब इवेंट बनाया जाए, हर page load पर नहीं, ताकि map तेज़ रहे और आपका API इस्तेमाल कम रहे।

एक map धीमा होने से पहले कितने event marker दिखा सकता है?

zoom-out व्यू पर लगभग 100 से 200 pin तक अलग-अलग marker रेंडर करना smooth रहता है। उससे ज़्यादा होने पर GeoJSON source clustering पर स्विच करें, जो कम zoom पर पास-पास के इवेंट्स को एक ही गिनती वाले बबल में जोड़ देता है और जैसे-जैसे यूज़र zoom करता है, उन्हें अलग कर देता है। सैकड़ों लिस्टिंग वाले पूरे शहर के इवेंट्स feed को शुरू से ही clustering का इस्तेमाल करना चाहिए।

मैं यूज़र्स को कैटेगरी या इलाके के हिसाब से इवेंट्स फ़िल्टर करने कैसे दूं?

पूरी इवेंट लिस्ट को memory में एक array के रूप में रखें, हर आइटम से एक कैटेगरी और एक इलाका जोड़ें, और यूज़र के चयन के जवाब में उस array को फ़िल्टर करें। फिर marker को नष्ट और दोबारा बनाने के बजाय फ़िल्टर किए गए सेट के साथ map source को अपडेट करें। इलाके के हिसाब से ब्राउज़ करना भी इसी तरह काम करता है: उन इवेंट्स तक फ़िल्टर करें जिनके coordinates चुने गए क्षेत्र के अंदर आते हैं, या जो reverse geocoding से उसका admin नाम साझा करते हैं।

एक इवेंट्स मैप को structured data की ज़रूरत क्यों होती है?

एक विज़ुअल map इंसानों की मदद करता है, लेकिन search engine और AI असिस्टेंट structured data पढ़ते हैं। हर इवेंट को schema.org Event फ़ील्ड्स के साथ मार्कअप करना, जिसमें वेन्यू का नाम, coordinates और शुरू होने का समय शामिल हो, यही वह चीज़ है जो किसी लिस्टिंग को 'आज रात Shoreditch में क्या हो रहा है' जैसे सवालों के जवाब में सामने लाती है। जो coordinates आप map पर प्लॉट करते हैं वही structured data को feed करते हैं, इसलिए discovery और display एक ही सच के स्रोत से आते हैं।

यह उपयोगी लगा? इसे साझा करें।

लेखक के बारे में

Brent van der Heiden

लेखक

Brent van der Heiden

Co-Founder & CEO at MapAtlas

Brent built MapAtlas out of a conviction that developers deserve location APIs with fair pricing and genuine end-user privacy. He writes about geospatial infrastructure, AI search visibility, and how location data powers the products people rely on every day.

सभी लेख देखें
ब्लॉग पर वापस जाएं