Skip to main content
GeoJSON là gì? Định dạng, kiểu hình học và cạm bẫy production
Guides

GeoJSON là gì? Định dạng, kiểu hình học và cạm bẫy production

GeoJSON là định dạng dựa trên JSON mà mọi thư viện bản đồ hiện đại đều đọc được. Tìm hiểu các kiểu hình học, mẫu Feature và những cạm bẫy gặp phải trong production.

Brent van der Heiden7 min read
#geojson#geojson format#geojson file#rfc 7946#geospatial#maps api

GeoJSON là định dạng dựa trên JSON mà mọi bản đồ web hiện đại đều đọc được. Nếu bạn đã từng vẽ một polygon trên bản đồ Leaflet, style một vector layer trong MapLibre hay lưu một vùng dịch vụ trong PostGIS, bạn đã làm việc với GeoJSON, ngay cả khi phần mở rộng tệp ghi cái gì khác.

Bài viết này giải thích GeoJSON thực sự là gì, các kiểu hình học của nó nghĩa là gì, nơi nó xuất hiện trong các hệ thống thực và những cạm bẫy gặp phải khi tệp GeoJSON rời laptop developer và lên production.

GeoJSON thực sự là gì

GeoJSON là một định dạng mở để mã hóa cấu trúc dữ liệu địa lý, được chuẩn hóa bởi IETF thành RFC 7946 vào năm 2016. Nó là tập con nghiêm ngặt của JSON: mọi document GeoJSON đều là JSON hợp lệ, nhưng spec thêm các quy tắc về key nào được phép, hình học có cấu trúc ra sao và tọa độ được sắp thứ tự thế nào.

Định dạng cố ý nhỏ. Toàn bộ spec chỉ có chín kiểu object cấp cao, và một developer có năng lực có thể giữ tất cả trong đầu. Sự nhỏ gọn đó là lý do GeoJSON trở thành lingua franca của bản đồ web: dễ đọc, dễ viết và dễ validate.

Tọa độ luôn được viết là [kinh độ, vĩ độ] (với độ cao tùy chọn là giá trị thứ ba), và hệ tham chiếu tọa độ được cố định ở WGS84, cùng datum mà GPS điện thoại bạn dùng. Không có thương lượng, không có metadata projection, không có tranh luận thứ tự trục. Một datum, một thứ tự, ở mọi nơi.

Các kiểu hình học

GeoJSON định nghĩa bảy kiểu hình học. Ba cái đầu là primitive:

  • Point: một tọa độ đơn lẻ, dùng cho pin, địa chỉ và sensor đơn lẻ
  • LineString: danh sách có thứ tự gồm hai tọa độ trở lên, dùng cho tuyến, đường và sông
  • Polygon: một vòng tọa độ kín (điểm đầu và cuối giống hệt), dùng cho tòa nhà, thửa đất và biên hành chính

Ba cái tiếp theo đơn giản là tập hợp của các primitive đó:

  • MultiPoint: nhiều điểm trong một hình học, hữu ích để biểu diễn một chuỗi cửa hàng dưới dạng một feature duy nhất
  • MultiLineString: nhiều line string, dùng cho tuyến phân mảnh hoặc hệ thống sông
  • MultiPolygon: nhiều polygon, lựa chọn đúng cho mọi quốc gia có đảo (vậy là gần như tất cả)

Cái thứ bảy, GeometryCollection, có thể chứa hỗn hợp bất kỳ loại nào ở trên. Spec không khuyến khích dùng vì hầu hết bên tiêu thụ xử lý kém, và bạn gần như không bao giờ cần nó. Nếu bạn với tới GeometryCollection, đó thường là dấu hiệu rằng mô hình muốn trở thành một FeatureCollection.

Feature và FeatureCollection

Một hình học đơn thuần hiếm khi hữu ích. Bạn cần biết nó đại diện cho cái gì. Đó là việc của Feature: một Feature bọc một hình học cùng object properties chứa metadata tùy ý.

{
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [4.8952, 52.3702]
  },
  "properties": {
    "name": "Amsterdam Centraal",
    "type": "station",
    "platforms": 15
  }
}

Một FeatureCollection là một danh sách các Feature. Hầu như mọi tệp GeoJSON thực bạn gặp ngoài đời đều là một FeatureCollection, bởi vì các tập dữ liệu thực có nhiều thứ trong đó.

Lựa chọn thiết kế quan trọng là properties mở. Spec không nói gì về key nào nó có thể chứa hay các giá trị đó nên có kiểu gì. Đó là tính năng, không phải bug: nó nghĩa là GeoJSON hoạt động cho đồ phố, biên giới bầu cử, vùng giao hàng và track tàu AIS mà không cần mở rộng định dạng. Nó cũng nghĩa là bên tiêu thụ phải cẩn thận: nếu bạn phụ thuộc vào sự tồn tại của properties.population, hãy tự validate, vì RFC 7946 sẽ không làm.

GeoJSON xuất hiện ở đâu

Một khi bạn bắt đầu để ý, GeoJSON ở khắp nơi trong stack geospatial:

  • Thư viện bản đồ: MapLibre GL, Mapbox GL, Leaflet và OpenLayers đều tiêu thụ GeoJSON nguyên bản như một data source cho layer
  • Pipeline vector tile: công cụ như Tippecanoe nhận GeoJSON vào và xuất ra tập MVT (Mapbox Vector Tile)
  • Spec map style: Mapbox Style Specification, được MapLibre dùng, tham chiếu GeoJSON như một loại source hạng nhất
  • Database không gian: PostGIS, BigQuery GIS và Snowflake đều import và export GeoJSON qua các hàm chuyên dụng
  • Output API: hầu hết các geocoding, isochrone và routing API hiện đại trả về Feature GeoJSON cho kết quả, để response có thể đưa thẳng lên bản đồ
  • Polyline tuyến: response navigation thường bao gồm một hình học LineString cho tuyến, sẵn sàng render
  • Chia sẻ dữ liệu: portal dữ liệu mở, export OpenStreetMap và phát hành biên giới chính phủ mặc định dùng GeoJSON khi nhắm tới user web

Nếu một công cụ có thể nói bất kỳ định dạng geospatial nào, nó gần như chắc chắn nói GeoJSON.

Cạm bẫy trong production

GeoJSON khoan dung trong ngày đầu và không khoan dung vào ngày thứ chín mươi. Những bẫy bắt team:

Kinh độ trước. RFC 7946 cố định thứ tự là [lon, lat]. Con người, địa chỉ và phần lớn tài liệu viết lat, lon. Hoán đổi chúng là bug GeoJSON phổ biến nhất, và điểm của bạn kết thúc ở sai đại dương.

Thứ tự winding của polygon. RFC 7946 quy định vòng ngoài phải ngược chiều kim đồng hồ và vòng trong (lỗ) thuận chiều kim đồng hồ. Nhiều tệp GeoJSON cũ bỏ qua điều này. Một số renderer không quan tâm, một số khác (đáng chú ý là Mapbox GL với polygon vượt antimeridian) render polygon dưới dạng đảo ngược của thứ bạn muốn: một hòn đảo nhỏ trở thành cái lỗ trong đại dương phủ phần còn lại của thế giới.

Xử lý antimeridian. Hình học vượt qua kinh tuyến 180/-180 cần được tách theo spec. Polygon ngây thơ vẽ qua Thái Bình Dương render thành một dải mỏng quấn đường vòng quanh hành tinh.

Không có hỗ trợ CRS native ngoài WGS84. RFC 7946 cố ý loại bỏ thành phần crs cũ. Nếu dữ liệu của bạn ở một grid quốc gia (British National Grid, RD New, EPSG:3857), bạn phải reproject sang WGS84 trước khi serialize. Công cụ phát ra GeoJSON không phải WGS84 về kỹ thuật là không tuân thủ.

Kích thước tệp. Một FeatureCollection với hàng triệu polygon chi tiết có thể phình lên hàng gigabyte. Cho việc giao tới trình duyệt, hãy chuyển sang vector tile, đơn giản hóa hình học bằng Douglas-Peucker hoặc stream với GeoJSON ngăn cách dòng (.ndjson).

Validation. Hãy dùng linter như GeoJSONLint hoặc thư viện geojson-validation trong CI. Bắt được thứ tự winding sai hoặc tọa độ hoán đổi tại build time rẻ hơn so với bắt được từ ticket khách hàng.

GeoJSON trong MapAtlas

GeoJSON là định dạng trao đổi dữ liệu mặc định trên nền tảng MapAtlas. Sản phẩm Dynamic Maps chấp nhận source GeoJSON trực tiếp cho overlay tùy chỉnh, styling và layer tương tác, không cần tiền xử lý.

Geocoding API trả về địa chỉ đã match dưới dạng Feature GeoJSON, để kết quả forward geocode có thể đưa thẳng lên bản đồ hoặc lưu vào PostGIS mà không cần ánh xạ lại trường. Isochrone API trả về vùng thời gian di chuyển dưới dạng polygon GeoJSON, nghĩa là một truy vấn "địa điểm có thể đến trong 15 phút" chỉ cách màn hình một lần fetch và một lần addSource.

GeoJSON không hào nhoáng. Nó là một tập con nhỏ, có quan điểm của JSON với thứ tự tọa độ cố định và một nhúm kiểu hình học. Nhưng đó là định dạng cho phép mọi lớp của một stack vị trí hiện đại, từ database không gian đến canvas bản đồ, đồng ý về một địa điểm là gì. Hãy đặt thứ tự kinh độ đúng, validate winding, và phần còn lại của stack thường tự lo liệu.

Câu hỏi thường gặp

GeoJSON là gì?

GeoJSON là một định dạng mở dựa trên JSON để mã hóa dữ liệu địa lý, được chuẩn hóa thành RFC 7946 bởi IETF. Nó định nghĩa một tập nhỏ các kiểu hình học (Point, LineString, Polygon và các biến thể multi của chúng) cộng với object Feature và FeatureCollection bọc hình học cùng các property tùy ý. Tọa độ luôn được viết theo thứ tự kinh độ, vĩ độ trên datum WGS84, đó là thứ mà mọi thư viện bản đồ web hiện đại kỳ vọng.

Khác biệt giữa GeoJSON và JSON là gì?

GeoJSON là tập con nghiêm ngặt của JSON với các quy tắc bổ sung. Mọi document GeoJSON đều là JSON hợp lệ, nhưng không phải mọi document JSON đều là GeoJSON hợp lệ. Spec cố định kiểu object cấp cao, cấu trúc của object hình học, thứ tự tọa độ (kinh độ trước) và hệ tham chiếu tọa độ (WGS84). Bất cứ thứ gì ngoài các quy tắc đó chỉ là JSON tình cờ chứa dữ liệu địa lý.

Khi nào nên dùng GeoJSON thay vì shapefile hay KML?

Hãy dùng GeoJSON bất cứ khi nào dữ liệu phải chảy qua một stack web: API, trình duyệt, database như PostGIS, hoặc bất kỳ MapLibre, Leaflet, Mapbox GL hay OpenLayers nào. Shapefile vẫn phổ biến trong GIS desktop nhưng đi kèm bốn tệp trở lên và dùng định dạng nhị phân thập niên 1990. KML ổn cho Google Earth nhưng dài dòng và dựa trên XML. GeoJSON thắng cho mọi thứ chạm vào API JSON.

Tại sao tọa độ GeoJSON đặt kinh độ trước?

RFC 7946 cố định thứ tự là kinh độ, vĩ độ, độ cao tùy chọn. Điều này khớp với quy ước x, y, z dùng trong hầu hết hệ thống đồ họa và GIS. Nó ngược với cách con người viết tọa độ (vĩ độ trước, như 51.5, -0.1) và là bug phổ biến nhất khi tự viết GeoJSON: hoán đổi hai giá trị và điểm của bạn rơi vào sai bán cầu. Luôn kinh độ trước trong GeoJSON.

Thấy hữu ích? Chia sẻ nhé.

Về tác giả

Brent van der Heiden

Viết bởi

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.

Xem tất cả bài viết
Quay lại blog