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. C# 新特性_协变与逆变 (.net 4.0)

    C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么 ...

  2. 文档生成工具doxygen+图像生成工具GraphViz

    文档生成工具doxygen+图像生成工具GraphViz 虽然jdk自带的javadoc也很好用,不过使用doxygen+GraphViz 的组合可以生成许多强大的图(类图.协作图.文件包含/被包含图 ...

  3. 【转】Android LCD(三):Samsung LCD接口篇

    关键词:android LCD控制器 Framebuffer PWM  平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:samsung exynos ...

  4. Codeforces 474D Flowers dp(水

    题目链接:点击打开链接 思路: 给定T k表示T组測试数据 每组case [l,r] 有2种物品a b.b物品必须k个连续出现 问摆成一排后物品长度在[l,r]之间的方法数 思路: dp[i] = d ...

  5. u3d shader使用

    先建立一个材质球Material 选择shader 把材质球Material 赋给图片

  6. 修改linux共享内存大小

    这是实际linux系统显示的实际数据: beijibing@bjb-desktop:/proc/sys/kernel$ cat shmmax  33554432 beijibing@bjb-deskt ...

  7. yum 安装软件提示错误

    试用yum命令装软件时,遇到了下面的问题,错误提示: rpmdb: unable to join the environment error: db4 error(11) from dbenv-> ...

  8. 影响布局的inline-block的空白符的问题

    昨天切页面时,进行布局时,想改变以下方法换换口味,所以就抛弃了float方法,采用了display:inline-block方法,没想到却随之而来的带来了一个想不通的问题,那就是空白.废话不多说,上代 ...

  9. 调用打印机Demo

      接口 PrintService 是 DocPrintJob 的工厂.PrintService 描述了打印机的功能,并可查询它来了解打印机支持的属性. Java代码   import java.io ...

  10. android开发工具类总结(一)

    一.日志工具类 Log.java public class L { private L() { /* 不可被实例化 */ throw new UnsupportedOperationException ...