您好,登錄后才能下訂單哦!
不知道大家之前對類似Mysql空間如何搜GeoHash的文章有無了解,今天我在這里給大家再簡單的講講。感興趣的話就一起來看看正文部分吧,相信看完Mysql空間如何搜GeoHash你一定會有所收獲的。
應用場景介紹:
公司新業務的需求,希望能夠實現當前位置快速顯示共享信息數據,針對5.7新特性的支持度調研,利用GeoHash封裝成內置數據庫函數的簡易方案,實現前期的初期業務。
實現過程:
1、構建表
CREATE TABLE `tongzhou` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`cname` VARCHAR(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`oint` POINT NOT NULL,
PRIMARY KEY (`id`),
SPATIAL KEY `sp_index` (`oint`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
2、構造簡單數據
insert into `tongzhou` (`cname`, oint) values('景欣園',GEOMFROMTEXT('POINT(39.8885917679 116.6576038966)'));
insert into `tongzhou` (`cname`, oint) values('京通羅斯福廣場',GEOMFROMTEXT('POINT(39.8890214887 116.6473661241)'));
insert into `tongzhou` (`cname`, oint) values('中國北京市北京市通州區',GEOMFROMTEXT('POINT(39.8898670523 116.6566729546)'));
insert into `tongzhou` (`cname`, oint) values('中國北京市北京市通州區',GEOMFROMTEXT('POINT(39.8883852752 116.655728817)'));
insert into `tongzhou` (`cname`, oint) values('楊莊路22號院',GEOMFROMTEXT('POINT(39.8984936518 116.6339063644)'));
insert into `tongzhou` (`cname`, oint) values('中國北京市北京市朝陽區 ',GEOMFROMTEXT('POINT(39.8975388526 116.613779068)'));
insert into `tongzhou` (`cname`, oint) values('北京市朝陽區第三醫院 約31米',GEOMFROMTEXT('POINT(39.8873809413 116.603307724)'));
insert into `tongzhou` (`cname`, oint) values('雙橋溫泉北里小區',GEOMFROMTEXT('POINT(39.8918427053 116.6076636314)'));
insert into `tongzhou` (`cname`, oint) values('京客隆配送中心',GEOMFROMTEXT('POINT(39.8916616061 116.5908622742)'));
insert into `tongzhou` (`cname`, oint) values('世紀賓館',GEOMFROMTEXT('POINT(39.8918591688 116.6024065018)'));
insert into `tongzhou` (`cname`, oint) values('雙橋六號井小區-北區 約48米',GEOMFROMTEXT('POINT(39.8899164443 116.6050457954)'));
insert into `tongzhou` (`cname`, oint) values('翠屏里小區 約190米',GEOMFROMTEXT('POINT(39.8883194176 116.6495060921)'));
insert into `tongzhou` (`cname`, oint) values('京通羅斯福廣場',GEOMFROMTEXT('POINT(39.8894719148 116.6584646702)'));
insert into `tongzhou` (`cname`, oint) values('life新生活廣場 約87米',GEOMFROMTEXT('POINT(39.8895542353 116.65579319)'));
insert into `tongzhou` (`cname`, oint) values('life新生活廣場 約74米',GEOMFROMTEXT('POINT(39.8896242077 116.6568982601)'));
insert into `tongzhou` (`cname`, oint) values('life新生活廣場',GEOMFROMTEXT('POINT(39.8901428239 116.6564154625)'));
insert into `tongzhou` (`cname`, oint) values('漫春園',GEOMFROMTEXT('POINT(39.8913364496 116.658115983)'));
insert into `tongzhou` (`cname`, oint) values('7天連鎖酒店(北京通州果園環島店) 約58米',GEOMFROMTEXT('POINT(39.8915998677 116.6560935974)'));
insert into `tongzhou` (`cname`, oint) values('北京金松賓館 約77米',GEOMFROMTEXT('POINT(39.9036172391 116.6577833891)'));
insert into `tongzhou` (`cname`, oint) values('新華南路小區-東區 約32米',GEOMFROMTEXT('POINT(39.9034444015 116.6588240862)'));
insert into `tongzhou` (`cname`, oint) values('紅旗小區 約61米',GEOMFROMTEXT('POINT(39.9046707164 116.6598540545)'));
insert into `tongzhou` (`cname`, oint) values('祥云天地家園 約62米',GEOMFROMTEXT('POINT(39.9067899674 116.659129858)'));
insert into `tongzhou` (`cname`, oint) values('梨園地鐵站 約40米',GEOMFROMTEXT('POINT(39.8832975966 116.6687965393)'));
3、搜索當前1公里范圍內的位置信息
SET @jl=1; //多少公里范圍內的
SET @jd=118.1964111328;
SET @wd=39.5591182422; //當前的位置信息
oint是實際已經存在的經緯度信息
SELECT *,ASTEXT(oint)FROM tongzhou WHERE MBRCONTAINS( LINESTRING(POINT( @wd + @jl / ( 111.12 / COS(RADIANS(@jd))),
@jd + @jl / 111.12 ),
POINT ( @wd - @jl / ( 111.12 / COS(RADIANS(@jd))),@jd - @jl / 111.12) ), oint)
###經緯弧度(1° latitude = 111.12 kilometers)即 10/111.12,表示查找附近10公里。
4、測試
通過百度地圖獲取一些數據,對
SET @jd=118.1964111328
SET @wd=39.5591182422
值的更新,分析獲取范圍內的景點信息
5、問題:
如果直接在WHERE采用一系列的表達式,這樣會導致無法使用空間索引,如圖所示:
解決辦法:
1、把WHERE后的表達式處理成一個變量進行引用,然后進行周邊搜
SET @aa=(SELECT LINESTRING(POINT( 39.5591182422 + 10/ ( 111.12 / COS(RADIANS(118.1964111328))),
118.1964111328 + 10 / 111.12 ),
POINT ( 39.5591182422 - 10 / ( 111.12 / COS(RADIANS(118.1964111328))),118.1964111328 -10 / 111.12)) AS heji)
2、執行周邊搜
SELECT ASTEXT(oint)FROM tongzhou WHERE MBRWITHIN(@aa,oint)
順帶執行計劃效果:
其他SQL寫法補充:
表示3公里范圍內的點:
DDL:
CREATE TABLE `shop_id` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`lat` double DEFAULT NULL,
`lng` double DEFAULT NULL,
`oint` point NOT NULL,
PRIMARY KEY (`id`),
SPATIAL KEY `sp_index` (`oint`)
) ENGINE=InnoDB AUTO_INCREMENT=275915 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
SELECT id, ST_Distance_Sphere(POINT(-73.951368, 40.716743), oint) AS dist, ST_AsText(oint) FROM shop_id
WHERE ST_Contains( ST_MakeEnvelope( POINT((-73.951368+(3/111)), (40.716743+(3/111))),
POINT((-73.951368-(3/111.12)), (40.716743-(3/111.12))) ), oint )
看完Mysql空間如何搜GeoHash這篇文章,大家覺得怎么樣?如果想要了解更多相關,可以繼續關注我們的行業資訊板塊。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。