`

根据坐标计算两点距离的Oracle函数

 
阅读更多

CREATE OR REPLACE FUNCTION ITS_KK.GPSDistance(lon1 in FLOAT, lat1 in FLOAT, lon2 in FLOAT,
            lat2 in FLOAT) RETURN FLOAT
AS  v_addr FLOAT;
    a1     FLOAT;
    b      FLOAT;
    f      FLOAT;
    rlat1  FLOAT;
    rlat2  FLOAT;
    L      FLOAT;
    U1     FLOAT;
    U2     FLOAT;
    sinU1  FLOAT;
    cosU1  FLOAT;
    sinU2  FLOAT;
    cosU2  FLOAT;
    lambda FLOAT;
    lambdap FLOAT;
    iterLimit INT;
    sinLambda FLOAT;
    cosLambda FLOAT;
    sinSigma  FLOAT;
    cosSigma  FLOAT;
    Sigma     FLOAT;
    sinAlpha  FLOAT;
    cosSqAlpha FLOAT;
    cos2SigmaM FLOAT;
    c         FLOAT;
   
   
    uSq       FLOAT;
    aA        FLOAT;
    bB        FLOAT;
    deltaSigma FLOAT;
    s         FLOAT;
begin

   a1 := 6378137.0;
   b := 6356752.3142;
   f :=  1 / 298.257223563;
   rlat1 := Rad(lat1);
   rlat2 := Rad(lat2);
   L := Rad(lon2-lon1);
   U1 := atan((1-f)*tan(rlat1));
   U2 := atan((1-f)*tan(rlat2));
   sinU1 := sin(U1);
   cosU1 := cos(U1);
   sinU2 := sin(U2);
   cosU2 := cos(U2);
   lambda := L;
   lambdap := 0.0;
   iterLimit := 100;
  
   while(abs(lambda - lambdap)>0.000000000001 and iterLimit > 0) LOOP
       sinLambda := sin(lambda) ;
       cosLambda := cos(lambda) ;
       sinSigma  := sqrt(power((cosU2 * sinLambda), 2)+power((cosU1 * sinU2 - sinU1 * cosU2 * cosLambda), 2));
          if(sinSigma=0.0)
               then return 0.0;
          else
           cosSigma := sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;
           Sigma := atan2(sinSigma, cosSigma);
           sinAlpha := cosU1 * cosU2 * sinLambda / sinSigma ;
           cosSqAlpha := 1.0 - power(sinAlpha, 2);
           cos2SigmaM := cosSigma - 2 * sinU1 * sinU2 / cosSqAlpha  ;
           select nvl(cos2SigmaM,0) into cos2SigmaM from dual;
          
           C := f / 16.0 * cosSqAlpha * (4.0 + f * (4.0 - 3.0 * cosSqAlpha)) ;
           lambdap := lambda;
           lambda := L + (1 - C) * f * sinAlpha * (Sigma + C * sinSigma * (cos2SigmaM +
           C * cosSigma * (-1 + 2.0 * power(cos2SigmaM , 2)))) ;
           iterLimit := iterLimit - 1  ;
           
       end if;
   end LOOP;
  
    if(iterLimit = 0)
  then return 111;
     else
         uSq := cosSqAlpha*(power(a1,2)-power(b,2))/(power(b,2));
         aA  := 1 + uSq / 16384.0 * (4096.0 + uSq *
              (-768.0 + uSq * (320.0 - 175.0 * uSq)));
         bB  := uSq / 1024.0 * (256.0 + uSq * (-128.0 + uSq * (74.0 - 47.0 * uSq)))  ;
         deltaSigma := bB * sinSigma * (cos2SigmaM + bB / 4.0 * (cosSigma
          * (-1 + 2 * power(cos2SigmaM,2)) -bB / 6.0 * cos2SigmaM
          * (-3 + 4 * power(sinSigma , 2)) * (-3 + 4 * power(cos2SigmaM , 2))));
         
         s := b * aA * (Sigma - deltaSigma) ;
        
        
         return s;
  end if;
 
END GPSDistance;
/

 

 

 

 

 

CREATE OR REPLACE FUNCTION ITS_KK.RAD(lon in NUMBER) RETURN NUMBER
AS  v_addr NUMBER;
begin
  select acos(-1)*lon/180.0 into v_addr from dual ;
 
  return v_addr;
END RAD;
/

分享到:
评论

相关推荐

    Oracle sdo_geometry空间坐标系转换

    ### Oracle sdo_geometry空间坐标系转换 #### 一、引言 在Oracle数据库中,`sdo_geometry`数据类型被广泛应用于地理信息系统(GIS)领域,用于存储和处理空间数据。其中,空间坐标系的转换是一项重要的功能,尤其是在...

    SQL 计算经纬

    如果`users`表中的地理位置信息是以`SDO_GEOMETRY`格式存储的,那么可以使用Oracle Spatial扩展来进行更高级的地理操作,如计算两点间的最短路径、查询位于特定区域内的对象等。 例如,假设`location`列是`SDO_...

    根据定位经纬度计算距离.txt

    具体而言,文档中提供了两个函数:`APPDISTANCE` 和 `DISTANCE_CONVERT`,用于计算基于经纬度的两点间距离,并将该距离转换为更易读的格式。 #### APPDISTANCE 函数 `APPDISTANCE` 函数的主要目的是接收两个地理...

    oracle内置函数

    3. **Atan2(first, second)**: 返回两个数值first和second的反正切值,通常用于计算平面直角坐标系中两点之间的角度。 4. **Ceil(number)**: 返回大于或等于number的最小整数。例如,Ceil(3.14)将返回4。 5. **Cos...

    oracle spatial 用户指南

    3. **Spatial Functions**: Oracle Spatial提供了一系列内置函数,用于执行各种空间操作,如计算两点之间的距离、检查两个几何对象是否相交、找出一个几何对象内的点等。这些函数是进行复杂空间分析的基础。 4. **...

    Oracle Spatial

    例如,你可以计算两个地理对象之间的距离,找出位于特定区域内的对象,或者检查对象是否相互重叠。这些函数极大地丰富了SQL查询的能力,使得空间查询和分析变得简单易行。 在地理编码方面,Oracle Spatial能将地址...

    Oracle spacial空间数据库

    容差是衡量空间数据运算精度的关键参数,它决定了两个点在多近时被视为重合。容差值可以根据数据的特性和应用需求来设定,较小的容差值意味着更高的运算精度。 5. **空间数据索引** 为了高效查询和操作空间数据,...

    oracle spatial for oracle database 11g

    3. **空间计算**:如 SDO_DISTANCE() 函数,用于计算两个几何对象之间的距离。 4. **空间转换**:如 SDO_CS.TRANSFORM() 函数,用于将空间对象从一种坐标系转换到另一种坐标系。 #### 六、空间索引技术 Oracle ...

    Oracle Spatial的中文简介

    - 距离计算:计算两个几何对象之间的距离。 - 邻近查询:找出距离某一对象一定范围内的其他对象。 - 叠加分析:合并多个地理层以获取新的信息。 - 缓冲区分析:创建几何对象周围的距离区域。 通过Oracle提供的编程...

    ArcSDE vs Oracle Spatial

    - **Oracle Spatial**:使用 `SDO_GEOM.SDO_DISTANCE` 来计算两个几何对象之间的距离。 - **ArcSDE**:通过 `ST_DISTANCE` 函数实现距离的计算。 ##### 面积、长度量测 - **Oracle Spatial**:使用 `SDO_GEOM.SDO_...

    oracle空间学习指南

    3. **空间操作**:Oracle Spatial提供了一系列的空间函数和操作,如距离计算、区域覆盖、相交、缓冲区分析等,这些功能使得在数据库中进行空间分析变得可能。 4. **地理编码**(Geocoding):Oracle Spatial支持将...

    Oracle Spatial空间数据库简介.ppt

    类似于传统的数据库聚集函数(如SUM和AVG),Oracle Spatial提供了空间聚集函数,如SDO_ANYINTERACT和SDO_CONTAINS,它们可以用于计算空间对象集合的特定属性或特征。 7. 地理编码(Geocoding): Oracle Spatial...

    基于Oracle Spatial的ITS空间数据库的实现及访问.pdf

    - 路网分析:计算两点间的最短路径,考虑交通拥堵等因素。 - 事故报警:当车辆发生事故时,定位并通知最近的救援服务。 - 车辆追踪:跟踪车辆的位置和行驶路线,为调度和管理提供依据。 总结,Oracle Spatial在ITS...

    基于Oracle Spatial的空间数据的研究.pdf

    通过Oracle Spatial,用户可以利用一系列内置的空间函数进行空间查询和分析,例如,查找距离最近的对象、计算两个几何对象的重叠部分、执行缓冲区分析等。这些功能大大降低了开发GIS系统的复杂性和成本。 在GIS系统...

    ORACLESPATIAL简介[参考].pdf

    Oracle Spatial提供了丰富的SQL函数来进行空间分析,例如`SDO_GEOM.SDO_DIFFERENCE`函数可以计算两个几何对象的拓扑差异。这种功能使得开发者能够执行复杂的空间操作,如缓冲区分析、距离计算和覆盖分析等。 Oracle...

    基于OO4O和VisualC 6.0实现Oracle9i Spatial中空间数据的操作.pdf

    同时,能够进行空间数据的查询,比如查找特定区域内包含的设施或计算两个地理实体之间的距离。此外,拓扑关系的查询对于分析地理现象(如河流流向、交通网络分析)至关重要。 【总结】文章通过介绍基于OO4O和Visual...

    fme 内置的函数功能介绍

    - **应用场景**:例如,可以通过这些转换器计算出两个点之间的距离或者根据某些条件动态生成新属性。 #### 四、收集器 (Collector Transformers) 收集器转换器可以在同一时间对一组特征进行操作。这些转换器允许...

    基于Oracle Spatial的上海市公交空间数据库设计与开发.pdf

    例如,利用这些函数,我们可以快速定位公交线路、计算两点之间的最短路径、分析公交站点的覆盖范围等。 上海市公交空间数据库的设计与开发采用了Oracle Spatial,旨在建立一个集成化的空间数据库系统。该系统将公交...

    SDE空间SQL使用

    例如,可以使用`ST_Within`来查找位于特定区域内的点,或者使用`ST_Distance`计算两个几何对象之间的距离。在实际应用中,这些空间函数极大地扩展了SQL的能力,使得在Oracle环境中处理地理空间信息变得更为高效和...

Global site tag (gtag.js) - Google Analytics