根据用户移动地图的位置,显示在视野范围内的建筑物,简单的思路是,添加地图监听,当地图移动结束之后,计算出当前屏幕四个角的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) 空间中的点是否相等
- 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) 查找区域的中心点
- 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
- 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) 计算两点间的空间距离
- 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
- 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)
关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?
立即登录/注册


微信扫码登录