
相信如果提起地理資料的處理,首先想起的資料庫就是postgis, 對大名鼎鼎的postgresql + 插件的方式來将POSTGRESQL 變成純純的地理資料處理的資料庫,這是人盡皆知和童叟無欺的功能。
那麼世界上如果我不想使用POSTGRESQL 的 postgis來處理我的地理資料以外的選擇,那麼NO.2 的選擇就是mongodb的 GeoJSON 此時更簡單的方式,以及不需要進行插件的方式,通過一整套MONGODB 提出的功能,你就可以擁有一個簡單處理地理資料的 Professional database .
1 地理資料類型
2 MONGODB 如何存儲地理資料
3 如何查詢地理資料,與例子
4 地理資料的索引
1 首先我們需要代入如下一些地理的概念
point 點 , linestring 線 , polygon 多邊形 , MultiPoint 多點 ,
MultiLineString , MultiPolygon , GeometryCollection 的在MONGODB 中的成型。
1 point 點
{type: "Point",coordinates:[90,2]} 經緯度
複制
2 linestring 線
{type:"LineString",coordinates:[40,3],[45,3]}
複制
3 polygon 多邊形,多邊形是通過多個點的描述通過線來最終組成一個形狀,特點是第一個點與最後一個點一定是一樣的,否則無法組成閉合的圖形。
{type:"Polygon",coordinates:[
[0,0],[3,6],[6,1],[0,0]
]
}
複制
polygons 多邊形也分為 single Rings 和 Multiple Rings
上面其實就組成了我們形狀中的,點線面,MONGODB 後面在對基本的資料進行進行組合
1 點組合
2 線組合
3 多邊型組合
4 地理圖形集合
以上就是mongodb 基于地理資料的基礎 ,以及組合,其中資料主要分為三塊
1 标注,标注地理的資料類型是什麼如,point ,linestring , polygon ,MulitiPoint, MultiLineString, MultiPolygon, GeometryCollection
2 資料内容 ,corrdinates 通過數組的方式将一組描述 點,線,面(多邊體),以及組合的資料進行合并。
總體來說地理資料是又簡單到複雜,點,線,面(多邊體),組合成多點, 多線,多面等類型。
2 MONGODB 如何存儲和表達這些資料,這裡存儲地理資料的方式在MONGODB 中表現為 GEOJSON 資料。這個存儲地理資料的JSON标準是由IETF 在2016年釋出的RFC7946中規定的如何存儲地理資料。
https://datatracker.ietf.org/wg/geojson/charter/
具體的資訊可以查詢上述網站,獲得詳細的資訊。
https://docs.mongodb.com/manual/reference/geojson/
在mongodb中具體的展示GEOJSON 的格式為
标記location 在 location 中通過 coordinates 來存儲定義個地理資訊,如下面的位置點資訊。
或者點比較多的多邊形
此外一個document 中的location的資訊應該集中存放,例如一個人的詳細資訊中包含他的家的位址 和 機關的位址,如下方的經緯度資料的存放
db.records.save( {
name : "John Smith",
addresses : [ {
context : "home" ,
location : [ 55.5, 42.3 ]
} ,
{
context : "work",
location : [ -74 , 44.74 ]
}
]
} )
複制
3 地理位置查詢主要有四種查詢
1 $near
2 $geoWithin
3 $nearSphere
4 $geoIntersects
下面針對部分查詢方式給出查詢的樣例
near 樣例
下面有導入了一個地理資料的collection , 資料内容是簡單的地名和所在的經緯度資訊以及他屬于的地區的門類。
特殊查詢,我們查出在經緯度在 【
-73.9667, 40.78
】的地方有哪些周圍在1公裡到5公裡的其他被标注的地方有哪些.
下面的查詢語句值直接從 restaurants collection 中查詢經緯度在[ -73.9667, 40.78 ] 與這個點周圍1 公裡 到 5 公裡中存在的其他的 restaurants 有哪些,并緊緊顯示這些地名。
db.restaurants.find(
{
location:
{ $near:
{
$geometry: { type: "Point", coordinates: [ -73.9667, 40.78 ] },
$minDistance: 100,
$maxDistance: 500
}
}
}
,{name:1,_id:0}
)
複制
2 僅僅查詢小于與坐标點900米的距離,并且名字必須是,“”Members Dining Room @ The Met Museum"
db.restaurants.find(
{ location:
{ $near :
{$geometry :
{type:"point" ,coordinates: [ -73.9667, 40.78 ], $minDistance: 900 }
}
},name: "Members Dining Room @ The Met Museum"
}
)
複制
3 geoWithin 樣例, 這裡通過geoWithin 來計算在經緯度半徑範圍記憶體在的餐館的數量
db.restaurants.find(
{location: {
$geoWithin:{$center:[[-74.138492, 40.631136],0.01]}
}
}
).count()
複制
通過上面的案例,我們在一些地理位置資料的篩選通過mongodb來操作是非常簡單的。
其他樣例可以檢視下面的網站中的例子
https://dev.to/vcpablo/4-ways-to-find-geojson-data-in-mongodb-14pb
4 關于查詢中MONGODB 使用的索引是地理位圖索引
那麼查詢資料的時候,需要建立索引,空間索引,如果不進行建立則查詢會出現這樣的錯誤。
那麼在你進行地理資料的查詢中,需要注意的就是針對地理資料進行空間索引的建立。
關于mongodb 的 2d 索引預設的精度在60厘米,可硬通過調整精度降低索引的大小
db.restaurants.createIndex(
{ location: "2dsphere"},
{background:true,name:"idx_location"}
)
複制
在地理資料存儲和計算方面POSTGRESQL 的POSTGIS 是業界的NO.1 ,但在地理位圖方面MONGODB 的地理資料的存儲和計算也可以嘗試,尤其在高并發的情況下,可能會給你一個 “驚豔” 的結果。