首页 >数据库 >mysql教程 >拓展mysqlspatial函数_MySQL

拓展mysqlspatial函数_MySQL

WBOY
WBOY原创
2016-06-01 13:32:381742浏览

bitsCN.com

拓展mysqlspatial函数

 

1)  空间中的点是否相等

 

[delphi] 

DELIMITER $$  

   

CREATE DEFINER = 'smart'@'localhost'  

FUNCTION ArePointsEqual(p1 POINT,  

                        p2POINT  

                        )  

RETURNS TINYINT(1)  

DETERMINISTIC  

NO SQL  

BEGIN  

  RETURN IsZero(x(p1) -x(p2)) AND IsZero(y(p1) - y(p2));  

END  

$$  

   

DELIMITER ;  

 

2)  查找区域的中心点

 

[sql] 

USE smartu;  

   

DELIMITER $$  

   

CREATE DEFINER = 'smart'@'localhost'  

FUNCTION GetCenterPoint(g GEOMETRY)  

RETURNS POINT  

DETERMINISTIC  

NO SQL  

BEGIN  

  DECLARE envelope  POLYGON;  

  DECLARE sw, ne    POINT; #South-West and North-East points  

  DECLARE lat, lng  DOUBLE;  

   

  SET envelope =exteriorring(Envelope(g));  

  SET sw =pointn(envelope, 1);  

  SET ne =pointn(envelope, 3);  

  SET lat = x(sw) + (x(ne)- x(sw)) / 2;  

  SET lng = y(sw) + (y(ne)- y(sw)) / 2;  

  RETURN POINT(lat, lng);  

END  

$$  

   

DELIMITER ;  

3)  LineN

 

[sql] 

USE smartu;  

   

DELIMITER $$  

   

CREATE DEFINER = 'smart'@'localhost'  

FUNCTION LineN(ls LINESTRING,  

               n  INT  

               )  

RETURNS LINESTRING  

DETERMINISTIC  

NO SQL  

BEGIN  

  IF n >= numpoints(ls)THEN  

    RETURN NULL;  

  END IF;  

  RETURNLineString(pointn(ls, n), pointn(ls, n + 1));  

END  

$$  

   

DELIMITER ;  

4)  计算两点间的空间距离

 

[sql] 

USE smartu;  

   

DELIMITER $$  

   

CREATE DEFINER = 'smart'@'localhost'  

FUNCTION DISTANCE(lat1 DOUBLE,  

                  lon1DOUBLE,  

                  lat2DOUBLE,  

                  lon2DOUBLE  

                  )  

RETURNS DOUBLE  

DETERMINISTIC  

NO SQL  

COMMENT 'counts distance (km) between 2 points on Earth surface'  

BEGIN  

  DECLARE dtor DOUBLEDEFAULT 57.295800;  

   

  RETURN (6371 *acos(sin(lat1 / dtor) * sin(lat2 / dtor) +  

  cos(lat1 / dtor) *cos(lat2 / dtor) *  

  cos(lon2 / dtor - lon1 /dtor)));  

END  

$$  

   

DELIMITER ;  

5)  是否为0

 

[sql] 

USE smartu;  

   

DELIMITER $$  

   

CREATE DEFINER = 'smart'@'localhost'  

FUNCTION IsZero(n DOUBLE)  

RETURNS TINYINT(1)  

DETERMINISTIC  

NO SQL  

BEGIN  

  DECLARE epsilon DOUBLEDEFAULT 0.00000000001;  

   

  RETURN (abs(n)

END  

$$  

   

DELIMITER ;  

2.  项目前台、后台的实现

 

1)  项目后台实现

 

l  数据库设计

 

[sql] 

--创建表  

createtable smart_u_convenience_item_spatial(  

    item_spatial_id varchar(36) not null,  

    location point not null,  

    latitude varchar(20),  

    longitude varchar(20),  

    convenience_item_code varchar(500),  

    convenience_item_name varchar(500),  

    primary key (`item_spatial_id`),  

    spatial key `sp_index`(location)  

)ENGINE=MyISAM;  

--往表中插入数据  

INSERTINTO smart_u_convenience_item_spatial  

SELECTt.convenience_item_id  

     , PointFromText(concat('POINT(',t.item_latitude, ' ', t.item_longitude, ')'))  

     , t.item_latitude  

     , t.item_longitude  

     , t.convenience_item_code  

     , t.convenience_item_name  

   from smart_u_convenience_item t;  

l  后台代码使用到的查询点的sql

 

[sql] 

SELECT *  

FROM  

  (SELECT *  

   FROM  

    smart_u_convenience_item t  

   WHERE  

     t.convenience_item_idIN  

    (SELECTs.item_spatial_id  

       FROM  

        smart_u_convenience_item_spatial s  

       WHERE  

        intersects(location,  

                   geomfromtext(concat('POLYGON((', 3.9921123E7, ' ', 1.16365462E8,  

                                                ',', 3.9921123E7, ' ', 1.16441881E8,  

                                               ',', 3.9879484E7, ' ', 1.16441881E8,  

                                               ',', 3.9879484E7, ' ', 1.16365462E8,  

                                                 ',', 3.9921123E7, ' ', 1.16365462E8,'))'))))) t  

ORDER BY  

 item_longitude ASC  
 

bitsCN.com
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn