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`数据类型被广泛应用于地理信息系统(GIS)领域,用于存储和处理空间数据。其中,空间坐标系的转换是一项重要的功能,尤其是在...
如果`users`表中的地理位置信息是以`SDO_GEOMETRY`格式存储的,那么可以使用Oracle Spatial扩展来进行更高级的地理操作,如计算两点间的最短路径、查询位于特定区域内的对象等。 例如,假设`location`列是`SDO_...
具体而言,文档中提供了两个函数:`APPDISTANCE` 和 `DISTANCE_CONVERT`,用于计算基于经纬度的两点间距离,并将该距离转换为更易读的格式。 #### APPDISTANCE 函数 `APPDISTANCE` 函数的主要目的是接收两个地理...
3. **Atan2(first, second)**: 返回两个数值first和second的反正切值,通常用于计算平面直角坐标系中两点之间的角度。 4. **Ceil(number)**: 返回大于或等于number的最小整数。例如,Ceil(3.14)将返回4。 5. **Cos...
3. **Spatial Functions**: Oracle Spatial提供了一系列内置函数,用于执行各种空间操作,如计算两点之间的距离、检查两个几何对象是否相交、找出一个几何对象内的点等。这些函数是进行复杂空间分析的基础。 4. **...
例如,你可以计算两个地理对象之间的距离,找出位于特定区域内的对象,或者检查对象是否相互重叠。这些函数极大地丰富了SQL查询的能力,使得空间查询和分析变得简单易行。 在地理编码方面,Oracle Spatial能将地址...
容差是衡量空间数据运算精度的关键参数,它决定了两个点在多近时被视为重合。容差值可以根据数据的特性和应用需求来设定,较小的容差值意味着更高的运算精度。 5. **空间数据索引** 为了高效查询和操作空间数据,...
3. **空间计算**:如 SDO_DISTANCE() 函数,用于计算两个几何对象之间的距离。 4. **空间转换**:如 SDO_CS.TRANSFORM() 函数,用于将空间对象从一种坐标系转换到另一种坐标系。 #### 六、空间索引技术 Oracle ...
- 距离计算:计算两个几何对象之间的距离。 - 邻近查询:找出距离某一对象一定范围内的其他对象。 - 叠加分析:合并多个地理层以获取新的信息。 - 缓冲区分析:创建几何对象周围的距离区域。 通过Oracle提供的编程...
- **Oracle Spatial**:使用 `SDO_GEOM.SDO_DISTANCE` 来计算两个几何对象之间的距离。 - **ArcSDE**:通过 `ST_DISTANCE` 函数实现距离的计算。 ##### 面积、长度量测 - **Oracle Spatial**:使用 `SDO_GEOM.SDO_...
3. **空间操作**:Oracle Spatial提供了一系列的空间函数和操作,如距离计算、区域覆盖、相交、缓冲区分析等,这些功能使得在数据库中进行空间分析变得可能。 4. **地理编码**(Geocoding):Oracle Spatial支持将...
类似于传统的数据库聚集函数(如SUM和AVG),Oracle Spatial提供了空间聚集函数,如SDO_ANYINTERACT和SDO_CONTAINS,它们可以用于计算空间对象集合的特定属性或特征。 7. 地理编码(Geocoding): Oracle Spatial...
- 路网分析:计算两点间的最短路径,考虑交通拥堵等因素。 - 事故报警:当车辆发生事故时,定位并通知最近的救援服务。 - 车辆追踪:跟踪车辆的位置和行驶路线,为调度和管理提供依据。 总结,Oracle Spatial在ITS...
通过Oracle Spatial,用户可以利用一系列内置的空间函数进行空间查询和分析,例如,查找距离最近的对象、计算两个几何对象的重叠部分、执行缓冲区分析等。这些功能大大降低了开发GIS系统的复杂性和成本。 在GIS系统...
Oracle Spatial提供了丰富的SQL函数来进行空间分析,例如`SDO_GEOM.SDO_DIFFERENCE`函数可以计算两个几何对象的拓扑差异。这种功能使得开发者能够执行复杂的空间操作,如缓冲区分析、距离计算和覆盖分析等。 Oracle...
同时,能够进行空间数据的查询,比如查找特定区域内包含的设施或计算两个地理实体之间的距离。此外,拓扑关系的查询对于分析地理现象(如河流流向、交通网络分析)至关重要。 【总结】文章通过介绍基于OO4O和Visual...
- **应用场景**:例如,可以通过这些转换器计算出两个点之间的距离或者根据某些条件动态生成新属性。 #### 四、收集器 (Collector Transformers) 收集器转换器可以在同一时间对一组特征进行操作。这些转换器允许...
例如,利用这些函数,我们可以快速定位公交线路、计算两点之间的最短路径、分析公交站点的覆盖范围等。 上海市公交空间数据库的设计与开发采用了Oracle Spatial,旨在建立一个集成化的空间数据库系统。该系统将公交...
例如,可以使用`ST_Within`来查找位于特定区域内的点,或者使用`ST_Distance`计算两个几何对象之间的距离。在实际应用中,这些空间函数极大地扩展了SQL的能力,使得在Oracle环境中处理地理空间信息变得更为高效和...