kopia lustrzana https://github.com/sh123/codec2_talkie
108 wiersze
4.1 KiB
Java
108 wiersze
4.1 KiB
Java
package com.radio.codec2talkie.protocol.position;
|
|
|
|
import android.location.Location;
|
|
|
|
import com.radio.codec2talkie.storage.position.PositionItem;
|
|
import com.radio.codec2talkie.tools.UnitTools;
|
|
|
|
public class Position {
|
|
public long timestampEpochMs;
|
|
public String srcCallsign;
|
|
public String dstCallsign;
|
|
public String digipath;
|
|
public double latitude;
|
|
public double longitude;
|
|
public String maidenHead;
|
|
public double altitudeMeters;
|
|
public double bearingDegrees;
|
|
public double speedMetersPerSecond;
|
|
public String status;
|
|
public String comment;
|
|
public String symbolCode;
|
|
public boolean isCompressed;
|
|
public int privacyLevel;
|
|
public int extDigipathSsid;
|
|
public boolean isSpeedBearingEnabled;
|
|
public boolean isAltitudeEnabled;
|
|
public boolean hasBearing;
|
|
public boolean hasAltitude;
|
|
public boolean hasSpeed;
|
|
|
|
public static Position fromLocation(Location location) {
|
|
Position position = new Position();
|
|
position.latitude = location.getLatitude();
|
|
position.longitude = location.getLongitude();
|
|
position.bearingDegrees = location.getBearing();
|
|
position.altitudeMeters = location.getAltitude();
|
|
position.speedMetersPerSecond = location.getSpeed();
|
|
position.timestampEpochMs = location.getTime();
|
|
position.hasBearing = location.hasBearing();
|
|
position.hasAltitude = location.hasAltitude();
|
|
position.hasSpeed = location.hasSpeed();
|
|
position.maidenHead = UnitTools.decimalToMaidenhead(position.latitude, position.longitude);
|
|
return position;
|
|
}
|
|
|
|
public double distanceTo(Position position) {
|
|
final int R = 6371; // Radius of the earth
|
|
|
|
double latDistance = Math.toRadians(position.latitude - latitude);
|
|
double lonDistance = Math.toRadians(position.longitude - longitude);
|
|
double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
|
|
+ Math.cos(Math.toRadians(latitude)) * Math.cos(Math.toRadians(position.latitude))
|
|
* Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
|
|
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
double distance = R * c * 1000; // convert to meters
|
|
|
|
double height = altitudeMeters - position.longitude;
|
|
|
|
distance = Math.pow(distance, 2) + Math.pow(height, 2);
|
|
|
|
return Math.sqrt(distance);
|
|
}
|
|
|
|
public static double distanceTo(double lat1, double lon1, double alt1, double lat2, double lon2, double alt2) {
|
|
Position pos1 = new Position();
|
|
pos1.latitude = lat1;
|
|
pos1.longitude = lon1;
|
|
pos1.altitudeMeters = alt1;
|
|
|
|
Position pos2 = new Position();
|
|
pos2.latitude = lat2;
|
|
pos2.longitude = lon2;
|
|
pos2.altitudeMeters = alt2;
|
|
|
|
return pos1.distanceTo(pos2);
|
|
}
|
|
|
|
public static String bearing(double lat1, double lon1, double lat2, double lon2) {
|
|
double radians = Math.atan2(lon2 - lon1, lat2 - lat1);
|
|
double degrees = radians * (180.0 / Math.PI);
|
|
String[] dirNames = {"N", "NE", "E", "SE", "S", "SW", "W", "NW", "N"};
|
|
int dirIndex = (int) Math.round(degrees / 45);
|
|
if (dirIndex < 0) {
|
|
dirIndex = dirIndex + 8;
|
|
};
|
|
return dirNames[dirIndex];
|
|
}
|
|
|
|
public PositionItem toPositionItem(boolean isTransmit) {
|
|
PositionItem positionItem = new PositionItem();
|
|
positionItem.setTimestampEpoch(System.currentTimeMillis());
|
|
positionItem.setIsTransmit(isTransmit);
|
|
positionItem.setSrcCallsign(srcCallsign);
|
|
positionItem.setDstCallsign(dstCallsign);
|
|
positionItem.setLatitude(latitude);
|
|
positionItem.setLongitude(longitude);
|
|
positionItem.setMaidenHead(maidenHead);
|
|
positionItem.setAltitudeMeters(altitudeMeters);
|
|
positionItem.setBearingDegrees(bearingDegrees);
|
|
positionItem.setSpeedMetersPerSecond(speedMetersPerSecond);
|
|
positionItem.setStatus(status);
|
|
positionItem.setComment(comment);
|
|
positionItem.setSymbolCode(symbolCode);
|
|
positionItem.setPrivacyLevel(privacyLevel);
|
|
return positionItem;
|
|
}
|
|
}
|