原创:(网格化地图之初)高斯大地座标(经度、纬度)→3°投影带平面直角坐标(X、Y)换算...
生活随笔
收集整理的這篇文章主要介紹了
原创:(网格化地图之初)高斯大地座标(经度、纬度)→3°投影带平面直角坐标(X、Y)换算...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
好像不能上傳Excel,暫時把結果用表格顯示出來吧
| 高斯大地座標(經度、緯度)→3°投影帶平面直角坐標(X、Y)換算表 | 數?????據??????預??????處????????理 | ||||||||||||||||||||
| 投影點編號 | 緯度(B) | 經度(L) | 投影帶號 | 縱座標(X,m) | 橫座標(Y,m) | 子午線收斂角????(γ°) | B弧度值 | L弧度值 | X0 | l=經差????(L-L0) | 卯酉圈曲率半徑,N | t=tgB | ρ’ | η2 | 座標帶編號 | 5-t2+9η2+4η4 | 61-58t2+t4 | ||||
| 度 | 分 | 秒 | 度 | 分 | 秒 | ||||||||||||||||
| 1? | 35? | 32? | 7? | 107? | 4? | 36? | 35 | 3936032.1591 | 35688348.2838 | 1.206980965 | 0.62020735 | 1.868840253 | 3934047.827 | 0.036244538 | 6385467.934 | 0.7142 | 57.2958 | 0.0045 | 35 | 4.5301 | 31.6737 |
以下是Oracle中創建的計算函數,可以根據經緯度計算出平面直角坐標的X、Y的距離,進而在網格化的地圖中得知該點位于哪個方格或者哪個象限!
CREATE OR REPLACE FUNCTION Alpha(N number) RETURN NUMBERis--η2beginreturn (0.006738525415)*power(COS(Radian(N)),2);end ; CREATE OR REPLACE FUNCTION Beta(N number) RETURN NUMBERis--ρ’beginreturn 180/acos(-1);end ; CREATE OR REPLACE FUNCTION Coordinate(Lon number) RETURN NUMBERis--座標帶編號/投影帶號beginreturn trunc(Lon/3,0)+1;end ; CREATE OR REPLACE FUNCTION Fun_Meridian_C_angle(Lon number,Lat number) RETURN NUMBERis--子午線收斂角 (γ°)beginreturn Beta(Lat)*Lon_Diff(Lon)*SIN(RADIAN(Lat))+SIN(RADIAN(Lat))*POWER(COS(RADIAN(Lat)),2)*(1+3*Alpha(Lat)+2*POWER(Alpha(Lat),2))*POWER(Lon_Diff(Lon),3)+SIN(RADIAN(Lat))*power(COS(RADIAN(Lat)),4)*(2-power(Tange(Lat),2))*power(Lon_Diff(Lon),5);end ; CREATE OR REPLACE FUNCTION Fun_X0(N number) RETURN NUMBERis--得出范圍X0beginreturn 6378245*(1-0.006693421623)*(1.0050517739*Radian(N)-0.00506237764*SIN(2*Radian(N))/2+0.00001062451*SIN(4*Radian(N))/4-0.0000002081*SIN(6*Radian(N))/6);end ; CREATE OR REPLACE FUNCTION GETBUSLINEFIRSTP(lineverid number, theupdown number, firstlastpointtag integer) RETURN VARCHAR2isResult VARCHAR2(4000); --定義變量--公交線第一個點beginif firstlastpointtag = 1 thenselect 'POINT(' || a.longitude_offset || ' ' || a.latitude_offset || ')' into Result from TB_BSINFO_BUSLINE_ROUTE a where a.order_num=(select min(b.order_num) from TB_BSINFO_BUSLINE_ROUTE b where b.line_ver_id=lineverid and b.updown=theupdown) and a.line_ver_id=lineverid and a.updown=theupdown;end if;if firstlastpointtag = 2 thenselect 'POINT(' || a.longitude_offset || ' ' || a.latitude_offset || ')' into Result from TB_BSINFO_BUSLINE_ROUTE a where a.order_num=(select max(b.order_num) from TB_BSINFO_BUSLINE_ROUTE b where b.line_ver_id=lineverid and b.updown=theupdown) and a.line_ver_id=lineverid and a.updown=theupdown;end if;return Result;end; CREATE OR REPLACE FUNCTION GETBUSLINEOVERLAPLENGTH(aline_ver_id number,aupdown number,bline_ver_id number,bupdown number) RETURN VARCHAR2isa_line_ver_id number;a_updown number;b_line_ver_id number;b_updown number;overlapbuslinelenght VARCHAR2(4000); --定義變量a_buslinelenght VARCHAR2(4000);b_buslinelenght VARCHAR2(4000);begina_line_ver_id := aline_ver_id;a_updown := aupdown;b_line_ver_id := bline_ver_id;b_updown := bupdown;if aline_ver_id > bline_ver_id thena_line_ver_id := bline_ver_id;a_updown := bupdown;b_line_ver_id := aline_ver_id;b_updown := aupdown;end if;selectsdo_geom.sdo_length(a.shape, 0.1, 'unit=M') ,sdo_geom.sdo_length(c.shape, 0.1, 'unit=M'),sdo_geom.sdo_length(SDO_GEOM.sdo_intersection(a.shape,SDO_GEOM.SDO_BUFFER(c.shape, 15, 0.2, 'unit= M'),0.001), 0.1, 'unit=M')into a_buslinelenght,b_buslinelenght,overlapbuslinelenghtfrom(select b.shape as shape from TB_BSINFO_BUSLINE_SHAPE bwhere b.line_ver_id=b_line_ver_id and b.updown=b_updown) c,TB_BSINFO_BUSLINE_SHAPE awhere a.line_ver_id=a_line_ver_id and a.updown=a_updown;if overlapbuslinelenght > 15 thenoverlapbuslinelenght := overlapbuslinelenght - 15;if aline_ver_id > bline_ver_id thenoverlapbuslinelenght := to_char(b_buslinelenght) || '~' || to_char(overlapbuslinelenght) || '~' || to_char(a_buslinelenght);elseoverlapbuslinelenght := to_char(a_buslinelenght) || '~' || to_char(overlapbuslinelenght) || '~' || to_char(b_buslinelenght);end if;return overlapbuslinelenght;elseselectsdo_geom.sdo_length(a.shape, 0.1, 'unit=M') ,sdo_geom.sdo_length(c.shape, 0.1, 'unit=M'),sdo_geom.sdo_length(SDO_GEOM.sdo_intersection(a.shape,SDO_GEOM.SDO_BUFFER(c.shape, 15, 0.2, 'unit= M'),0.001), 0.1, 'unit=M')into a_buslinelenght,b_buslinelenght,overlapbuslinelenghtfrom(select b.shape as shape from TB_BSINFO_BUSLINE_SHAPE bwhere b.line_ver_id=a_line_ver_id and b.updown=a_updown) c,TB_BSINFO_BUSLINE_SHAPE awhere a.line_ver_id=b_line_ver_id and a.updown=b_updown;overlapbuslinelenght := overlapbuslinelenght - 15;if aline_ver_id > bline_ver_id thenoverlapbuslinelenght := to_char(b_buslinelenght) || '~' || to_char(overlapbuslinelenght) || '~' || to_char(a_buslinelenght);elseoverlapbuslinelenght := to_char(a_buslinelenght) || '~' || to_char(overlapbuslinelenght) || '~' || to_char(b_buslinelenght);end if;return overlapbuslinelenght;end if;end; CREATE OR REPLACE FUNCTION GetDistance(lng1 number,lat1 number,lng2 number,lat2 number) RETURN NUMBER isearth_padius number := 6378.137;radLat1 number := Radian(lat1);radLat2 number := Radian(lat2);a number := radLat1 - radLat2;b number := Radian(lng1) - Radian(lng2);s number := 0;begins := 2 *Asin(Sqrt(power(sin(a / 2), 2) +cos(radLat1) * cos(radLat2) * power(sin(b / 2), 2)));s := s * earth_padius;s := Round(s * 10000) / 10000;return s*1000;end; create or replace function getGrid_Code(Lon in number, lat in number) return varchar2 isLoad_X number(10,2);Load_Y number(10,2);Addr_X number(10,2);Addr_Y number(10,2);NumOne number;NumY number;NumFour number;NumX number;NumYcode number;NumXcode number;-- Result varchar2; begin--人民廣場上海國際飯店121.46711830,31.23546313橫縱坐標select X_Coordinate(121.46711830,31.23546313),Y_Coordinate(121.46711830,31.23546313) into Load_X,Load_Y from dual;select X_Coordinate(lon,lat),Y_Coordinate(lon,lat) into Addr_X,Addr_Y from dual;if (Addr_Y - Load_Y) > 0 THENNumOne := 1;elseNumOne := 3;end if;if (Addr_X - Load_X) > 0 thenNumFour := 4;ELSENumFour := 2;END IF;select round(abs((Addr_Y - Load_Y)/1000),0),round(abs((Addr_X - Load_X)/1000),0) into NumY, NumX from dual;if NumY < 10 thenNumYcode :=NumOne||'0'||NumY;ELSENumYcode:=NumOne||NumY;end if;if NumX < 10 thenNumXcode := NumFour||'0'||NumX;ELSENumXcode:= NumFour||NumX;end if;return(NumYcode||NumXcode); end getGrid_Code; CREATE OR REPLACE FUNCTION GETNEXTSTATION(lineverid number, theupdown number, currentordernum number) RETURN VARCHAR2isnextstationname VARCHAR2(4000); --定義變量nextordernum integer;beginnextordernum := currentordernum + 1;select a.name into nextstationname from TB_BSINFO_BUSLINE_STATION t,TB_BSINFO_STATION_DICT awhere t.line_ver_id=lineverid and t.updown=theupdown and t.order_num=nextordernum and t.station_id=a.station_id;return nextstationname;end; CREATE OR REPLACE FUNCTION GETSTATIONBUSLINE(stationid number) RETURN VARCHAR2isbuslines VARCHAR2(4000); --定義變量beginselect WMSYS.Wm_Concat(b.name || '(版本:' || t.line_ver_id || '-上下行:' || t.updown || ')') into buslines from TB_BSINFO_BUSLINE_STATION t, TB_BSINFO_BUSLINE_VER a,TB_BSINFO_BUSLINE_DICT bwhere t.station_id = stationid and t.line_ver_id=a.id and a.line_id=b.line_id;return buslines;end; CREATE OR REPLACE FUNCTION GETSTATIONBUSLINENUM(stationid number) RETURN VARCHAR2isbuslinenum VARCHAR2(4000); --定義變量beginselect count(t.station_id) into buslinenum from TB_BSINFO_BUSLINE_STATION twhere t.station_id = stationid;return buslinenum;end; create or replace function Get_Gps_time(gps_time in number) return varchar2 isResult varchar2(50); beginselect SUBSTR(TO_CHAR(gps_time,'FM000000'),1,2)||':'||SUBSTR(TO_CHAR(gps_time,'FM000000'),3,2)||':'||SUBSTR(TO_CHAR(gps_time,'FM000000'),-2) into Result from dual;return(Result); end Get_Gps_time; CREATE OR REPLACE FUNCTION Lon_Diff(Lon number) RETURN NUMBERis--l=經差 (L-L0)beginreturn Radian(Lon)-3*Coordinate(Lon)*acos(-1)/180;end ; CREATE OR REPLACE FUNCTION Radian(N number) RETURN NUMBERis--得出弧度beginreturn N* acos(-1)/180.0;end ; CREATE OR REPLACE FUNCTION ROCIPV(N number) RETURN NUMBERis--卯酉圈曲率半徑,Nbeginreturn 6378245/SQRT(1-0.006693421623*power((SIN(Radian(N))),2));end ; CREATE OR REPLACE FUNCTION Tange(N number) RETURN NUMBERis--t=tgBbeginreturn TAN(Radian(N));end ; CREATE OR REPLACE FUNCTION U_QSS(N number) RETURN NUMBERis--5-t2+9η2+4η4beginreturn 5-power(Tange(N),2)+9*Alpha(N)+4*power(Alpha(N),2);end ; CREATE OR REPLACE FUNCTION V_QQ(N number) RETURN NUMBERis--61-58t2+t4beginreturn 61-58*power(Tange(N),2)+power(Tange(N),4);end ; CREATE OR REPLACE FUNCTION X_Coordinate(Lon number,lat number) RETURN NUMBERis--縱座標(X,m)beginreturn Fun_X0(lat)+POWER(Lon_Diff(Lon),2)*ROCIPV(lat)*SIN(radian(lat))*COS(radian(lat))/2+POWER(Lon_Diff(Lon),4)*ROCIPV(lat)*SIN(radian(lat))*POWER(COS(radian(lat)),3)*(U_QSS(lat))/24+POWER(Lon_Diff(Lon),6)*ROCIPV(lat)*SIN(radian(lat))*POWER(COS(radian(lat)),5)*V_QQ(lat)/720;end ; CREATE OR REPLACE FUNCTION Y_Coordinate(Lon number,lat number) RETURN NUMBERis--橫座標(Y,m)beginreturn Coordinate(Lon)*1000000+500000+Lon_Diff(Lon)*ROCIPV(lat)*COS(RADIAN(lat))*(1+POWER(Lon_Diff(Lon)*COS(RADIAN(lat)),2)*(1-POWER(Tange(lat),2)+Alpha(lat))/6+POWER(Lon_Diff(Lon)*COS(RADIAN(lat)),4)*(5-18*POWER(Tange(lat),2)+POWER(Tange(lat),4)+14*Alpha(lat)-58*Alpha(lat)*power(Tange(lat),2))/120);end ;?
轉載于:https://www.cnblogs.com/zoufan/p/5389822.html
總結
以上是生活随笔為你收集整理的原创:(网格化地图之初)高斯大地座标(经度、纬度)→3°投影带平面直角坐标(X、Y)换算...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高级软件工程第五次作业:东理三剑客团队作
- 下一篇: 前端获取当前路径