在处理多边形区域经纬度的数据时,你通常会有一个包含多边形顶点经纬度坐标的列表或集合。这些坐标定义了多边形的边界。
文章目录
1. sql 查询多变区域的业务场景
在SQL中查询多变区域(如多边形、圆形等)内的数据点,尤其是在处理地理空间数据时,具有非常重要的意义。以下是一些查询多变区域意义的具体体现:
1.1. 空间分析:
通过查询位于特定多变区域内的数据点,可以进行空间分析,如人口密度分析、交通流量分析、环境监测等。这有助于理解地理空间数据的分布和模式。
1.2. 地理位置服务:
对于基于位置的服务(LBS),如地图应用、定位服务、导航系统等,查询多变区域内的数据点是核心功能之一。例如,查找某个区域内的餐馆、医院、学校等。
1.3. 资源分配与优化:
在物流、供应链管理等领域,通过查询多变区域内的资源(如仓库、配送点等),可以优化资源分配和调度,降低成本并提高效率。
1.4. 城市规划与管理:
城市规划者可以利用地理空间查询来分析城市内的土地利用、交通网络、公共设施分布等,为城市规划和管理提供决策支持。
1.5. 环境保护与灾害管理:
在环境保护领域,可以查询特定区域内的生态数据,监测环境变化;在灾害管理领域,可以查询受灾区域内的资源分布和人口情况,为救援和应急响应提供关键信息。
1.6. 商业智能与市场营销:
企业可以利用地理空间查询来分析客户分布、市场潜力等,为商业智能和市场营销策略提供数据支持。
1.7. 公共安全与犯罪分析:
公共安全机构可以利用地理空间查询来分析犯罪活动的地理分布,识别犯罪热点区域,为治安管理和犯罪预防提供决策依据。
在SQL中实现这些查询通常需要使用地理空间扩展或函数,如mysql的PostGIS扩展,它提供了丰富的地理空间数据类型和函数,使得处理地理空间数据变得高效且易于实现。通过合理地利用这些工具和技术,可以充分挖掘地理空间数据的价值,为各个领域的应用提供有力支持。
2.mysql 查询例子
主要是sql查询符合在圆形,多边形区域经纬度的数据
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;
结果:
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);
结果: