简介
GeoJSON
是一种应用 JSON
来编码各种天文数据结构的格局,是一种轻量级的数据交换格局,能够用来示意几何对象、属性数据、空间参考零碎等信息
由两种对象组成:Geometry
(几何对象)和 Feature
(空间行状)
- 几何对象用来形容天文空间中的点、线、面等几何形态
- 空间行状用来形容一个有界的实体,包含几何对象和其余属性信息
几何对象类型有:
- 点:
Point
- 多点:
MultiPoint
- 线:
LineString
- 多线:
MultiLineString
- 面:
Polygon
- 多面:
MultiPolygon
- 几何汇合:
GeometryCollection
空间行状类型有:
- 空间行状:
Feature
- 空间形态汇合:
FeatureCollection
举例
几何对象和空间行状能够互相嵌套
const GeoJSON = {
type: "FeatureCollection",
features: [
{
type: "Feature",
geometry: {type: "Point", coordinates: [121.4737, 31.2304] },
properties: {id: 1},
},
{
type: "Feature",
geometry: {type: "Point", coordinates: [121.4837, 31.2504] },
properties: {id: 2},
},
],
};
空间行状
FeatureCollection
FeatureCollection
是 Feature
对象的汇合,用来示意一组 Feature
对象
由 type
和 features
两个属性组成:
type
属性的值为FeatureCollection
features
属性的值为Feature
对象的数组
const FeatureCollectionJSON = {
type: "FeatureCollection",
features: [feature],
};
Feature
Feature
对象用来示意几何对象的属性信息
由 type
、geometry
和 properties
三个属性组成:
type
属性的值为Feature
,geometry
属性的值为Geometry
几何对象properties
属性的值为属性对象(可选)
const FeatureJSON = {
type: "Feature",
geometry: {type: "Point", coordinates: [121.4737, 31.2304] },
properties: {id: 1},
};
几何对象
Point
Point
用来示意一个点
由 type
和 coordinates
两个属性组成:
type
属性的值为Point
coordinates
属性的值为一个数组,数组的第一个元素为经度,第二个元素为纬度
const PointJSON = {
type: "Point",
coordinates: [121.4737, 31.2304],
};
MultiPoint
MultiPoint
用来示意多个点
由 type
和 coordinates
两个属性组成:
type
属性的值为MultiPoint
coordinates
属性的值为一个数组,数组的每个元素都是一个点的坐标
const MultiPointJSON = {
type: "MultiPoint",
coordinates: [[121.4737, 31.2304],
[121.4837, 31.2504],
],
};
LineString
LineString
用来示意一条线
由 type
和 coordinates
两个属性组成:
type
属性的值为LineString
coordinates
属性的值为一个数组,数组的每个元素都是一个点的坐标
const LineStringJSON = {
type: "LineString",
coordinates: [[121.4737, 31.2304],
[121.4837, 31.2504],
],
};
MultiLineString
MultiLineString
用来示意多条线
由 type
和 coordinates
两个属性组成:
type
属性的值为MultiLineString
coordinates
属性的值为一个数组,数组的每个元素都是一个线的坐标数组
const MultiLineStringJSON = {
type: "MultiLineString",
coordinates: [
[[121.4737, 31.2304],
[121.4837, 31.2504],
],
[[121.4727, 31.2314],
[121.4827, 31.2514],
],
],
};
Polygon
Polygon
用来示意一个面
由 type
和 coordinates
两个属性组成:
type
属性的值为Polygon
coordinates
属性的值为一个数组,数组的第一个元素为外环的坐标数组,前面的元素为内环的坐标数组
polygon
的坐标数组的第一个元素和最初一个元素是雷同的,示意闭合
const PolygonJSON = {
type: "Polygon",
coordinates: [
[[121.4737, 31.2304],
[121.4837, 31.2504],
[121.4937, 31.2304],
[121.4737, 31.2304],
],
[[121.4717, 31.2314],
[121.4827, 31.2524],
[121.4937, 31.2334],
[121.4757, 31.2344],
],
],
};
MultiPolygon
MultiPolygon
用来示意多个面
由 type
和 coordinates
两个属性组成:
type
属性的值为MultiPolygon
coordinates
属性的值为一个数组,数组的每个元素都是一个面的坐标数组
const MultiPolygonJSON = {
type: "MultiPolygon",
coordinates: [
[
[[121.4737, 31.2304],
[121.4837, 31.2504],
[121.4937, 31.2304],
[121.4737, 31.2304],
],
[[121.4737, 31.2304],
[121.4837, 31.2504],
[121.4937, 31.2304],
[121.4737, 31.2304],
],
],
[
[[121.4737, 31.2304],
[121.4837, 31.2504],
[121.4937, 31.2304],
[121.4737, 31.2304],
],
[[121.4737, 31.2304],
[121.4837, 31.2504],
[121.4937, 31.2304],
[121.4737, 31.2304],
],
],
],
};
GeometryCollection
GeometryCollection
用来示意几何对象的汇合
由 type
和 geometries
两个属性组成:
type
属性的值为GeometryCollection
geometries
属性的值为几何对象的数组
const GeometryCollectionJSON = {
type: "GeometryCollection",
geometries: [{ type: "Point", coordinates: [121.4737, 31.2304] },
{
type: "LineString",
coordinates: [[121.4737, 31.2304],
[121.4837, 31.2504],
],
},
],
};
可选属性
这些属性都是 GeoJSON
的扩大属性,不是 GeoJSON
标准的一部分
id
属性,用来形容FeatureCollection
的惟一标识-
bbox
属性,用来形容FeatureCollection
的边界框- 四至坐标,个别用来做数据裁剪
- 这是一组左上角和右下角的坐标,示例:
[minLon, minLat, maxLon, maxLat]
properties
属性,用来形容FeatureCollection
的属性crs
属性,用来形容坐标参考系
其余
coordinate
coordinate
是一个数组,示意一个点的坐标,数组的长度示意坐标的维度,个别是 2
维或 3
维
2
维:[lon, lat]
3
维:[lon, lat, height]
coordinate
的第一个元素示意经度,第二个元素示意纬度,第三个元素示意高度
坐标程序是 [lon, lat]
,这个是举荐程序,可由 crs
属性指定
coordinates
是多维数组:
- 点:
[lon, lat]
- 线:
[[lon, lat], [lon, lat]]
- 面:
[[[lon, lat], [lon, lat]]]
- 多面:
[[[[lon, lat], [lon, lat]]]]
坐标参考系
最常应用的坐标系是 EPSG:4326
和 EPSG:3857
:
EPSG:4326
是WGS84
(CGCS2000,大地)坐标系,是GeoJSON
标准的默认坐标系EPSG:3857
是Web Mercator
(墨卡托)坐标系,是OpenLayers
的默认坐标系
它们的区别:
EPSG:4326
是经纬度坐标系,EPSG:3857
是投影坐标系EPSG:4326
的坐标范畴是[-180, -90, 180, 90]
,EPSG:3857
的坐标范畴是[-20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244]
EPSG:4326
的坐标单位是度,EPSG:3857
的坐标单位是米EPSG:4326
的坐标原点是[0, 0]
,EPSG:3857
的坐标原点是[-20037508.342789244, -20037508.342789244]
EPSG:4326
的坐标轴方向是[x, y]
,EPSG:3857
的坐标轴方向是[x, -y]
在 ts 中应用
为了在 ts
应用 GeoJSON
可能有类型束缚,我整顿整顿了一些 GeoJSON
的 ts
类型定义和创立 GeoJSON
的办法:
- geojson.d.ts
- geojson.helper.ts
举例:
-
示意一个点和多个点的
GeoJSON
汇合:应用 geojson.d.ts
type PointType = FeatureCollection<Point | MultiPoint, GeoJsonProperties<T>>; const point2Geojson: PointType<{id: string; name?: string}> = { type: "FeatureCollection", features: [ { type: "Feature", geometry: { type: "Point", coordinates: [120.4737, 31.2304], }, properties: {id: "12", name: "uccs"}, }, { type: "Feature", geometry: { type: "MultiPoint", coordinates: [[121.4737, 31.2304], [111.4737, 31.2204], ], }, properties: {id: "1"}, }, ], };
-
创立一个几何对象
应用 geojson.helper.ts
const pointGeometry = point<{id: string}>([120.4737, 31.2304], {id: "1",}); const featureGeoJSON = feature<Point>(pointGeometry);
参考
- GeoJSON
- GeoJSON 格局
- GeoJSON 格局标准
- EPSG 4326 vs EPSG 3857 (投影,数据集,坐标系)
- turf.js