MongoDB CRUD操作:地理位置查詢

MongoDB CRUD操作:地理位置查詢

文章目錄

  • MongoDB CRUD操作:地理位置查詢
    • 地理空間數據
      • GeoJSON對象
      • 傳統坐標對
        • 通過數組指定(首選)
        • 通過嵌入文檔指定
    • 地理空間索引
      • 2dsphere
      • 2d
    • 地理空間查詢
      • 地理空間查詢運算符
      • 地理空間聚合階段
    • 地理空間模型
    • 舉例

MongoDB支持地理空間數據的查詢,這是MongoDB數據庫有別于其它數據庫的特色之一,在進行GIS相關系統開發的時候會比較有幫助。本文重點介紹MongoDB的地理空間功能。

gis search

地理空間數據

在MongoDB中,可以將地理空間數據存儲為GeoJSON對象或傳統坐標對。

GeoJSON對象

要計算類地球體上的幾何形狀,可將位置數據存儲為GeoJSON對象,GeoJSON對象是一個內嵌文檔:

  • 名為 type 的字段,指定 GeoJSON對象類型
  • 名為坐標的字段,用于指定對象的坐標。
<field>: { type: <GeoJSON type> , coordinates: <coordinates> }

注意:

經緯度坐標的第一個元素是經度第二個元素是緯度。其中經度值介于-180和180之間(含)。有效的緯度值介于-90和90之間(含)。

例如,一個GeoJSON的點:

location: {type: "Point",coordinates: [-73.856077, 40.848447]
}

關于對GeoJSON對象的地理空間查詢在球體上計算,MongoDB 使用WGS84參考系統對GeoJSON對象進行地理空間查詢。

傳統坐標對

要計算歐幾里得平面上的距離,需將位置數據存儲為傳統坐標對并使用2d索引。如果手動將數據轉換為GeoJSON點類型,MongoDB將通過使用2dsphere索引支持傳統坐標對上的球面計算。

要將數據指定為傳統坐標對,可以使用數組(首選)或嵌入式文檔。

通過數組指定(首選)
<field>: [ <x>, <y> ]

指定經緯度坐標時,則指定經度,再指定緯度。

<field>: [<longitude>, <latitude> ]
  • 有效的經度值介于 -180 和 180 之間(包含)。
  • 有效的緯度值介于 -90 和 90 之間(包含)。
通過嵌入文檔指定
<field>: { <field1>: <x>, <field2>: <y> }

如果指定緯度和經度坐標,則無論字段名稱如何,第一個字段都必須包含經度值,第二個字段必須包含緯度值,即:

<field>: { <field1>: <longitude>, <field2>: <latitude> }
  • 有效的經度值介于 -180 和 180 之間(包含)。
  • 有效的緯度值介于 -90 和 90 之間(包含)。

指定舊坐標對,數組優于嵌入文檔,因為某些語言不保證關聯映射順序。

地理空間索引

MongoDB 提供以下地理空間索引類型來支持地理空間查詢:

2dsphere

2dsphere 索引支持計算類地球體幾何圖形的查詢。

可使用db.collection.createIndex()創建2dsphere索引,并指定字符串"2dsphere"作為索引類型:

db.collection.createIndex( { <location field> : "2dsphere" } )

其中,<location field>是一個字段,其值為GeoJSON對象或傳統坐標對。

**注意:**在包含geoJSON點數組的字段上創建索引,將失敗并返回錯誤信息:MongoServerError:索引構建失敗

2d

2d索引支持在二維平面幾何圖形的查詢,雖然2d索引可以支持在球面上的$nearSphere查詢,但還是建議盡量使用2dsphere索引進行球面查詢。

可使用db.collection.createIndex()創建2dsphere索引,并指定字符串"2d"作為索引類型:

db.collection.createIndex( { <location field> : "2d" } )

<location field>字段的值是一個傳統坐標對。

地理空間查詢

注意:使用二維索引查詢球形數據可能會返回不正確的結果或錯誤。例如,二維索引不支持圍繞極點的球形查詢。

地理空間查詢運算符

MongoDB 提供以下地理空間查詢操作符:

運算符描述
$geoIntersects選擇與GeoJSON幾何圖形相交的幾何圖形。2dsphere索引支持 $geoIntersects
$geoWithin在邊界 GeoJSON 幾何圖形中選擇幾何圖形。2dsphere 和 2d 索引都支持 $geoWithin
$near返回靠近某個點的地理空間對象。需要地理空間索引。 2dsphere 和 2d 索引都支持$near
$nearSphere返回球體上某個點附近的地理空間對象。需要地理空間索引。 2dsphere 和 2d 索引都支持 $nearSphere

地理空間聚合階段

MongoDB支持$geoNear地理空間聚合管道階段,可根據與地理空間點的接近程度返回有序的文檔流,合并了地理空間數據的$match$sort$limit 的功能,輸出文檔包括附加距離字段,并且可以包括位置標識符字段。$geoNear要求地理空間索引。

地理空間模型

MongoDB 地理空間查詢可解釋平面或球面上的幾何圖形,2dsphere索引只支持球面查詢(即解釋球面上幾何圖形的查詢),2d索引支持平面查詢(即解釋平面上幾何圖形的查詢)和部分球面查詢,雖然 2d 索引支持某些球面查詢,但在這些球面查詢中使用2d索引可能會導致錯誤。所以,建議盡量使用 2dsphere 索引進行球形查詢。

下表列出了每個地理空間操作使用的地理空間查詢操作符、支持的查詢:

操作球形/平面查詢說明
$near(本行和下一行的GeoJSON質心點,2dsphere索引)球形參考$nearSphere運算符,它在與 GeoJSON 和 2dsphere 索引一起使用時提供相同的功能
$near(傳統坐標,2D 索引)平面
$nearSphere(GeoJSON 點,2dsphere 索引)球形提供與使用 GeoJSON點和2dsphere索引的$near操作相同的功能。對于球形查詢,最好使用$nearSphere,在名稱中顯式指定球形查詢,而不是$near運算符
$nearSphere(傳統坐標,2d索引)球面使用GeoJSON替代
$geoWithin : { $geometry: ... }球面
$geoWithin : { $box: ... }平面
$geoWithin : { $polygon: ... }平面
$geoWithin : { $center: ... }平面
$geoWithin : { $centerSphere: ... }球面
$geoIntersects球面
$geoNear聚合階段(2dsphere索引)球面
$geoNear聚合階段(2d索引))平面

舉例

使用下面的腳本創建places集合:

db.places.insertMany( [{name: "Central Park",location: { type: "Point", coordinates: [ -73.97, 40.77 ] },category: "Parks"},{name: "Sara D. Roosevelt Park",location: { type: "Point", coordinates: [ -73.9928, 40.7193 ] },category: "Parks"},{name: "Polo Grounds",location: { type: "Point", coordinates: [ -73.9375, 40.8303 ] },category: "Stadiums"}
] )

先在location字段上創建2dsphere索引:

db.places.createIndex( { location: "2dsphere" } )

下面的查詢使用$near運算符返回距離指定GeoJSON點至少1000米、最多 5000米的文檔,并按從最近到最遠的順序排序:

db.places.find({location:{ $near:{$geometry: { type: "Point",  coordinates: [ -73.9667, 40.78 ] },$minDistance: 1000,$maxDistance: 5000}}}
)

下面的操作使用$geoNear聚合操作返回與查詢過濾器{category: "Parks" }匹配的文檔,并按照距指定GeoJSON點從最近到最遠的順序排序:

db.places.aggregate( [{$geoNear: {near: { type: "Point", coordinates: [ -73.9667, 40.78 ] },spherical: true,query: { category: "Parks" },distanceField: "calcDistance"}}
] )

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21933.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21933.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21933.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

拿筆記下來!產品采購制造類合同怎樣寫比較穩妥?

拿筆記下來&#xff01;產品采購制造類合同怎樣寫比較穩妥&#xff1f; 近日&#xff0c;幾經波折&#xff0c;泰中兩國終于完成了潛艇采購談判&#xff01;你知道嗎&#xff1f;產品制造類合同或協議在起草前如果沒有充分考慮各種因素&#xff0c;可能會導致一系列問題和不利…

C語言學習:數據類型

一、 為什么要引入數據類型 ? 計算機中每個字節都有一個地址&#xff08;類似門牌號&#xff09; ? CPU通過 地址 來訪問這個字節的空間 0x20001103 1 0 0 1 0 0 1 1 0x20001102 1 1 1 0 1 1 1 0 0x20001101 1 1 1 1 0 1 0 1 0x20001100 0 …

linux c socket編程里SO_REUSEADDR的作用

比如下面的代碼 int reuse 1; int ret setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse)); if (ret SOCKET_ERROR) {log_error("_SetReuseAddr failed, err_code%d, fd%d", _GetErrorCode(), fd); }代碼解釋 setsockopt 函數用于設置…

無人監控視頻輸出卡頓狀態

設計思路&#xff0c;如下&#xff1a; 1.通過采集卡將視頻信號輸出到個人PC中 2.PC按設置好的時間&#xff0c;視頻屬性分片保存 3.將步驟2中的視頻&#xff0c;按預處理要求&#xff0c;得到待計算的視頻片段 4.使用SSIM算法計算預處理后的視頻&#xff0c;將計算得到的數據存…

聊天機器人的實踐過程

一、語聊機器人 OpenAI 的爆火&#xff0c;到如今也才一年多的時間&#xff0c;然而在過去的一年中&#xff0c;生成式AI的落地場景幾乎 80%都是 ChatBot 的形式&#xff0c;那么今天這篇文章我們就來聊一下&#xff0c;生成式AI和IM能擦出怎么樣的火花&#xff1f;以及各種場…

p13idea的其他操作

1 導入模塊 錯誤示范&#xff1a; 正確示范&#xff1a; 2 刪除模塊 必須用delete才能刪除干凈&#xff0c;用remove刪了之后還要回到文件里面把它刪除掉

有錢還系統源碼 人人還眾籌還錢模式還貸系統源碼

盈利模式&#xff1a; 1.系統里直推400 2.間推得200 3.升級是隔代匹配200 4.漏單直接設置歸系統 5.九級匹配不到直接歸平臺 有錢還平臺新注冊會員&#xff0c;即新入的負債者要分9次分別資助先來的11名負債者每人200元&#xff0c;這筆資助不是一次性給到對方&#xff0c…

Prism 入門04,導航功能

當前章節,沿用 上一章使用Prism 框架創建的WPF 項目空模板。在上一章節,各個不同的模塊之間能夠進行切換并把內容呈現在主程序的頁面當中(其實是通過在主程序中注冊的區域去發起一個導航的請求,然后跳轉到對應的視圖。也就是實現了導航跳轉功能)。 為什么能實現導航的跳轉?…

Mybatis的一級緩存

緩存 MyBatis 包含一個非常強大的查詢緩存特性,它可以非常方便地配置和定制。MyBatis 3 中的緩存實現的很多改進都已經實現了,使得它更加強大而且易于配置。 Mybatis和Hibernate一樣&#xff0c;也有一級和二級緩存&#xff0c;同樣默認開啟的只有一級緩存&#xff0c;二級緩…

docker-compose安裝多環境apollo

下載數據庫sql文件 https://github.com/apolloconfig/apollo/blob/master/scripts/sql/src/apolloconfigdb.sql https://github.com/apolloconfig/apollo/blob/master/scripts/sql/src/apolloportaldb.sql 創建庫并導入表 #生產環境 mysql> CREATE DATABASE IF NOT EXIS…

腦部磁共振成像腫瘤分割方法(MATLAB 2018)

近年腦腫瘤發病率呈上升趨勢&#xff0c;約占全身腫瘤的5%&#xff0c;占兒童腫瘤的70%。CT、MRI等多種影像檢查方法可用于檢測腦腫瘤&#xff0c;其中MRI應用于腦腫瘤成像效果最佳。精準的腦腫瘤分割是病情診斷、手術規劃及后期治療的必備條件&#xff0c;既往研究者對腦部腫瘤…

Python知識點12---Python的I/O操作

提前說一點&#xff1a;如果你是專注于Python開發&#xff0c;那么本系列知識點只是帶你入個門再詳細的開發點就要去看其他資料了&#xff0c;而如果你和作者一樣只是操作其他技術的Python API那就足夠了。 Python的流(I/O)操作&#xff0c;最簡單的其實就是輸入和輸出&#x…

擴展翡蜀定理問題

問題描述 給定一個大小為 n n n 的集合 A { a 1 , a 2 ~ a n } A\{a_1,a_2 \sim a_n\} A{a1?,a2?~an?}&#xff0c;滿足條件 gcd ( A ) 1 \text{gcd}(A)1 gcd(A)1。 O ( 1 ) O(1) O(1)時間內 求最大的 k k k &#xff0c;滿足不存在一個大小為 n n n 的非負數集合…

工廠的精益生產如此重要

什么是工廠的精益生產 精益生產&#xff08;Lean Manufacturing&#xff09;是一種起源于20世紀50年代日本豐田汽車公司的生產管理哲學。它的核心理念是通過消除生產過程中的浪費&#xff0c;優化流程&#xff0c;提高效率&#xff0c;從而實現成本降低和質量提升。精益生產不僅…

VRTK4.0學習——(二)

手柄綁定以及顯示 1.導入CameraRigs.UnityXRPluginFramework 和 CameraRigs.TrackedAlias 預設&#xff0c;將CameraRigs.UnityXRPluginFramework拖入CameraRigs.TrackedAlias的Elements中即可&#xff0c;運行軟件后即可看到手柄了 注&#xff1a;如果無法看到手柄&#xff…

MySQL:MySQL執行一條SQL查詢語句的執行過程

當多個客戶端同時連接到MySQL,用SQL語句去增刪改查數據,針對查詢場景,MySQL要保證盡可能快地返回客戶端結果。 了解了這些需求場景,我們可能會對MySQL進行如下設計: 其中,連接器管理客戶端的連接,負責管理連接、認證鑒權等;查詢緩存則是為了加速查詢,命中則直接返回結…

Linux Shell Script 編寫入門

Linux Shell 腳本是一種強大的工具&#xff0c;能夠幫助用戶自動化任務、簡化系統管理以及提高工作效率。本文將帶您全面了解如何編寫 Linux Shell 腳本&#xff0c;并介紹一些常見的腳本編寫技巧和注意事項。 目錄 什么是 Linux ShellShell 腳本的基本結構常用 Shell 命令變…

系統介紹在線直線度測量儀的測量原理

測頭的測量原理 藍鵬光電測頭采用的是CCD成像法測量&#xff0c;CCD成像法是指將被測物放置在物方遠心光路系統中進行成像&#xff0c;并利用成像位置的CCD芯片接收成像信息進行尺寸測量的方法。該測量方法的優點主要有兩個&#xff1a;一是成像邊界清晰&#xff0c;光電信號可…

從墻的功能出發 -分析歐特克Revit和廣聯達數維的差別

歐特克&#xff08;Autodesk&#xff09;在三維建模軟件領域的影響力是有目共睹的&#xff0c;它是行業的頭部產商&#xff0c;擁有眾多的高質量的三維設計軟件&#xff0c;涵蓋了建筑設計、機械設計與制造和電影文娛行業。Revit是其發布的建筑三維建模軟件&#xff0c;也是BIM…

如何用個人電腦搭建一臺本地服務器,并部署項目到服務器詳細教程(Ubuntu鏡像)

前言 VirtualBox虛擬機軟件是一款強大、免費且開源的虛擬化工具&#xff0c;它允許用戶在單一物理機器上同時運行多個操作系統。他對比VMware就是更輕量級的虛擬機軟件&#xff0c;而且操作更簡單。 下載地址&#xff1a;Download_Old_Builds_7_0 – Oracle VM VirtualBox …