地图 mysql查询符合在圆形,多边形区域经纬度的数据

在处理多边形区域经纬度的数据时,你通常会有一个包含多边形顶点经纬度坐标的列表或集合。这些坐标定义了多边形的边界。

1. sql 查询多变区域的业务场景

在SQL中查询多变区域(如多边形、圆形等)内的数据点,尤其是在处理地理空间数据时,具有非常重要的意义。以下是一些查询多变区域意义的具体体现:

1.1. 空间分析‌:

通过查询位于特定多变区域内的数据点,可以进行空间分析,如人口密度分析、交通流量分析、环境监测等。这有助于理解地理空间数据的分布和模式。

1.2. 地理位置服务‌:

对于基于位置的服务(LBS),如地图应用、定位服务、导航系统等,查询多变区域内的数据点是核心功能之一。例如,查找某个区域内的餐馆、医院、学校等。

1.3. 资源分配与优化‌:

在物流、供应链管理等领域,通过查询多变区域内的资源(如仓库、配送点等),可以优化资源分配和调度,降低成本并提高效率。

1.4. 城市规划与管理‌:

城市规划者可以利用地理空间查询来分析城市内的土地利用、交通网络、公共设施分布等,为城市规划和管理提供决策支持。

1.5. ‌环境保护与灾害管理‌:

在环境保护领域,可以查询特定区域内的生态数据,监测环境变化;在灾害管理领域,可以查询受灾区域内的资源分布和人口情况,为救援和应急响应提供关键信息。

1.6. 商业智能与市场营销‌:

企业可以利用地理空间查询来分析客户分布、市场潜力等,为商业智能和市场营销策略提供数据支持。

1.7. 公共安全与犯罪分析‌:

公共安全机构可以利用地理空间查询来分析犯罪活动的地理分布,识别犯罪热点区域,为治安管理和犯罪预防提供决策依据。

在SQL中实现这些查询通常需要使用地理空间扩展或函数,如mysql的PostGIS扩展,它提供了丰富的地理空间数据类型和函数,使得处理地理空间数据变得高效且易于实现。通过合理地利用这些工具和技术,可以充分挖掘地理空间数据的价值,为各个领域的应用提供有力支持。

2.mysql 查询例子

主要是sql查询符合在圆形,多边形区域经纬度的数据
image-20200923094240216

2.1. 圆形

中心点 + 距离

drop table if exists demo;
CREATE TABLE `demo` (
  `id` int(5) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `shop_name` varchar(50) DEFAULT NULL COMMENT '商品名称',
  `lng` DECIMAL( 11, 8 ) DEFAULT NULL COMMENT '经度',
  `lat` DECIMAL( 10, 8 ) DEFAULT NULL COMMENT '纬度',
  `address` text COMMENT '位置名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='demo';

INSERT INTO `demo` (`id`, `shop_name`, `lng`, `lat`, `address`) VALUES ('4', 'xxx公司', '113.94080600', '22.56090600', '技术大厦');
INSERT INTO `demo` (`id`, `shop_name`, `lng`, `lat`, `address`) VALUES ('5', '科陆电子烟', '113.94154900', '22.56113500', '科陆电子科技大厦');
INSERT INTO `demo` (`id`, `shop_name`, `lng`, `lat`, `address`) VALUES ('6', '酷派信息港', '113.94554300', '22.56051200', '酷派信息港');
INSERT INTO `demo` (`id`, `shop_name`, `lng`, `lat`, `address`) VALUES ('7', '松坪山公园', '113.94728100', '22.55851100', '松坪山公园');
INSERT INTO `demo` (`id`, `shop_name`, `lng`, `lat`, `address`) VALUES ('8', '航天微电机大厦', '113.93847800', '22.56067100', '航天微电机大厦');
INSERT INTO `demo` (`id`, `shop_name`, `lng`, `lat`, `address`) VALUES ('9', '蓝马智造园', '113.93478700', '22.56027400', '蓝马智造园');
INSERT INTO `demo` (`id`, `shop_name`, `lng`, `lat`, `address`) VALUES ('10', '万科智城', '113.94206100', '22.57062800', '万科智城');
INSERT INTO `demo` (`id`, `shop_name`, `lng`, `lat`, `address`) VALUES ('11', '洪浪北', '113.91020200', '22.57442700', '洪浪北');

-- 地球半径:6371
-- distance:距离(公里)
SELECT  
  *,(  
    6378.138 * acos (  
      cos ( radians(21.785367) )  
      * cos( radians( lat ) )  
      * cos( radians( lng ) - radians(118.356734) )  
      + sin ( radians(21.785367) )  
      * sin( radians( lat ) )  
    )  
  ) AS distance  -- 距离      
FROM demo
HAVING distance < 463 -- 筛选距离小于463km的(可不写),如果没查到数据就是没有小于463km的
ORDER BY distance -- 根据距离远近来排序 默认升序 (可不写)
LIMIT 0 , 20;  -- 显示前20条数据(可不写)

eg:
SELECT  
  *,(  
    6378 * acos (  
      cos ( radians(21.785367) )  
      * cos( radians( lat ) )  
      * cos( radians( lng ) - radians(118.356734) )  
      + sin ( radians(21.785367) )  
      * sin( radians( lat ) )  
    )  
  ) AS distance  
FROM demo
HAVING distance < 463 
ORDER BY distance 
LIMIT 0 , 20;  

结果:

image-20200923095137116

2.1. 多边形

DROP TABLE IF EXISTS `geom`;
CREATE TABLE `geom`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `lnglat` varchar(255) NOT NULL COMMENT '经纬度',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = MyISAM CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `geom` VALUES (1, "1,1");
INSERT INTO `geom` VALUES (2, "2,2");
INSERT INTO `geom` VALUES (3, "3,3");
INSERT INTO `geom` VALUES (4, "4,4");
INSERT INTO `geom` VALUES (5, "5,5");
INSERT INTO `geom` VALUES (6, "6,6");


select
	`geom`.id, 
	`geom`.lnglat,
	SUBSTRING_INDEX(`geom`.lnglat,",",1) lng,
	SUBSTRING_INDEX(`geom`.lnglat,",",-1) lat
from 
	geom 
where MBRWithin(ST_GeomFromText(CONCAT( 'POINT(',SUBSTRING_INDEX(`geom`.lnglat,",",1),' ',SUBSTRING_INDEX(`geom`.lnglat,",",-1), ')')),GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'));

-----------------------------------------------------------------------------------------

下面是简写
pt 代表 POINT(1 1)
select AsText(pt) from geom where MBRWithin(pt,GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'));
select AsText(pt) from geom where MBRContains(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'),pt);



结果:

image-20200923095221680

地图 mysql查询符合在圆形,多边形区域经纬度的数据
地图 后端经纬度 点聚合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuhm~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值