关于在MySQL中查询多边形包含点情况(5.1中可用),5.6可用ST_Contains
2017-09-14 09:44
357 查看
出处:https://dba.stackexchange.com/questions/80022/mysql-mbrcontains-not-accurate
DELIMITER // CREATE FUNCTION GISWithin(pt POINT, mp MULTIPOLYGON) RETURNS INT(1) DETERMINISTIC BEGIN DECLARE str, xy TEXT; DECLARE x, y, p1x, p1y, p2x, p2y, m, xinters DECIMAL(16, 13) DEFAULT 0; DECLARE counter INT DEFAULT 0; DECLARE p, pb, pe INT DEFAULT 0; SELECT MBRWithin(pt, mp) INTO p; IF p != 1 OR ISNULL(p) THEN RETURN p; END IF; SELECT X(pt), Y(pt), ASTEXT(mp) INTO x, y, str; SET str = REPLACE(str, 'POLYGON((',''); SET str = REPLACE(str, '))', ''); SET str = CONCAT(str, ','); SET pb = 1; SET pe = LOCATE(',', str); SET xy = SUBSTRING(str, pb, pe - pb); SET p = INSTR(xy, ' '); SET p1x = SUBSTRING(xy, 1, p - 1); SET p1y = SUBSTRING(xy, p + 1); SET str = CONCAT(str, xy, ','); WHILE pe > 0 DO SET xy = SUBSTRING(str, pb, pe - pb); SET p = INSTR(xy, ' '); SET p2x = SUBSTRING(xy, 1, p - 1); SET p2y = SUBSTRING(xy, p + 1); IF p1y < p2y THEN SET m = p1y; ELSE SET m = p2y; END IF; IF y > m THEN IF p1y > p2y THEN SET m = p1y; ELSE SET m = p2y; END IF; IF y <= m THEN IF p1x > p2x THEN SET m = p1x; ELSE SET m = p2x; END IF; IF x <= m THEN IF p1y != p2y THEN SET xinters = (y - p1y) * (p2x - p1x) / (p2y - p1y) + p1x; END IF; IF p1x = p2x OR x <= xinters THEN SET counter = counter + 1; END IF; END IF; END IF; END IF; SET p1x = p2x; SET p1y = p2y; SET pb = pe + 1; SET pe = LOCATE(',', str, pb); END WHILE; RETURN counter % 2; END; // DELIMITER ; -- usage example: SET @x = -79.12345678901234; SET @y = 43.12345678901234; SET @point = CONCAT('POINT(',@x,' ',@y,')'); SELECT id FROM polygons WHERE GISWithin(GeomFromText(@point), polygon_data);
相关文章推荐
- mysql 5.1与5.6 子查询性能对比
- 关于MYSQL5.6的慢查询
- MySQL 5.6 关于登陆的初始化设置
- 关于mysql inner join 连接查询的优化
- 关于mysql 简单的查询语句 以及常用函数的 总结
- mysql、MS SQL关于分页的sql查询语句 limit 和row_number() OVER函数
- MYSQL笔记(查询优化续2--查询优化限制5.1版本)
- 关于hibernate mysql 布尔值查询妥协解决方案
- MySQL5.0、5.1、5.5、5.6功能进化
- 关于MYSQL 查询缓存
- MySQL5.6优化了派生子查询
- maxscale配合MHA搭建读写分离的高可用架构(基于GTID replication主从架构,mysql5.6)
- centos mysql从5.1升级到5.6
- MySQL5.6基于MHA方式高可用搭建
- mysql5.6改进子查询实测试
- 关于mysql的查询优化
- Dynamics CRM 通过OData查询数据URI中包含中文的情况
- 关于mysql查询结果单位换算后小数位数的保留方式
- mysql 查询两个时间段是否有交集的情况
- MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法