GeoJSON হলো JSON-based format যা প্রতিটি আধুনিক web map পড়তে পারে। যদি আপনি কখনও একটি Leaflet map-এ একটি polygon এঁকে থাকেন, MapLibre-এ একটি vector layer style করে থাকেন, বা PostGIS-এ একটি service area store করে থাকেন, আপনি GeoJSON-এর সাথে কাজ করছেন, এমনকি যদি file extension অন্য কিছু বলে।
এই guide ব্যাখ্যা করে GeoJSON আসলে কী, এর geometry type-এর অর্থ কী, কোথায় এটি real system-এ দেখা যায় এবং যখন GeoJSON file একজন developer-এর laptop ছেড়ে production-এ আঘাত করে তখন কোন সমস্যাগুলি team-কে কামড়ায়।
GeoJSON আসলে কী
GeoJSON হলো geographic data structure encode করার জন্য একটি open format, IETF দ্বারা RFC 7946 হিসাবে ২০১৬ সালে standardised। এটি JSON-এর একটি strict subset: প্রতিটি GeoJSON document valid JSON, কিন্তু spec যোগ করে কোন key অনুমোদিত, geometry কীভাবে structured এবং coordinate কীভাবে ordered সে সম্পর্কে rule।
Format ইচ্ছাকৃতভাবে ছোট। সম্পূর্ণ spec-এ মাত্র নয়টি top-level object type আছে এবং একজন competent developer তাদের সবগুলি তাদের মাথায় রাখতে পারে। সেই smallness কেন GeoJSON web mapping-এর lingua franca হয়ে উঠেছে: এটি পড়া সহজ, লেখা সহজ এবং validate করা সহজ।
Coordinate সর্বদা [longitude, latitude] হিসাবে লেখা হয় (একটি optional altitude একটি তৃতীয় value হিসাবে), এবং coordinate reference system WGS84-তে fix করা, আপনার phone-এর GPS যে datum ব্যবহার করে। কোনো negotiation নেই, কোনো projection metadata নেই, কোনো axis order debate নেই। এক datum, এক ordering, সর্বত্র।
Geometry Type
GeoJSON সাতটি geometry type সংজ্ঞায়িত করে। প্রথম তিনটি primitive:
- Point: একটি single coordinate, pin, address এবং individual sensor-এর জন্য ব্যবহৃত
- LineString: দুই বা ততোধিক coordinate-এর একটি ordered list, route, road এবং নদীর জন্য ব্যবহৃত
- Polygon: coordinate-এর একটি closed ring (প্রথম এবং শেষ point identical), building, parcel এবং admin boundary-এর জন্য ব্যবহৃত
পরবর্তী তিনটি কেবল সেই primitive-এর collection:
- MultiPoint: একটি geometry-তে অনেক point, একটি single feature হিসাবে দোকানের একটি chain represent করার জন্য useful
- MultiLineString: অনেক line string, fragmented route বা নদী system-এর জন্য ব্যবহৃত
- MultiPolygon: অনেক polygon, দ্বীপ আছে এমন যেকোনো দেশের জন্য সঠিক পছন্দ (তাই, প্রায় সবগুলি)
সপ্তম, GeometryCollection, উপরের যেকোনোটির একটি mix ধরে রাখতে পারে। Spec এটিকে নিরুৎসাহিত করে কারণ বেশিরভাগ consumer এটি খারাপভাবে handle করে এবং আপনার প্রায় কখনোই এটির প্রয়োজন হয় না। যদি আপনি GeometryCollection-এর জন্য reach করেন, এটি সাধারণত একটি sign যে model-টি একটি FeatureCollection হতে চায়।
Feature এবং FeatureCollection
একটি geometry একা খুব কমই useful। এটি কী represent করে তা আপনাকে জানতে হবে। সেটাই Feature-এর জন্য: একটি Feature একটি geometry-কে একটি properties object দিয়ে wrap করে যা arbitrary metadata ধরে রাখে।
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [4.8952, 52.3702]
},
"properties": {
"name": "Amsterdam Centraal",
"type": "station",
"platforms": 15
}
}
একটি FeatureCollection হলো Feature-এর একটি list। Wild-এ আপনি যে প্রায় প্রতিটি real GeoJSON file encounter করবেন তা একটি FeatureCollection, কারণ real dataset-এ অনেক জিনিস থাকে।
Crucial design choice হলো properties open। Spec কিছু বলে না এটি কোন key ধারণ করতে পারে বা সেই value কোন type হওয়া উচিত সে সম্পর্কে। এটি একটি feature, একটি bug নয়: এর মানে GeoJSON street furniture, electoral boundary, delivery zone এবং AIS ship track-এর জন্য কাজ করে format extend না করে। এটির মানে consumer-দের সতর্ক থাকতে হবে: যদি আপনি properties.population বিদ্যমান থাকার উপর নির্ভর করেন, এটি নিজেই validate করুন, কারণ RFC 7946 করবে না।
GeoJSON কোথায় দেখা যায়
একবার আপনি দেখতে শুরু করলে, GeoJSON geospatial stack-এ সর্বত্র:
- Map library: MapLibre GL, Mapbox GL, Leaflet এবং OpenLayers সবই layer-এর জন্য একটি data source হিসাবে natively GeoJSON consume করে
- Vector tile pipeline: Tippecanoe-এর মতো tool GeoJSON in নেয় এবং MVT (Mapbox Vector Tile) set out তৈরি করে
- Map style spec: Mapbox Style Specification, MapLibre দ্বারা ব্যবহৃত, GeoJSON-কে একটি first-class source type হিসাবে reference করে
- Spatial database: PostGIS, BigQuery GIS এবং Snowflake সবই dedicated function-এর মাধ্যমে GeoJSON import এবং export করে
- API output: বেশিরভাগ আধুনিক geocoding, isochrone এবং routing API result-এর জন্য GeoJSON Feature return করে, যাতে response সরাসরি একটি map-এ drop করা যায়
- Route polyline: navigation response-এ সাধারণত route-এর জন্য একটি LineString geometry অন্তর্ভুক্ত থাকে, render করার জন্য ready
- Data sharing: open data portal, OpenStreetMap export এবং government boundary release web user-দের target করার সময় GeoJSON-কে default করে
যদি একটি tool কোনো geospatial format কথা বলতে পারে, এটি প্রায় নিশ্চিতভাবে GeoJSON কথা বলে।
Production-এ সমস্যা
GeoJSON প্রথম দিনে forgiving এবং নব্বই দিন পরে unforgiving। যে trap team-গুলিকে ধরে:
Longitude first. RFC 7946 order-কে [lon, lat] হিসাবে fix করে। Human, address এবং বেশিরভাগ documentation lat, lon লেখে। এদের swap করা একক সবচেয়ে common GeoJSON bug, এবং আপনার point ভুল সমুদ্রে শেষ হয়।
Polygon winding order. RFC 7946 specify করে যে exterior ring counter-clockwise হতে হবে এবং interior ring (hole) clockwise। অনেক পুরানো GeoJSON file এটি উপেক্ষা করে। কিছু renderer এটি নিয়ে চিন্তা করে না, অন্যরা (বিশেষ করে antimeridian-crossing polygon সহ Mapbox GL) আপনি যা চেয়েছিলেন তার বিপরীত হিসাবে polygon render করে: একটি tiny island বাকি বিশ্ব cover করা সমুদ্রে একটি hole হয়ে যায়।
Antimeridian handling. ১৮০/-১৮০ meridian crossing geometry-কে spec অনুযায়ী split করতে হবে। Pacific জুড়ে আঁকা naive polygon গ্রহের চারপাশে long way wrapped একটি thin strip হিসাবে render হয়।
WGS84-এর বাইরে কোনো native CRS support নেই. RFC 7946 ইচ্ছাকৃতভাবে পুরানো crs member সরিয়ে দিয়েছে। যদি আপনার data একটি national grid-এ থাকে (British National Grid, RD New, EPSG:3857), serialise করার আগে আপনাকে WGS84-এ reproject করতে হবে। যে tool non-WGS84 GeoJSON emit করে তা technically non-conformant।
File size. millions of detailed polygon সহ একটি FeatureCollection gigabyte পর্যন্ত balloon হতে পারে। Browser delivery-এর জন্য, vector tile-এ switch করুন, Douglas-Peucker দিয়ে geometry simplify করুন, বা newline-delimited GeoJSON (.ndjson) দিয়ে stream করুন।
Validation. CI-তে GeoJSONLint-এর মতো একটি linter বা geojson-validation library ব্যবহার করুন। Build time-এ invalid winding order বা swapped coordinate ধরা একটি customer ticket থেকে ধরার চেয়ে সস্তা।
MapAtlas-এ GeoJSON
GeoJSON হলো MapAtlas platform জুড়ে default data exchange format। Dynamic Maps product custom overlay, styling এবং interactive layer-এর জন্য সরাসরি GeoJSON source গ্রহণ করে, কোনো preprocessing প্রয়োজন নেই।
Geocoding API matched address-কে GeoJSON Feature হিসাবে return করে, যাতে একটি forward geocode result সরাসরি একটি map-এ drop করা যেতে পারে বা field remap না করে PostGIS-এ store করা যেতে পারে। Isochrone API travel-time area-কে GeoJSON polygon হিসাবে return করে, যার মানে একটি "১৫ মিনিটে পৌঁছানো যায় এমন জায়গা" query screen-এ আসা থেকে এক fetch এবং এক addSource call দূরে।
GeoJSON glamorous নয়। এটি একটি fixed coordinate order এবং কয়েকটি geometry type সহ JSON-এর একটি ছোট, opinionated subset। কিন্তু এটিই সেই format যা একটি আধুনিক location stack-এর প্রতিটি layer-কে, spatial database থেকে map canvas পর্যন্ত, একটি place কী তা একমত হতে দেয়। longitude order সঠিক করুন, winding validate করুন এবং বাকি stack নিজেরই যত্ন নেয়।
সাধারণ জিজ্ঞাসা
GeoJSON কী?
GeoJSON হলো geographic data encode করার জন্য একটি JSON-based open format, IETF দ্বারা RFC 7946 হিসাবে standardised। এটি geometry type-এর একটি ছোট set সংজ্ঞায়িত করে (Point, LineString, Polygon এবং তাদের multi variant) plus Feature এবং FeatureCollection object যা arbitrary properties সহ geometry wrap করে। Coordinate সর্বদা WGS84 datum-এ longitude, latitude হিসাবে লেখা হয়, যা প্রতিটি আধুনিক web map library expect করে।
GeoJSON এবং JSON-এর মধ্যে পার্থক্য কী?
GeoJSON হলো অতিরিক্ত rule সহ JSON-এর একটি strict subset। প্রতিটি GeoJSON document valid JSON, কিন্তু প্রতিটি JSON document valid GeoJSON নয়। Spec top-level object type, geometry object-এর structure, coordinate ordering (longitude first) এবং coordinate reference system (WGS84) fix করে। সেই rule-এর বাইরে যেকোনো কিছু শুধু এমন JSON যা geographic data ধারণ করে।
Shapefile বা KML-এর পরিবর্তে কখন GeoJSON ব্যবহার করব?
যখনই data-কে একটি web stack-এর মধ্য দিয়ে flow করতে হয় তখন GeoJSON ব্যবহার করুন: API, browser, PostGIS-এর মতো database, বা MapLibre, Leaflet, Mapbox GL, বা OpenLayers-এর যেকোনো একটি। Shapefile এখনও desktop GIS-এ common কিন্তু চার বা তার বেশি file হিসাবে ship হয় এবং একটি ১৯৯০-এর binary format ব্যবহার করে। KML Google Earth-এর জন্য ঠিক আছে কিন্তু verbose এবং XML-based। JSON API-কে স্পর্শ করে এমন যেকোনো কিছুর জন্য GeoJSON জিতে।
GeoJSON coordinate কেন longitude first?
RFC 7946 order fix করে longitude, latitude, optional altitude হিসাবে। এটি বেশিরভাগ graphics এবং GIS system-এ ব্যবহৃত x, y, z convention-এর সাথে match করে। এটি human যেভাবে coordinate লেখে তার বিপরীত (latitude first, যেমন 51.5, -0.1) এবং hand-rolling GeoJSON-এ একক সবচেয়ে common bug: দুটি value swap করুন এবং আপনার point ভুল hemisphere-এ land করে। GeoJSON-এ সর্বদা longitude first।

