通常情況,我們使用一個(gè)經(jīng)緯度坐標(biāo)表示一個(gè)店鋪的位置、一個(gè)用戶的位置,經(jīng)緯度在地圖上僅僅表示一個(gè)點(diǎn),有時(shí)候需要表示一個(gè)區(qū)域,例如:停車場(chǎng)、商場(chǎng)、學(xué)校等等,這些區(qū)域擁有各種各樣的形狀,包括:圓形、多邊形等等。
ES中存儲(chǔ)地理形狀的數(shù)據(jù)類型為: geo_shape
geo_shape支持存儲(chǔ)的常用形狀數(shù)據(jù)如下:
- 點(diǎn)(point)
- 圓形(circle)
- 矩形(envelope)
- 多邊形 (polygon)
提示: 在geo_shape中,點(diǎn)作為一種特殊的形狀,geo_shape可以存儲(chǔ)一個(gè)點(diǎn)。
1.定義geo_shape類型映射
只要將字段類型定義為geo_shape即可。
PUT /example
{
"mappings": {
"properties": {
"location": {
"type": "geo_shape" // 定義location字段類型為geo_shape
}
}
}
}
2.存儲(chǔ)一個(gè)點(diǎn)
例子:
POST /example/_doc
{
"location" : {
"type" : "point", // 存儲(chǔ)的圖形類型為:point,表示存儲(chǔ)一個(gè)坐標(biāo)點(diǎn)
"coordinates" : [-77.03653, 38.897676] // 坐標(biāo)點(diǎn)格式: [經(jīng)度, 緯度]
}
}
3.存儲(chǔ)一個(gè)圓形
POST /example/_doc
{
"location" : {
"type" : "circle", // 存儲(chǔ)的圖形類型為: circle, 表示一個(gè)圓形
"coordinates" : [101.0, 1.0], // 圓心坐標(biāo),格式: [經(jīng)度, 緯度]
"radius" : "100m" // 圓的半徑,常用單位: m (米), km (千米)
}
}
4.存儲(chǔ)一個(gè)矩形
POST /example/_doc
{
"location" : {
"type" : "envelope", // 存儲(chǔ)的圖形類型為: envelope, 表示一個(gè)矩形
"coordinates" : [
[100.0, 1.0], // 矩形左上角坐標(biāo), 坐標(biāo)格式: [經(jīng)度, 緯度]
[101.0, 0.0] // 矩形右下角坐標(biāo)
]
}
}
5.存儲(chǔ)一個(gè)多邊形
POST /example/_doc
{
"location": {
"type": "polygon", // 存儲(chǔ)的圖形類型為: polygon,表示一個(gè)多邊形
"coordinates": [ // 支持多個(gè)多邊形
[ // 第一個(gè)多邊形,多邊形由下面的坐標(biāo)數(shù)組組成。
[100, 0], // 第一個(gè)坐標(biāo)點(diǎn),坐標(biāo)格式: [經(jīng)度, 緯度]
[101, 0],
[101, 1],
[100, 1],
[100, 0] // 最后一個(gè)坐標(biāo)點(diǎn),要跟第一個(gè)坐標(biāo)點(diǎn)相同,這樣多邊形才能形成閉合
]
]
}
}
例子中提到,支持存儲(chǔ)多個(gè)多邊形數(shù)據(jù),如果保存多個(gè)多邊形,則第一個(gè)多邊形表示外輪廓,第二個(gè)多邊形表示內(nèi)輪廓,這樣內(nèi)外多邊形輪廓就組成一個(gè)空洞的圖形,相當(dāng)于,在多邊形中間挖了個(gè)坑。