日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

基于TairGIS實(shí)現(xiàn)同城購(gòu)業(yè)務(wù)

更新時(shí)間:

本文介紹通過(guò)Tair(企業(yè)版)的GIS結(jié)構(gòu),實(shí)現(xiàn)同城購(gòu)業(yè)務(wù)。

背景說(shuō)明

隨著同城購(gòu)業(yè)務(wù)的興起,品牌商家在其眾多門(mén)店中判斷出距離消費(fèi)者最近門(mén)店的場(chǎng)景越來(lái)越流行。

商家通常會(huì)對(duì)每一個(gè)門(mén)店設(shè)置可銷(xiāo)售的范圍,可能是以行政區(qū)劃分,也可能是不規(guī)則形狀的區(qū)域,或按照半徑圈選。如果消費(fèi)者坐標(biāo)在銷(xiāo)售范圍內(nèi),就認(rèn)為該門(mén)店可以對(duì)該消費(fèi)者進(jìn)行銷(xiāo)售,否則,則不可銷(xiāo)售。此模型為:判斷點(diǎn)(消費(fèi)者)和多邊形(門(mén)店銷(xiāo)售范圍)是否為包含關(guān)系。

同城購(gòu)..jpeg

該方案的傳統(tǒng)架構(gòu)通常使用MySQL或PostGIS數(shù)據(jù)庫(kù),雖然其對(duì)GIS相關(guān)能力有專(zhuān)業(yè)的支持,API也比較完備,但是由于MySQL或PostGis數(shù)據(jù)庫(kù)本身磁盤(pán)存儲(chǔ)的特性,查詢(xún)速度較慢,特別是在數(shù)據(jù)量較大的場(chǎng)景下,會(huì)產(chǎn)生多次磁盤(pán)讀IO,容易導(dǎo)致業(yè)務(wù)查詢(xún)超時(shí)。

您可以使用TairGIS能力構(gòu)建新一代判店系統(tǒng),TairGIS底層使用RTree結(jié)構(gòu),支持常見(jiàn)的Contains、Within、Intersects等關(guān)系判斷,可以在毫秒(ms)級(jí)別返回查詢(xún)結(jié)果。更多信息請(qǐng)參見(jiàn)GIS

方案概述

  1. 將某品牌旗下各門(mén)店的銷(xiāo)售范圍存入GIS中。

  2. 根據(jù)消費(fèi)者GPS坐標(biāo),查詢(xún)可進(jìn)行銷(xiāo)售服務(wù)的門(mén)店。

代碼示例

本示例的Python版本為3.8,且已安裝Tair-py依賴(lài),Tair-py的快捷安裝命令為:pip3 install tair

# -*- coding: utf-8 -*-
# !/usr/bin/env python
from typing import Dict
from tair import Tair
from tair import ResponseError


def get_tair() -> Tair:
    """
    該方法用于連接Tair實(shí)例。
    * host:Tair實(shí)例連接地址。
    * port:Tair實(shí)例的端口號(hào),默認(rèn)為6379。
    * password:Tair實(shí)例的密碼(默認(rèn)賬號(hào))。若通過(guò)自定義賬號(hào)連接,則密碼格式為“username:password”。
    """
    tair: Tair = Tair(
        host="r-8vb************.redis.zhangbei.rds.aliyuncs.com",
        port=6379,
        db=0,
        password="D******23",
        decode_responses=True
    )
    return tair


def add_brand_store(brandID: str, mapping: Dict[str, str]) -> bool:
    """
    該方法為通過(guò)GIS.ADD命令,將品牌(brandID)下的各門(mén)店(storeID)與其銷(xiāo)售范圍(store_wkt)存入GIS中。
    """
    try:
        tair = get_tair()
        ret = tair.gis_add(brandID, mapping)
        return ret == 1
    except ResponseError as e:
        print(e)
        return False


def get_brand_all(brandID):
    """
    該方法為通過(guò)GIS.GETALL命令,獲取某品牌的全部門(mén)店及其對(duì)應(yīng)銷(xiāo)售范圍。
    """
    try:
        tair = get_tair()
        return tair.gis_getall(brandID)
    except:
        return None


def get_service_store(brandID: str, user_location: str):
    """
    根據(jù)消費(fèi)者坐標(biāo)(user_location),查詢(xún)可進(jìn)行銷(xiāo)售服務(wù)的門(mén)店。
    """
    try:
        tair = get_tair()
        return tair.gis_contains(brandID, user_location)
    except:
        return None


if __name__ == "__main__":
    tair = get_tair()
    # 添加“brand1”品牌的2家門(mén)店銷(xiāo)售范圍。
    add_brand_store(
        "brand1",
        {
            "store_1": "POLYGON ((120.14772 30.19513, 120.15370 30.17838, 120.19385 30.18011, 120.18853 30.20817))",
            "store_2": "POLYGON ((120.18986 30.20852, 120.19651 30.17988, 120.22512 30.17978, 120.21667 30.22292))"
        },
    )
    print("查詢(xún)“brand1”品牌的所有門(mén)店及銷(xiāo)售范圍:")
    print(get_brand_all('brand1'))
    print("查詢(xún)可對(duì)消費(fèi)者(120.19707 30.19539)進(jìn)行銷(xiāo)售服務(wù)的門(mén)店信息:")
    print(get_service_store('brand1', 'POINT(120.19707 30.19539)'))

本示例的正確執(zhí)行結(jié)果如下:

查詢(xún)“brand1”品牌的所有門(mén)店及銷(xiāo)售范圍:
['store_1', 'POLYGON((120.14772 30.19513,120.1537 30.17838,120.19385 30.18011,120.18853 30.20817))', 'store_2', 'POLYGON((120.18986 30.20852,120.19651 30.17988,120.22512 30.17978,120.21667 30.22292))']
查詢(xún)可對(duì)消費(fèi)者(120.19707 30.19539)進(jìn)行銷(xiāo)售服務(wù)的門(mén)店信息:
[1, ['store_2', 'POLYGON((120.18986 30.20852,120.19651 30.17988,120.22512 30.17978,120.21667 30.22292))']]

結(jié)果說(shuō)明:消費(fèi)者(120.19707 30.19539)的可服務(wù)門(mén)店為store_2

總結(jié)

同城購(gòu)、買(mǎi)菜、本地商超等應(yīng)用均可通過(guò)TairGIS數(shù)據(jù)結(jié)構(gòu),方便地實(shí)現(xiàn)地理相關(guān)的計(jì)算,同時(shí)也能滿足用戶(hù)對(duì)高性能的需求。

相關(guān)文檔