Mysql空间如何搜GeoHash
admin
2023-05-13 12:42:08
0

不知道大家之前对类似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采用一系列的表达式,这样会导致无法使用空间索引,如图所示:

Mysql空间如何搜GeoHash

解决办法:
     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)

   顺带执行计划效果:

      Mysql空间如何搜GeoHash

其他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这篇文章,大家觉得怎么样?如果想要了解更多相关,可以继续关注我们的行业资讯板块。    

相关内容

热门资讯

父亲70岁,从癌症手里“抠”时... 作者 | 祖晓谦秦叔特意请儿媳买了两把国光牌口琴,他不仅吹给自己听,也吹给家人听。那是2023年,他...
参加国宴的中国企业家,个个都有... 文 | 陶叔015月14日晚上,人民大会堂金色大厅举行国宴,两国领导人都发表了热情洋溢的讲话。电视画...
能繁母猪调控目标再下调,释放什... 【大河财立方 记者 徐兵】生猪行业新一轮产能调控正式落地。5月14日,农业农村部印发《生猪产能综合调...
赓续仲景千年文脉,南阳以“中医... 【大河财立方 记者 李雯雯】 红墙黛瓦承古韵,药香悠悠润宛城。5月13日,由中国新闻社河南分社、河南...
从国宴菜单一窥中美外交:清淡中... 中国为特朗普访华举行国宴图 路透/Evan Vucci当中美元首周四在北京出席一场盛大国宴时,菜单本...
赖清德公开呛台北没为台湾加分,... 海峡导报综合报道 民进党日前征召民代沈伯洋参选台北市长,党主席赖清德更称,台北市拥有全台最好、最多资...
外交部发言人就伊朗局势答记者问 问:据报道,特朗普总统访华期间,中美两国元首就中东局势等重大国际和地区问题交换了意见。请问双方是否谈...
强势介入调查座车追踪器疑云,检... 海峡导报综合报道 中国国民党副主席李乾龙日前遭媒体爆料,去年11月座车遭安装追踪器和收到恐吓信,事后...
没上专机的库克,提前到了北京 特朗普这次访华代表团的工商界人士中,英伟达创始人兼首席执行官(CEO)黄仁勋是在最后一刻登上了美国总...
女子总遇见“面熟”大姐一查竟是...   64岁的郑招莲说起这话时,语气里藏不住感慨与遗憾:“我经常在街上遇到我的姐姐,只是觉得面熟,但从...