1. 程式人生 > >地理座標轉3度或6度分帶的演算法以及任意多邊形求面積的方法(與Arcmap相差0.81%)

地理座標轉3度或6度分帶的演算法以及任意多邊形求面積的方法(與Arcmap相差0.81%)

一:首先補充下理論知識(網上找的)

對於不同的橢球體之間的轉換要用到七引數的方法,這個不還沒有研究。本文不是講的這個。

因為本文章主講演算法,理論知識就不多說了。

分帶方法
1.我國採用6度分帶和3度分帶:   
         1∶2.5萬及1∶5萬的地形圖採用6度分帶投影,即經差為6度,從零度子午線開始,自西向東每個經差6度為一投影帶,全球共分60個帶,用1,2, 3,4,5,……表示.即東經0~6度為第一帶,其中央經線的經度為東經3度,東經6~12度為第二帶,其中央經線的經度為9度。   
         1∶1萬的地形圖採用3度分帶,從東經1.5度的經線開始,每隔3度為一帶,用1,2,3,……表示,全球共劃分120個投影帶,即東經1.5~ 4.5度為第1帶,其中央經線的經度為東經3度,東經4.5~7.5度為第2帶,其中央經線的經度為東經6度.比如福建省位於東經113度-東經120度之間, 跨第38、39、40共計3個帶,其中東經115.5度以西為第38帶,其中央經線為東經114度;東經115.5~118.5度為39帶,其中央經線為 東經117度;東經118.5度以東到山海關為40帶,其中央經線為東經120度。 地形圖上公里網橫座標前2位就是帶號,例如:1∶5萬地形圖上的橫座標為20345486,其中20即為帶號,345486為橫座標值。
2.當地中央經線經度的計算
           六度帶中央經線經度的計算:當地中央經線經度=6°×當地帶號-3°,例如:地形圖上的橫座標為20345,其所處的六度帶的中央經線經度為:6°×20-3°=117°(適用於1∶2.5萬和1∶5萬地形圖);6°×49-180-3°=111°(適用於1∶50萬以下地形圖)。
三度帶中央經線經度的計算:中央經線經度=3°×當地帶號(適用於1∶1萬地形圖)。

我國x座標都是正的,y座標的最大值(在赤道上)約為330km。為了避免出現負的橫座標,可在橫座標上加上500 OOOm。此外還應在座標前面再冠以帶號。這種座標稱為國家統一座標。

二. 轉換演算法,用C++來實現的

 int zonewide=6;     //3度帶比較準,可以用6度帶
 int base_type=WGS84;   //投影基準面型別:北京54基準面為54,西安80基準面為80,WGS84基準面
 double L,B;//大地經度,緯度

 //----------初始化已知引數-----------
 L = longitude;//經度
 B = latitude;//緯度

 double l,L0;//投影帶中央線起算的經差,投影帶中央子午線
 double X,Y;//直角座標
 double f,e2,a,b,e12;////參考橢球體扁率,第一偏心率,長半軸,短半軸,第二偏心率
 double t;//儲存tan B
 double m;//儲存lcosB
 double q2;//卯酉圈的分量 的平方
 double M,N;//子午,卯酉圈曲半徑
 double S;//子午線弧長
 double A0,B0,C0,D0,E0;
 double n;//投影帶號
 double a_1_e2;//a*(1-e*e)的值

 if(WGS84 == base_type)
 {
  a = 6378137;
  b = 6356752.3142;
  f = 1/298.257223563;
  e2 = 0.0066943799013;//--第一偏心率
  e12 = 0.00673949674227;//--第二偏心率
 }
 else if(BJ54 == base_type)
 {
  a = 6378245;
  b = 6356863.0187730473;
  f = 1/298.3;
  e2 = 0.006693421622966;//--第一偏心率
  e12 = 0.006738525414683;//--第二偏心率
 }
 else if(XIAN80 == base_type)
 {
  a = 6378140;
  b = 6356755.2881575287;
  f = 1/298.257;
  e2 = 0.006694384999588;//--第一偏心率
  e12 = 0.006739501819473;//--第二偏心率
 }

 //求中央經線
 if (zonewide==6)
 {
  n=(int)(L/6)+1;
  L0=n*zonewide-3;
 }
 else
 {
  n=(int)((L-1.5)/3)+1;
  L0=n*3;
 }

 //---基本計算公式 a 長半軸,b 短半軸--------
 //f = (a-b)/a;//--橢球體扁率
 //e2 = (a*a-b*b)/(a*a);//--第一偏心率
 //e12 = (a*a-b*b)/(b*b);//--第二偏心率
 a_1_e2 = a*(1-e2);

 //---轉化為弧度,sin,cos 等運算都是以弧度為基礎的
 L0=L0*PI/180;
 L=L*PI/180;
 B=B*PI/180;
 l = L - L0;
 t = tan(B);
 q2 = e12*(cos(B)*cos(B));
 N = a/sqrt(1-e2*sin(B)*sin(B));////卯酉圈的曲率半徑
 m = l*cos(B);

 //--以下演算法是對原始公式的多項式進行了合併處理,儲存計算更準
 double m0 = a_1_e2;
 double m2 = 3.0 * e2 * m0 / 2.0;
 double m4 = 5.0 * e2 * m2 / 4.0;
 double m6 = 7.0 * e2 * m4 / 6.0;
 double m8 = 9.0 * e2 * m6 / 8.0;
 double a0 = m0 + m2 / 2.0 + 3.0 * m4 / 8.0 + 5.0 * m6 / 16.0 + 35.0 * m8 / 128;
 double a2 = m2 / 2.0 + m4 / 2.0 + 15.0 * m6 / 32.0 + 7.0 * m8 / 16.0;
 double a4 = m4 / 8.0 + 3.0 * m6 / 16.0 + 7.0 * m8 / 32.0;
 double a6 = m6 / 32.0 + m8 / 16.0;
 double a8 = m8 / 128.0;
 A0 = a0;
 B0 = a2;
 C0 = a4;
 D0 = a6;
 E0 = a8;
 S = (A0 * B - B0* sin(2.0*B)/2.0 + C0 * sin(4.0*B)/4.0 - D0 *sin(6.0*B)/6.0 + E0*sin(8.0*B)/8.0);

 //----高斯投影公式-------
 X = S + N * t *((0.5 + ((5.0 - t * t + 9 * q2 +4 * q2 * q2)/24 + (61.0 - 58.0 * t * t + pow(t,4)) * m * m /720.0) * m * m) * m * m);//pow(t,4)為t的4次方
 Y = N * ((1 + ((1 - t * t +q2)/6.0 +(5.0 - 18.0 * t * t + pow(t,4) + 14 * q2 - 58 * q2 * t * t ) * m * m / 120.0) * m * m ) * m);
 //----根據中國國情座標縱軸西移500公里當作起始軸
 Y = 1000000 * n + 500000 + Y;

三. 面積計算公式

注意本公式的首末結點都為(0,0),求之前要把所有的結點都減去第一個結點。

PS:這樣求出來的面積是有負值的,因為這是向量的,和你點的順序有關係。具體來說順時針則為負,逆時針則為正。這樣又可以多了一種判斷地物向量化方向的方法。

四. 結果檢測

 

這是ArcMap中的面積計算結果,我把各個座標輸入進去後得到的結果是654865.33362435829。

誤差大約在0.81%。

原因分析:

1. 在ArcMap中我選的投影為UTM投影(0.9996),並不是嚴格的高斯克裡格投影。

2.座標輸入的時候,並不是用專門的軟體讀取出來的,而是手動點選然後copy的。

3.由於簡單的結算採用的並不是七引數的轉換,所以...

 不過怎麼樣,證明我的轉換演算法和麵積計算公式都是可行的,哈哈。。。

改天把工程和資料打包上傳。

相關推薦

地理座標36演算法以及任意多邊形面積方法(Arcmap相差0.81%)

一:首先補充下理論知識(網上找的) 對於不同的橢球體之間的轉換要用到七引數的方法,這個不還沒有研究。本文不是講的這個。 因為本文章主講演算法,理論知識就不多說了。 分帶方法 1.我國採用6度分帶和3度分帶:             1∶2.5萬及1∶5萬的地形圖採用6度分帶投影,即經差為6度,從零度

ArcGIS柵格影像怎麼從WGS84地理座標成Xian80投影座標

事情是這樣的,我下載了一個WGS84座標系的影像圖,需要載入到Xian80投影座標系下,所以需要對影像圖進行座標系的轉換 1、因為涉及到兩個參考橢球的問題,首先需要計算七引數,如何計算七引數,請參考我之前的一篇文章 https://www.cnblogs.com/yiliangmi/p/9897435.h

風場站點表XY地理座標UTM座標 AcrGIS

 風場站點XY地理座標轉UTM座標 1.excel轉shp檔案 1.1表格預處理 開啟風場點座標表WT.xlsx,檢查是否有X、Y列名,若無,新增一行。儲存退出。 1.2開啟Arcgis,新建一個空白地圖BlankMap。 1.3載入原始WGS84地

maven系列--3-Maven從遠端倉庫下載jar包以及新增遠端倉庫的方法

用maven來構建專案,依賴jar包不用放到lib下面了,直接在pom檔案宣告即可。但是pom檔案宣告引用的jar包,預設是從maven中央倉庫下載的。如果引用了不存在中央倉庫的jar包,就會報錯:依

座標投影,36

關於3度帶、6度帶、帶號之間的相互關係 3度帶任意經度:L3,   6度帶任意經度:L6 3度帶中央經度:Lz3,  6度帶中央經度:Lz6 3度帶帶號N3 ,  6度帶帶號N6 帶號求中央經線 Lz3=N3*3 Lz6=N6*6-3 中央經線求帶號

python練習題,寫一個方法 傳進去列表和預期的value 出所有變量得取值可能性(例如list為[1,2,3,4,5,6,12,19],value為20,結果是19+1==20只有一種可能性),要求時間復雜為O(n)

num bubuko com pri def 代碼 data- 取值 .com 題目:(來自光榮之路老師)a+b==valuea+b+c=valuea+b+c+d==valuea+b+c+d+...=valuea和b....取值範圍都在0-value寫一個方法 傳進去列

墨卡託座標經緯度座標方法實現【C#版本】

轉載,原文地址:https://www.cnblogs.com/niudieyi/p/8706951.html 該方法參考了 https://blog.csdn.net/qq_16664325/article/details/67639684 這篇文章中主要是Java版本的,我把它

高德座標(傳入經度、緯度)

高德座標轉百度(傳入經度、緯度) /* * 高德座標轉百度(傳入經度、緯度),得到百度的經緯度 * @param gdlng 高德經度 * @param gdlat 高德緯度 */ function bd_encrypt(gdlng, gdlat){ var X_PI = Math.PI

座標84座標

function getLocation(){              x_PI = 3.14159265358979324 * 3000.0 / 180.0;              PI = 3.1415926535897932384626;             

android 原生定位座標

public class GPSUtil { public static double pi = 3.1415926535897932384626; public static double x_pi = 3.14159265358979324 * 3000.0 / 180.

微信座標座標系

微信使用的是WGS84座標系,百度使用的是bd09座標系,兩個座標系中間有位置偏差,如果直接對使用兩種座標系的位置進行比較,非常不準確,所以需要將微信座標轉化為百度座標。 百度地圖api提供座標轉換介面: http://api.map.baidu.com/geoconv/v1/?coo

座標WGS84(即GPS)座標

        此座標轉換用的是GPSspg的API,如果您需要轉幾個的話還是線上轉效率比較高;如果量比較大的話,轉換不超過2000次/天,可以用此方法(免費);如果量很大的話,推薦訂閱較高階的套餐。單個線上轉換:地址:http://www.gpsspg.com/maps.h

ArcGIS中36投影變換方法及跨投影問題

在實際工作中遇到一個問題,某城市的遙感影像使用的是CGCS2000座標系下6度帶的投影,但是給的專案圖紙上的拐點座標均為在3度帶上的投影座標(由於城建專案範圍小,一般採用三度分帶),並且這個城市橫跨相鄰的兩個三度帶,因此想要將整個城市中所有的專案都合併在一個圖層中,並能疊加在

坐標36的知識(轉載)

family 適用於 球面 pan 坐標系統 技術分享 判斷 投影 ive 導讀 我國采用6度分帶和3度分帶。有一組坐標,怎麽迅速知道它們是3度帶的還是6度帶的? 1.我國采用6度分帶和3度分帶。 1∶2.5萬及1∶5萬的地形圖采用6度分帶投影,即經差為6度,從零度

原始座標成百座標

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <m

到高德地圖地圖高德網頁導航

最近做一個新專案,需要用到導航,專案集成了高德的SDK,所以本來想直接用SDK內的導航方法,但是發現高德最新版的導航改版了,如果SDK內加上導航模組會使得整個專案大十幾二十M,所以決定棄用SDK內的導航,最終決定,採用以下方案: 1.當手機內有高德地圖app時

格式 轉換 GPS 經緯度定義、經緯度格式、GDAL中地理座標轉換及地理座標螢幕顯示

轉自:http://blog.csdn.net/lijie45655/article/details/6771524 手持GPS,正在學習當中,晚上我在谷歌地球上找到端午節要去的目的地,找出了它的經緯度座標,然後把數值輸入GPS,結果一看地圖,納悶了,相差了好幾十公里。我

石墨烯在氮化硼基底上的公—非公轉變(自物理所)

相關 技術分享 廣泛 方框 位置 大小 中國科學院 mda 變換 石墨烯(Graphene)以其優異的載流子遷移率、力學性能等在凝聚態物理及材料科學領域引起了廣泛的研究興趣並取得了巨大的進展;而六方氮化硼 (hBN)作為石墨烯的等電子體,具有一定的能隙、原子級平整

openlayers 3加載百、高德、google瓦片地圖

nbsp ima play sset baidumap tile target leg lin 1、加載高德地圖 //高德地圖 var AMapLayer = new ol.layer.Tile({ source: new

vs2015+opencv3.3.1 實現 灰高斯濾波器

3.3 edwin ont eight end wid img pre i++ #include <opencv2\highgui\highgui.hpp> #include <iostream> #include<vector> u