javascript
GeoJSON初探
? ? ? ?
????????最近在做數(shù)據(jù)可視化的時(shí)候,提到了一種 GeoJSON 格式的數(shù)據(jù),在此進(jìn)行一下梳理。
1 簡介
????????GeoJSON是一種對(duì)各種地理數(shù)據(jù)結(jié)構(gòu)進(jìn)行編碼的格式。GeoJSON對(duì)象可以表示幾何、特征或者特征集合。GeoJSON支持下面幾何類型:點(diǎn)、線、面、多點(diǎn)、多線、多面和幾何集合。GeoJSON里的特征包含一個(gè)幾何對(duì)象和其他屬性,特征集合表示一系列特征。
????????一個(gè)完整的GeoJSON數(shù)據(jù)結(jié)構(gòu)總是一個(gè)(JSON術(shù)語里的)對(duì)象。在GeoJSON里,對(duì)象由名/值對(duì)--也稱作成員的集合組成。
例:
{"type": "FeatureCollection","features": [{"type": "Feature","geometry": {"type": "Point","coordinates": [102.0, 0.5]},"properties": {"prop0": "value0"}},{"type": "Feature","geometry": {"type": "LineString","coordinates": [[102.0, 0.0],[103.0, 1.0],[104.0, 0.0],[105.0, 1.0]]},"properties": {"prop0": "value0","prop1": 0.0}},{"type": "Feature","geometry": {"type": "Polygon","coordinates": [[[100.0, 0.0],[101.0, 0.0],[101.0, 1.0],[100.0, 1.0],[100.0, 0.0]]]},"properties": {"prop0": "value0","prop1": {"this": "that"}}}] }?2 GeoJSON 對(duì)象
????????GeoJSON總是由一個(gè)單獨(dú)的對(duì)象組成。這個(gè)對(duì)象(指的是下面的GeoJSON對(duì)象)表示幾何、特征或者特征集合。
- GeoJSON對(duì)象可能有任何數(shù)目成員(名/值對(duì))。
- GeoJSON對(duì)象必須由一個(gè)名字為"type"的成員。這個(gè)成員的值是由GeoJSON對(duì)象的類型所確定的字符串。
- ?type成員的值必須是下面之一:"Point", "MultiPoint", "LineString", "MultiLineString", "Polygon",??? "MultiPolygon",?? "GeometryCollection", "Feature", 或者 "FeatureCollection"。
- GeoJSON對(duì)象可能有一個(gè)可選的"crs"成員,它的值必須是一個(gè)坐標(biāo)參考系統(tǒng)的對(duì)象。
- GeoJSON對(duì)象可能有一個(gè)"bbox"成員,它的值必須是邊界框數(shù)組。
可以在?http://geojson.io?查看效果
2.1 幾何對(duì)象
????????幾何是一種GeoJSON對(duì)象,這時(shí)type成員的值是下面字符串之一:"Point", "MultiPoint", "LineString", "MultiLineString",? "Polygon", "MultiPolygon", 或者"GeometryCollection"。
????????除了“GeometryCollection”外的其他任何類型的GeoJSON幾何對(duì)象必須由一個(gè)名字為"coordinates"的成員。coordinates成員的值總是數(shù)組。這個(gè)數(shù)組里的元素的結(jié)構(gòu)由幾何類型來確定。
2.1.1 點(diǎn) Point
{"type": "Point","coordinates": [100.0, 0.0] }2.1.2 多點(diǎn) MultiPoint
{"type": "MultiPoint","coordinates": [[100, 0],[101, 1]] }2.1.3 線 LineString
{"type": "LineString","coordinates": [[100, 0],[101, 1]] }2.1.4 多線 MultiLineString
{"type": "MultiLineString","coordinates": [[ [100.0, 0.0], [101.0, 1.0] ],[ [102.0, 2.0], [103.0, 3.0] ]] }2.1.5 多邊形 Polyon
無孔的
{"type": "Polygon","coordinates": [[[ 100, 0 ],[ 101, 0 ],[ 101, 1 ],[ 100, 1 ],[ 100, 0 ]]] }有孔的
{"type": "Polygon","coordinates": [[[ 100, 0 ],[ 101, 0 ],[ 101, 1 ],[ 100, 1 ],[ 100, 0 ]],[[ 100.2, 0.2 ],[ 100.8, 0.2 ],[ 100.8, 0.8 ],[ 100.2, 0.8 ],[ 100.2, 0.2 ]]] }2.1.6 復(fù)合多邊形 MultiPolyon
不相交的多邊形
{"type": "MultiPolygon","coordinates": [[[[109.2041015625, 30.088107753367257],[115.02685546875, 30.088107753367257],[115.02685546875, 32.7872745269555],[109.2041015625, 32.7872745269555],[109.2041015625, 30.088107753367257]]],[[[112.9833984375, 26.82407078047018],[116.69677734375, 26.82407078047018],[116.69677734375, 29.036960648558267],[112.9833984375, 29.036960648558267],[112.9833984375, 26.82407078047018]]]] }兩個(gè)嵌套的多邊形
{"type": "MultiPolygon","coordinates": [[[[101.6455078125, 27.68352808378776],[114.78515624999999, 27.68352808378776],[114.78515624999999, 35.209721645221386],[101.6455078125, 35.209721645221386],[101.6455078125, 27.68352808378776]]],[[[104.2822265625, 30.107117887092357],[108.896484375, 30.107117887092357],[108.896484375, 33.76088200086917],[104.2822265625, 33.76088200086917],[104.2822265625, 30.107117887092357]]]] }有孔洞的多邊形
{"type": "MultiPolygon","coordinates": [[[[101.6455078125, 27.68352808378776],[114.78515624999999, 27.68352808378776],[114.78515624999999, 35.209721645221386],[101.6455078125, 35.209721645221386],[101.6455078125, 27.68352808378776]],[[104.2822265625, 30.107117887092357],[108.896484375, 30.107117887092357],[108.896484375, 33.76088200086917],[104.2822265625, 33.76088200086917],[104.2822265625, 30.107117887092357]]]] }2.1.7 幾何集合 GeometryCollection
????????是多種基本地理要素的集合,就是里面可以包含點(diǎn)、線、面要素
{"type": "GeometryCollection","geometries": [{"type": "Point","coordinates": [108.62, 31.02819]}, {"type": "LineString","coordinates": [[108.896484375, 30.1071178870],[108.2184375, 30.91717870],[109.5184375, 31.2175780]]}] }2.2 特征對(duì)象
- 類型為 Feature 的 GeoJSON 對(duì)象是特征對(duì)象
- 特征對(duì)象必須由一個(gè)名字為"geometry"的成員,這個(gè)幾何成員的值是上面定義的幾何對(duì)象或者JSON的null值。
- 特征對(duì)戲那個(gè)必須有一個(gè)名字為“properties"的成員,這個(gè)屬性成員的值是一個(gè)對(duì)象(任何JSON對(duì)象或者JSON的null值)
2.3 特征集合對(duì)象
- 特征集合對(duì)象type為FeatureCollection。
- 特征集合對(duì)象必須由一個(gè)名字為"features"的成員。與“features"相對(duì)應(yīng)的值是一個(gè)數(shù)組。這個(gè)數(shù)組中的每個(gè)元素都是上面定義的特征對(duì)象。
3 在各個(gè)數(shù)據(jù)庫中的應(yīng)用
3.1 mysql
1 geometry 類型
????????MySQL提供了數(shù)據(jù)類型geometry用來存儲(chǔ)坐標(biāo)信息,geometry類型支持以下三種數(shù)據(jù)存儲(chǔ)
| 數(shù)據(jù)結(jié)構(gòu) | 示例 | 說明 |
| POINT(點(diǎn)) | POINT(113.3 40.08) | 用于存儲(chǔ)點(diǎn)位信息,包含經(jīng)緯度信息 |
| LINESTRING(線) | LineString(84.070 33.801,99.52 30.292) | 用來存儲(chǔ)路線信息 |
| POLYGON(面) | POLYGON((84.070 33.801, 84.100 33.801,84.070 33.801)) | 用來存儲(chǔ)面數(shù)據(jù) |
2 格式化空間數(shù)據(jù)類型
????????數(shù)據(jù)庫存儲(chǔ)的空間數(shù)據(jù)通過可視化工具展示的明文結(jié)構(gòu)為上面示例中所見,結(jié)構(gòu)并不易于客戶端解析,所以MySQL提供了幾個(gè)空間函數(shù)用來解析及格式化空間數(shù)據(jù),geojson是gis空間數(shù)據(jù)展示的標(biāo)準(zhǔn)格式,前端地圖框架及后端空間分析相關(guān)框架都會(huì)支持geojson格式
| 操作 | 函數(shù) |
| geojson -> geometry | ST_GeomFromGeoJSON |
| geometry -> geojson | ST_ASGEOJSON |
| geometry字符串 -> geometry | ST_GEOMFROMTEXT |
?3 示例
新建表
CREATE TABLE `geojson` (`id` int(0) NOT NULL AUTO_INCREMENT,`geojson` geometry NULL,PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;?插入數(shù)據(jù)
insert into geojson(geojson) VALUES (ST_GeomFromGeoJSON('{"type": "Point", "coordinates": [121.0, 31.0]}'));查詢
select id,ST_AsGeoJSON(geojson) as geojson from geojson;常用的空間函數(shù)
| 名稱 | 描述 |
| ST_INTERSECTS() | 判斷兩個(gè)幾何是否相交 |
| ST_DISTANCE() | 兩個(gè)幾何的距離 |
| ST_CONTAIONS() | 幾何是否包含 |
| ST_ISVALID() | 幾何是否有效 |
| ST_WITHIN() | 幾何是否在里面,結(jié)果與ST_CONTAIONS()相反 |
3.2 mongodb
1 支持地理空間索引
- 2dsphere 索引
- 用于地球表面類型的地圖上
- 可以使用在 Legacy Coordinate Paris 保存的經(jīng)緯度字段上和使用 GeoJSON 格式保存的點(diǎn)、線、多邊形字段上
- 2d 索引
- 對(duì)于非球面(游戲地圖,時(shí)間連續(xù)的數(shù)據(jù)等),可以使用 2d 索引代替 2dsphere
- 支持平面查詢和一些球形查詢,但是球形支持不是很好
- 只能對(duì)點(diǎn)進(jìn)行索引
2 支持地理空間查詢
????????主要支持 交集(intersection),包含(within),以及接近(nearness)
- $geoIntersects
- 指出與查詢位置相交的文檔
- 支持操作符
- $geometry 指定 GeoJSON 格式的幾何圖形
- $geoWithin
- 指出完全包含在某個(gè)區(qū)域的文檔
- 支持操作符
- $box
- 查出矩形范圍內(nèi)的所有文檔
- $center
- 查出圓形范圍內(nèi)的所有文檔
- $polygon
- 查出多邊形范圍內(nèi)的所有文檔
- $centerSphere
- 查詢出球面圓形范圍內(nèi)的所有文檔
- $geometry
- 指定 GeoJSON 格式的幾何圖形
- $box
- $near
- 指出與查詢位置從最近到最遠(yuǎn)的文檔
- 支持操作符
- $maxDistance
- 指定查詢結(jié)果的最大距離
- $minDistance
- 指定查詢結(jié)果的最小距離
- $geometry
- 指定 GeoJSON 格式的點(diǎn)
- $maxDistance
- $nearSphere
- 使用球面幾何計(jì)算近球面的距離,指出與查詢位置從最近到最遠(yuǎn)的文檔
- 支持操作符
- $maxDistance
- 指定查詢結(jié)果的最大距離
- $minDistance
- 指定查詢結(jié)果的最小距離
- $geometry
- 指定 GeoJSON 格式的點(diǎn)
- $maxDistance
????????查詢位置相交的文檔
db.getCollection('GeoEntity').find({location: {$geoIntersects: {$geometry: {type: "Polygon" ,coordinates: [[ [ 30, 20 ], [ 30, 40 ], [ 40, 40 ],[ 40, 20 ],[ 30, 20 ]]]}}}})????????查詢交叉位置的文檔
db.getCollection('GeoEntity').find({ location: { $geoWithin: { $box: [ [ 30, 30 ], [ 32, 33 ]] } } })3.3 redis
1 地理空間命令
- geoadd
- geoadd key longitude latitude member [ longitude latitude member ... ]
- 將指定的空間元素添加到指定的 key 里
- geodist
- geodist key member1 member2 [ unit ]
- unit 代表單位
- 返回指定位置之間的距離
- geohash
- geohash key member [ member ... ]
- 返回一個(gè)標(biāo)準(zhǔn)的地理空間的 geohash 字符串
- geopos
- geopos key member [ member ... ]
- 返回地理空間的經(jīng)緯度
- georadius
- georadius key longitude latitude radius m|km|ft|mi [ WITHCOORD ] [ WITHDIST ] [ WITHHASH ] [ COUNT count ]
- 查詢指定半徑范圍內(nèi)所有地理空間元素的集合
- longitude 經(jīng)度
- latitude 緯度
- radius 半徑距離數(shù)
- WITHDIST 將位置元素的中心之間的距離也一并返回
- WITHCOORD 將位置元素的經(jīng)度和緯度也一并返回
- WITHHASH 以 52 位有符號(hào)整數(shù)的形式返回
- COUNT 返回所有匹配位置前 count 元素
- georadiusbymember
- georadiusbymember key member radius m|km|ft|mi [ WITHCOORD ] [ WITHDIST ] [ WITHHASH ] [ COUNT count ]
- 查詢指定半徑內(nèi)匹配到的最大距離的一個(gè)地理空間元素
總結(jié)
- 上一篇: Android音视频API - Medi
- 下一篇: 【练习题】根据下列信息计算在1901年1