コアアルゴリズムツール

メソッドのツール* <H1>スムーズな軌道日に必要な<の/ H1>:2016年10月27日mxdlによって作成
* /
publicクラスTrackMoveUtil {
プライベート静的ダブルDISTANCE = 0.0001;

/ **
*根据两点算斜率
* /
パブリック静的ダブルgetSlope(緯度経度fromPoint、緯度経度toPoint){
IF(fromPoint == NULL || toPoint == NULL){
戻り0;
}
{(toPoint.longitude == fromPoint.longitude)場合
Double.MAX_VALUEを返します。
}
二重勾配=
((toPoint.latitude - fromPoint.latitude)/(toPoint.longitude - fromPoint.longitude))。
スロープを返します。

}

/ **
*根据两点算取图标转的角度
* /
パブリック静的ダブルgetAngle(緯度経度fromPoint、緯度経度toPoint){
IF(fromPoint == NULL || toPoint == NULL){
戻り0;
}
ダブルスロープ= getSlope(fromPoint、toPoint)。
IF(傾き== Double.MAX_VALUE){
IF(toPoint.latitude> fromPoint.latitude){
0を返します。
}そうでなければ{
180を返します。
}
}
フロートdeltAngle = 0。
IF((toPoint.latitude - fromPoint.latitude)*傾き<0){
deltAngle = 180。
}
二重無線= Math.atan(傾き)
二重角= 180 *(無線/にMath.PI)+ deltAngle - 90。
角度を返します。
}

/ **
*オペレータが傾きと切片点を取る
* /
パブリック静的ダブルgetInterception(ダブルスロープ、緯度経度のポイント){
IF(ポイント== NULL){
戻り0;
}
戻りpoint.latitude -スロープ* point.longitude;
}

/ **
各方向に移動*計算のx距離。
* /
パブリック静的ダブルgetXMoveDistance(ダブルスロープ){
IF(スロープ== Double.MAX_VALUE){
戻り距離;
}
Math.absを返す((距離*傾き)/数学。 SQRT(1 +スロープ*傾き));
}

/ **
*トロリートラックセグメントに応じて工程数をとる計算
*
* @param latLngList
* @return
* /
パブリック静的INT getStep(latLngList <緯度経度の>リスト){
int型STEP = 0;
!IF(latLngList = NULL && latLngList.size ()> 1){
(INT I = 0; I <latLngList.size()のために- 1; I ++){
試みを{
にstartPoint = latLngList.get(I)の緯度経度の;
。緯度経度のエンドポイント、latLngList.get =(I + 1)。
スロープ= getSlopeダブル(にstartPointは、エンドポイント);
//はポジティブマーク(前方設定)ではありません
ブールisReverse =(startPoint.latitude> endPoint.latitude);
ダブルxMoveDistance = isReverse getXMoveDistance(スロープ):? -1 getXMoveDistance *(傾き);
//は同時に緯度と経度に処理されなければなりません
用(ダブルJ = startPoint.latitude;((J> = endPoint.latitude)^ isReverse); J =!
J - xMoveDistance){
ステップ++;
}
}キャッチ(例外e){
e.printStackTrace();
}
}

}
戻りステップと
}

/ **
*根据总距离和步数计算运动时间
*
* @param距離
* @param工程
* @return
* /
パブリック静的ダブルgetMoveTime(フロート距離、INTステップ){
二時間間隔= 0。
IF(距離> 0){
フロートtotalDistance =距離×1000。
(totalDistance <= 500){もし
時間間隔= 1000.0 /工程と
}そうであれば(totalDistance> 500 && totalDistance <= 7500){
時間間隔= 2.0 * totalDistance /工程と
}他{
時間間隔= 15000.0 /工程と
}
}
時間間隔を返します。
}

/ **
*根据轨迹点集合计算总距离
*
* @param latLngList
* @return
* /
パブリック静的フロートgetDistance(一覧<緯度経度> latLngList){
フロート距離= 0。
場合(!latLngList = NULL && latLngList.size()> 1){
{; - ;のために(I ++は1 I <latLngList.size()は、i = 0はint型)
{しようと
の距離+ = AMapUtils.calculateLineDistance(latLngList.get(I )、latLngList.get(I + 1))。
}キャッチ(例外e){
e.printStackTrace();
}
}
}
戻り距離。
}

//緯度- -90と90の間の位置の緯度、ダブルタイプ値。
//経度-経度位置、-180と180との間の二重型の値。
/ **
*緯度と経度の文字列要求緯度と経度Aのセットに基づいて、| B | C | D;
*
* @param latlonStr
* @return
* /
getListLatLng(文字列latlonStr){<緯度経度の>パブリック静的リスト
IF(TextUtils.isEmpty(! latlonStr)){
String []型= trackArr latlonStr.split( "\\ |");
!場合はnull && trackArr.length(trackArr => 0){
緯度経度の一覧<緯度経度> =新新latLngListのArrayListを<>();
のために( 0 =私はint型、IはtrackArr.length < - 1; I = I + 2){
試みは、{
文字列trackArr LATは= [I + 1];
文字列LNG = trackArr [I];
// Logger.v(TAG、「trackArrインデックス: "+ I);
// Logger.v(TAG、" LAT trackArr:
// Logger.v(TAG、 "trackArrのLNG:" + LNG);
もし{(TextUtils.isEmpty(LAT)&& TextUtils.isEmpty(LNG)!!)
ダブルDLAT =は、Double.valueOf(LAT)。
ダブルdLng =は、Double.valueOf(LNG);
IF(DLAT> = -90 && DLAT <= 90 && dLng> = -180 && dLng <= 180
&&(DLAT == 0 && dLng == 0)!){
緯度経度緯度経度=新しい緯度経度(DLAT、dLng)。
latLngList.add(緯度経度)。
}
}
}キャッチ(例外e){
e.printStackTrace(http://www.amjmh.com/v/BIBRGZ_558768/)。
}
}
戻りlatLngList。
}
}
はnullを返します。
}
}

おすすめ

転載: www.cnblogs.com/ly570/p/11369965.html