您当前的位置: 首页 > 

xiangzhihong8

暂无认证

  • 1浏览

    0关注

    1324博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

百度地图之收索视野内的建筑物

xiangzhihong8 发布时间:2014-02-17 10:00:06 ,浏览量:1

根据用户移动地图的位置,显示在视野范围内的建筑物,简单的思路是,添加地图监听,当地图移动结束之后,计算出当前屏幕四个角的GeoPoint,根据这4个点,通过mysql的spatial中的函数,完成在此范围内的建筑物的查询。

1.   mysql spatial介绍

  从MySQL4.0开始加入了Spatial扩展功能,实现了OpenGIS规定的几何数据类型,在SQL中的简单空间运算。但是MySQL对空间查询的支持不够完善,要进行复杂的空间运算,建议使用postgreSQL数据库的postGIS。

    下图是MySQL Spatial接口及类的结构(有背景颜色的框代表接口):

    有关mysql的详细介绍,可以参考一下链接中的文章。

l  官方参考文档(中文):

http://dev.mysql.com/doc/refman/5.1/zh/spatial-extensions-in-mysql.html#mysql-spatial-datatypes

l  官方参考文档(英文):

http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html

l  关于hibernate支持mysql-spatial:

http://blog.csdn.net/b10090120/article/details/8698787

http://www.hibernatespatial.org/tutorial.html

拓展mysqlspatial函数:

1)  空间中的点是否相等

[delphi] view plain copy
  1. DELIMITER $$  
  2.    
  3. CREATE DEFINER = 'smart'@'localhost'  
  4. FUNCTION ArePointsEqual(p1 POINT,  
  5.                         p2POINT  
  6.                         )  
  7. RETURNS TINYINT(1)  
  8. DETERMINISTIC  
  9. NO SQL  
  10. BEGIN  
  11.   RETURN IsZero(x(p1) -x(p2)) AND IsZero(y(p1) - y(p2));  
  12. END  
  13. $$  
  14.    
  15. DELIMITER ;  

2)  查找区域的中心点

[sql] view plain copy
  1. USE smartu;  
  2.    
  3. DELIMITER $$  
  4.    
  5. CREATE DEFINER = 'smart'@'localhost'  
  6. FUNCTION GetCenterPoint(g GEOMETRY)  
  7. RETURNS POINT  
  8. DETERMINISTIC  
  9. NO SQL  
  10. BEGIN  
  11.   DECLARE envelope  POLYGON;  
  12.   DECLARE sw, ne    POINT; #South-West and North-East points  
  13.   DECLARE lat, lng  DOUBLE;  
  14.    
  15.   SET envelope =exteriorring(Envelope(g));  
  16.   SET sw =pointn(envelope, 1);  
  17.   SET ne =pointn(envelope, 3);  
  18.   SET lat = x(sw) + (x(ne)- x(sw)) / 2;  
  19.   SET lng = y(sw) + (y(ne)- y(sw)) / 2;  
  20.   RETURN POINT(lat, lng);  
  21. END  
  22. $$  
  23.    
  24. DELIMITER ;  

3)  LineN

[sql] view plain copy
  1. USE smartu;  
  2.    
  3. DELIMITER $$  
  4.    
  5. CREATE DEFINER = 'smart'@'localhost'  
  6. FUNCTION LineN(ls LINESTRING,  
  7.                n  INT  
  8.                )  
  9. RETURNS LINESTRING  
  10. DETERMINISTIC  
  11. NO SQL  
  12. BEGIN  
  13.   IF n >= numpoints(ls)THEN  
  14.     RETURN NULL;  
  15.   END IF;  
  16.   RETURNLineString(pointn(ls, n), pointn(ls, n + 1));  
  17. END  
  18. $$  
  19.    
  20. DELIMITER ;  

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

[sql] view plain copy
  1. USE smartu;  
  2.    
  3. DELIMITER $$  
  4.    
  5. CREATE DEFINER = 'smart'@'localhost'  
  6. FUNCTION DISTANCE(lat1 DOUBLE,  
  7.                   lon1DOUBLE,  
  8.                   lat2DOUBLE,  
  9.                   lon2DOUBLE  
  10.                   )  
  11. RETURNS DOUBLE  
  12. DETERMINISTIC  
  13. NO SQL  
  14. COMMENT 'counts distance (km) between 2 points on Earth surface'  
  15. BEGIN  
  16.   DECLARE dtor DOUBLEDEFAULT 57.295800;  
  17.    
  18.   RETURN (6371 *acos(sin(lat1 / dtor) * sin(lat2 / dtor) +  
  19.   cos(lat1 / dtor) *cos(lat2 / dtor) *  
  20.   cos(lon2 / dtor - lon1 /dtor)));  
  21. END  
  22. $$  
  23.    
  24. DELIMITER ;  

5)  是否为0

[sql] view plain copy
  1. USE smartu;  
  2.    
  3. DELIMITER $$  
  4.    
  5. CREATE DEFINER = 'smart'@'localhost'  
  6. FUNCTION IsZero(n DOUBLE)  
  7. RETURNS TINYINT(1)  
  8. DETERMINISTIC  
  9. NO SQL  
  10. BEGIN  
  11.   DECLARE epsilon DOUBLEDEFAULT 0.00000000001;  
  12.    
  13.   RETURN (abs(n) 
关注
打赏
1482932726
查看更多评论
立即登录/注册

微信扫码登录

0.1042s