Oracle 哈弗森公式单位错误-PL/SQL

Oracle 哈弗森公式单位错误-PL/SQL,oracle,plsql,geolocation,haversine,Oracle,Plsql,Geolocation,Haversine,总体目标:查找给定邮政编码30英里内的所有邮政编码 数据源:邮政编码列表,纬度和经度为“x”和“y” 例如: create or replace view zips as select 37171 zip, 36.362704 y, -87.30434 x,'Southside' City, 'TN' State from dual union select 37212, 36.133012, -86.802764, 'Nashville', 'TN' from dual union sel

总体目标:查找给定邮政编码30英里内的所有邮政编码

数据源:邮政编码列表,纬度和经度为“x”和“y”

例如:

create or replace view zips as
select 37171 zip, 36.362704 y, -87.30434 x,'Southside' City, 'TN' State from dual 
union
select 37212, 36.133012, -86.802764, 'Nashville', 'TN' from dual 
union
select 37027, 36.00245, -86.791159, 'Brentwood', 'TN' from dual 
union
select 37191, 36.501196, -87.539057, 'Woodlawn', 'TN' from dual 
union
select 37067, 35.928406, -86.805538, 'Franklin', 'TN' from dual ;
我尝试过的内容:我发现一些东西看起来像是要:

然而,它给了我一些古怪的数字——总是太小(我知道从富兰克林到纳什维尔不到1英里),但不是由一个我能确定的常数。(我用来测试的代码如下——我只是将谷歌地图上的距离与这些距离进行了比较)

所以,我认为geodata组可能有一种不同的记录纵横的方法,我发现并将其转化为一个函数

CREATE OR REPLACE FUNCTION distance (Lat1_d IN NUMBER,
                                     Lon1_d IN NUMBER,
                                     Lat2_d IN NUMBER,
                                     Lon2_d IN NUMBER,
                                     Radius IN NUMBER DEFAULT 3959) RETURN NUMBER IS
 -- Convert degrees to radians
 DegToRad NUMBER := .0174532925;
 Lat1 NUMBER := Lat1_d * DegToRad;
 Lon1 NUMBER := Lon1_d * DegToRad;
 Lat2 NUMBER := Lat2_d * DegToRad;
 Lon2 NUMBER := Lon2_d * DegToRad;

BEGIN

  RETURN 2*Radius * 
    asin(
      sqrt(
        power(sin((Lat2-Lat1)/2),2) + cos(Lat1) * cos(Lat2) * power(sin((Lon2-Lon1)/2),2)
      )
    )
        ;
END;
同样的问题-结果几乎完全相同,这让我想知道问题是什么。我没有做什么转变?我错过了什么


请注意,我很乐意假设地球是平的,并使用毕达哥拉斯距离,因为我只会查看我查看的每一组邮政编码的30-50英里,但我需要弄清楚我的纬度/经度转换在哪里也出了问题

看起来像是参数问题。标题为:

CREATE OR REPLACE FUNCTION distance (Lat1 IN NUMBER,
                                     Lon1 IN NUMBER,
                                     Lat2 IN NUMBER,
                                     Lon2 IN NUMBER,
你这样称呼它:

distance(a.x,a.y,b.x,b.y)
但你的观点是:

create or replace view zips as
select 37171 zip, 36.362704 y, -87.30434 x,'Southside' City, 'TN' State from dual 
union
select 37212, 36.133012, -86.802764, 'Nashville', 'TN' from dual 
union
select 37027, 36.00245, -86.791159, 'Brentwood', 'TN' from dual 
union
select 37191, 36.501196, -87.539057, 'Woodlawn', 'TN' from dual 
union
select 37067, 35.928406, -86.805538, 'Franklin', 'TN' from dual ;
根据视图,x是经度,y是纬度。因此,函数调用应该是:

distance(a.y,a.x,b.y,b.x)

或者,您可以交换视图中的“x”和“y”别名,并保持其他所有内容不变。

这是一篇很棒的第一篇文章。右标记、数据示例、代码和数据格式、引用。。。欢迎来到SO!我听说时不时地用手掌拍打你的前额是件好事。把事情搞砸了。谢谢你给我这么做的机会。@Maggie,没问题。我也有同样的感觉,因为多年来忘记分号等,我的头骨上可能有一个凹痕。这是一个关于正派名字价值的重要教训。如果视图列是
longitude
latitude
而不是
x
y
,您可能会立即发现这一点。
create or replace view zips as
select 37171 zip, 36.362704 y, -87.30434 x,'Southside' City, 'TN' State from dual 
union
select 37212, 36.133012, -86.802764, 'Nashville', 'TN' from dual 
union
select 37027, 36.00245, -86.791159, 'Brentwood', 'TN' from dual 
union
select 37191, 36.501196, -87.539057, 'Woodlawn', 'TN' from dual 
union
select 37067, 35.928406, -86.805538, 'Franklin', 'TN' from dual ;
distance(a.y,a.x,b.y,b.x)