1、POI存储过程查询

服务器类型:PostgreSQL

function name 函数名字 address_parse_no_save(lon float8, lat float8)

DECLARE

  METER_PER_DEGRESS float8;
PROJ4326 int;
user_point RECORD;--存储用户输入坐标转换为wkb格式的点记录
addr_table_num float8;
county RECORD;--存储区县地址的记录
road_sql_str varchar;
road_dist float8;
road_name varchar;
poi_sql_str varchar;
poi_dist float8;
poi_name varchar;
poi_angle varchar :='';
poi_x float8;
poi_y float8;
x float8;
y float8;
angle float8; BEGIN
METER_PER_DEGRESS := 111194.872221777;
PROJ4326 := ;
--地点
SELECT INTO user_point geomfromtext('POINT(' || lon ||' ' || lat ||')',PROJ4326) AS point,substr(st_geohash(geomfromtext('POINT(' || lon ||' ' || lat ||')',PROJ4326),),,)||'%' AS geohash7,substr(st_geohash(geomfromtext('POINT(' || lon ||' ' || lat ||')',PROJ4326),),,)||'%' AS geohash9,st_geohash(geomfromtext('POINT(' || lon ||' ' || lat ||')',PROJ4326),) geohash24 FROM (SELECT ) m1;
--省 区县
SELECT INTO county *,substr(split_part(m1.addr, ' ', ),,) province FROM addr_county m1 WHERE st_contains(m1.the_geom, user_point.point) LIMIT ; --地址解析
IF county.addr IS NULL THEN
RETURN '';-- 没有找到区县返回空字符串
ELSE
BEGIN --查找已解析的结果集,存在则返回结果。
IF county.province='浙江' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='云南' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='新疆' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='香港' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='西藏' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='台湾' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='四川' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='陕西' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='山西' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='山东' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='青海' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='宁夏' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='内蒙' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='辽宁' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='江西' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='吉林' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='湖南' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='湖北' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='黑龙' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='河南' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='北京' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='天津' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='河北' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='海南' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='贵州' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='广西' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='甘肃' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='福建' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='澳门' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='安徽' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='上海' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='重庆' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='江苏' THEN
BEGIN
addr_table_num:=;
END;
ELSEIF county.province='广东' THEN
BEGIN
addr_table_num:=;
END; END IF; road_sql_str := 'SELECT st_distance(geomfromtext(''POINT('|| lon ||' ' || lat ||')'','|| PROJ4326 ||'), m1.the_geom)*'||METER_PER_DEGRESS||' dist,m1."name" FROM addr_road_'||addr_table_num||' m1 WHERE m1.geohash like '''||user_point.geohash7||''' AND st_distance(geomfromtext(''POINT('|| lon ||' ' || lat ||')'','|| PROJ4326 ||'), m1.the_geom)*'||METER_PER_DEGRESS||'<=2000 ORDER BY st_distance(geomfromtext(''POINT('|| lon ||' ' || lat ||')'','|| PROJ4326 ||'), m1.the_geom)*'||METER_PER_DEGRESS||' LIMIT 1;';
EXECUTE road_sql_str INTO road_dist,road_name ; IF road_name IS NULL THEN
BEGIN
RETURN county.addr;
END;
ELSE
BEGIN
poi_sql_str := 'SELECT st_distance(geomfromtext(''POINT('|| lon ||' ' || lat ||')'','|| PROJ4326 ||'), m1.the_geom)*'||METER_PER_DEGRESS||' dist,m1."name",st_x( m1.the_geom) poi_x,st_y( m1.the_geom) poi_y FROM addr_poi_'||addr_table_num||' m1 WHERE m1.geohash like '''||user_point.geohash7||''' AND st_distance(geomfromtext(''POINT('|| lon ||' ' || lat ||')'','|| PROJ4326 ||'), m1.the_geom)*'||METER_PER_DEGRESS||'<=2000 ORDER BY st_distance(geomfromtext(''POINT('|| lon ||' ' || lat ||')'','|| PROJ4326 ||'), m1.the_geom)*'||METER_PER_DEGRESS||' LIMIT 1;';
EXECUTE poi_sql_str INTO poi_dist,poi_name,poi_x,poi_y ; IF poi_name IS NULL THEN
BEGIN
RETURN county.addr ||' '||road_name ||'(附近' || "floor"(road_dist) || '米)';
END;
ELSE
BEGIN x:=poi_x-lon;
y:=poi_y-lat;
IF x= THEN
x:=0.000001;
END IF;
angle:="floor"(atan((y)/(x))*/pi()); IF x> AND y> THEN
BEGIN
IF angle>= AND angle<= THEN
poi_angle:='西';
ELSEIF angle>= AND angle<= THEN
poi_angle:='西南';
ELSEIF angle>= AND angle<= THEN
poi_angle:='南';
END IF;
END;
ELSEIF x< AND y> THEN
BEGIN
IF angle<= AND angle>=- THEN
poi_angle:='东';
ELSEIF angle<=- AND angle>=- THEN
poi_angle:='东南';
ELSEIF angle<=- AND angle>=- THEN
poi_angle:='南';
END IF;
END;
ELSEIF x< AND y< THEN
BEGIN
IF angle>= AND angle<= THEN
poi_angle:='东';
ELSEIF angle>= AND angle<= THEN
poi_angle:='东北';
ELSEIF angle>= AND angle<= THEN
poi_angle:='北';
END IF;
END;
ELSEIF x> AND y< THEN
BEGIN
IF angle<= AND angle>=- THEN
poi_angle:='西';
ELSEIF angle<=- AND angle>=- THEN
poi_angle:='西北';
ELSEIF angle<=- AND angle>=- THEN
poi_angle:='北';
END IF;
END;
END IF;
RETURN county.addr ||' '|| road_name || '(附近' || "floor"(road_dist) || '米)' ||' '|| poi_name || '('||poi_angle||'方' || "floor"(poi_dist) || '米)';
END;
END IF;
END;
END IF; END;
END IF;
-- 没有找到任何数据,返回空字符串
RETURN '';
END;

2、POI存储过程理解

-- 调用function:-----------------

-- query-- SELECT kwt_address_parse_no_save('103.783432', '30.77454534');
-- reslt-- 四川省 成都市 生态大道(附近278米) 五福桥[村庄](西南方399米)

------------------------------------------------实现方案-------------------------------------------------
1、实际需求:根据一个经纬度解析出一个与物理世界对应的一个字符串地址描述。
2、实施方案:对经纬度禁行范围检索,逐级缩小搜索范围,从而更加精确地锁定目标地址。

实现步骤:
(1)对地址的详细程度做出分层级的定义,即依次定义:省,市,县,辖区,街道,路,门牌号,兴趣点,兴趣点距离,方向等
(2)确定传入参数的个数2,即:经度(longitude),纬度(latitude)
(3)首先获取一个经纬度在数据库中粗粒度的地址信息
(4)然后在对应的地址中去找省区县,如果没找到返回" "地址,否则继续下一步
(5)验证已解析的结果集,存在则返回结果{
1)、逐级比较:省,市,县,辖区,街道,路,门牌号,兴趣点
2)、检索兴趣点的时候解析经纬度与最近的道路和兴趣点进行匹配,通过经纬度算出方向和距离
3)、拼接查询出来的层级定义的变量,并返回字符串组合
}。
3、涉及算法:
(1)、经纬度距离计算:

public static class Distance{

private static String unit; //距离单位

private static double distance;//距离大小
/**
*@param utype:距离单位:"m"/"km"
*@param latlng1 经纬度
*@param latlng2 经纬度
*/
public double getDistance(String utype,String latlng1,String latlng2) {
String []latlng_1=latlng1.split(",");
String []latlng_2=latlng2.split(",");
double lata=Double.parseDouble(latlng_1[0]);
double lnga=Double.parseDouble(latlng_1[1]);
double latb=Double.parseDouble(latlng_2[0]);
double lngb=Double.parseDouble(latlng_2[1]);
double distance= 111119*Math.sqrt(Math.pow(lnga - lngb, 2) +Math.pow(lata - latb, 2));
String num=distance+"";
distance =Double.parseDouble(num);
if("km".equals(utype)){
distance=Math.round(distance*100)/100000;
}else{
distance=Math.round(distance*100)/100;
}
unit = utype;
} }

(2)、经纬度角度计算:

atan=(p1.y-p2.y)/(p2.x-p1.x))*180/Math.PI

poI地址纠偏查询存储过程理解的更多相关文章

  1. SQLServer分页查询存储过程

    项目中用到的SQLServer分页查询存储过程. [存储过程] create PROCEDURE prcPageResult -- 获得某一页的数据 -- @currPage int = 1,     ...

  2. MySQL 存储过程理解

    /********************************************************************************* * MySQL 存储过程理解 * ...

  3. MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称

    MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称   INFORMATION_SCHEMA.TABLES INFORMATION_SCHEMA. ...

  4. MSSQL·查询存储过程中的关键字

    阅文时长 | 0.22分钟 字数统计 | 408字符 主要内容 | 1.引言&背景 2.声明与参考资料 『MSSQL·查询存储过程中的关键字』 编写人 | SCscHero 编写时间 | 20 ...

  5. 大数据学习day20-----spark03-----RDD编程实战案例(1 计算订单分类成交金额,2 将订单信息关联分类信息,并将这些数据存入Hbase中,3 使用Spark读取日志文件,根据Ip地址,查询地址对应的位置信息

    1 RDD编程实战案例一 数据样例 字段说明: 其中cid中1代表手机,2代表家具,3代表服装 1.1 计算订单分类成交金额 需求:在给定的订单数据,根据订单的分类ID进行聚合,然后管理订单分类名称, ...

  6. sqlserver2008 数据库中查询存储过程的的创建修改和执行时间,以及比较常见的系统视图和存储过程

    因为各种原因数据库中存在大量无用的存储过程,想查询存储过程的最后执行情况,处理长期不使用的存储过程 下面这条语句可以查询存储过程创建 修改和执行的最后时间: SELECT a.name AS 存储过程 ...

  7. T-SQL查询进阶--理解SQL Server中索引的概念,原理

    简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,sql server仍然可以实现应有的功能,但索引可以在大多数情况下提升查询性能,在OLAP(On line Trans ...

  8. 【原创】SQL分页查询存储过程

    ------------------------------------- -----作者:张欣宇 -----时间:2013-06-28 -----简介:根据参数和条件分页查询 ----------- ...

  9. 【转】T-SQL查询进阶—理解SQL Server中的锁

      简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于大多数数据库来说是需要同时处理多个查 ...

随机推荐

  1. Spring Task Scheduler - No qualifying bean of type [org.springframework.scheduling.TaskScheduler] is defined

    1. Overview In this article, we are discussing the Springorg.springframework.beans.factory.NoSuchBea ...

  2. 转:基础总结篇之一:Activity生命周期

    熟悉javaEE的朋友们都了解servlet技术,我们想要实现一个自己的servlet,需要继承相应的基类,重写它的方法,这些方法会在合适的时间被servlet容器调用.其实android中的Acti ...

  3. python定时器爬取豆瓣音乐Top榜歌名

    python定时器爬取豆瓣音乐Top榜歌名 作者:vpoet mail:vpoet_sir@163.com 注:这些小demo都是前段时间为了学python写的,现在贴出来纯粹是为了和大家分享一下 # ...

  4. ZOJ-3410Layton's Escape(优先队列+贪心)

    Layton's Escape Time Limit: 2 Seconds      Memory Limit: 65536 KB Professor Layton is a renowned arc ...

  5. poj1001(高精度)

                                                               Exponentiation Time Limit: 500MS   Memory ...

  6. Impala 5、Impala 性能优化

    • 执行计划 – 查询sql执行之前,先对该sql做一个分析,列出需要完成这一项查询的详细方案 – 命令:explain sql.profile 要点: • 1.SQL优化,使用之前调用执行计划 • ...

  7. Xshell不能连接SSH的解决

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 重新启动看看:/etc/init.d/ssh restart (/etc/ini ...

  8. Ffmpeg和SDL创建线程(转)

    Spawning Threads Overview Last time we added audio support by taking advantage of SDL's audio functi ...

  9. 【git学习二】git基础之git管理本地项目

    1.背景        git基础打算分两部分来说,一部分是对于本地项目的管理,第二部分是对于远程代码仓库的操作. git运行本地项目管理包含对于相关文件的追踪,暂存区的比較分析,提交,撤销等功能. ...

  10. Linux常见目录作用

    Linux中一切皆文件 文件类型: 一般文件 - 目录文件 d 链接文件 l 块设备   b    (以块为单位进行操作,比如硬盘) 字符设备 c  (以字符为单位进行操作,比如主存) socket  ...