我有一个我一直在玩的小项目(Android,GPS,地图API),我需要知道如何从给定的经度/纬度/ GeoPoint中找到经度/纬度/ GeoPoint,只知道米/ km经度和纬度。例如我想知道一个点来自我的位置,我知道沿着经度+1000米,沿纬度+1000。
它与您将看到的通常的GeoPoint /距离问题略有不同,并且它与地理围栏半径不太相关,因为距离为X,Y米/公里,而且我没有任何影响。 (我可以算出轴承,但我没有合适的直接距离)
基本上,如果我可以撤销GeoPoint.distanceTo(),它就可以帮我完成工作。
更新
再多一点背景。我基本上应用了一个节点三角测量的想法,但算法要求我的输入采用与经度和纬度不同的地图规范化形式。我创建了一个地图/网格,其中0,0(底部/左侧)是我正在使用的节点的左/西和底部/南部最经度/纬度值。地图上的所有其他节点X / Y都是通过使用GeoPoint.distanceTo()从0,0节点的经度/纬度中找到它们的米来确定的。 (注意我通过对每个节点执行distanceTo两次来找到他们的X / Y,所以我有0,0的X和Y米,而不是到节点的直接线)以米为单位的距离被输入到算法中并且新的X /生成Y个地图点。
所以我需要弄清楚如何将经度/纬度的距离转换为另一个,以前未知的经度/纬度。
double startPointLongitude = 23.459821;
double startPointLatitude = 76.998200;
double distanceLongitude = 100; // 100 meters along the longitude
double distanceLatitude = 75; // 75 meters along the latitude
答案 0 :(得分:1)
基本上我接受了AlexWien的回答,纠正了两件事并将其变成了一种java方法
private static final double WGS84_RADIUS = 6370997.0;
private static double EarthCircumFence = 2* WGS84_RADIUS * Math.PI;
private static Position getPosition(Position sourcePosition, double mEastWest, double mNorthSouth){
double degreesPerMeterForLat = EarthCircumFence/360.0;
double shrinkFactor = Math.cos((sourcePosition.getLat()*Math.PI/180));
double degreesPerMeterForLon = degreesPerMeterForLat * shrinkFactor;
double newLat = sourcePosition.getLat() + mNorthSouth * (1/degreesPerMeterForLat);
double newLng = sourcePosition.getLng() + mEastWest * (1/degreesPerMeterForLon);
return new Position(newLat, newLng);
}
答案 1 :(得分:0)
两个纬度之间的距离永远不会改变,它始终是aprox。 111公里 (使用WGS84地球半径计算的确切值:
EarthCircumFence = 2* WGS84_RADIUS * Math.Pi;
meterPerDegree =(Earth Cirumfence / 360)
使用此信息,您可以轻松计算纬度偏移, 只需扭转因素并具有:
degreesPerMeterForLat = EarthCircumfenceMeter / 360.0
经度有点不同,两度经度之间的距离缩小
你越远离aequator。
shrinkFactor = cos(toRadians(locationLatitude));
现在补偿:
degreesPerMeterForLon = degreesPerMeterForLat / shrinkFactor;
最后
newLatPos = latOld + numMeters * degreesPerMeterForLat;
newLonPos = lonOld + numMeters * degreesPerMeterForLon;
这适用于距离偏移< 10 - 50 km
答案 2 :(得分:0)
叹了口气,我在6个小时前发布了此内容,但似乎没有通过。
好的,尽管大多数地理公式和事实偶尔会超出我的想象,但仍然可以解决这个问题。使用地理就像使用公历一样,如果你一直为它编程,这是有道理的,但是否则很容易被错误的假设弄糊涂。
以下情况除了我的应用程序将采用起始GeoPoint的long / lat
/**
* the length of one degree of latitude (and one degree of longitude at equator) in meters.
*/
private static final double DEGREE_DISTANCE_AT_EQUATOR = 111329;
/**
* calculates the x,y in meters from a given starting point's long0, lat0 to a target destination point's long1, lat1.
* @param long0 start point longitude
* @param lat0 start point latitude
* @param long1 end point longitude
* @param lat1 end point latitude
* @return
*/
public static Pair<Double, Double> xyFromLongLat(int long0, int lat0, int long1, int lat1) {
double x = (long1 / 1E6 - long0 / 1E6) * longitudeDistanceAtLatitude(lat0 / 1E6);
double y = (lat1 / 1E6 - lat0 / 1E6) * DEGREE_DISTANCE_AT_EQUATOR;
return new Pair<Double, Double>(x, y);
}
/**
* calculates longitude and latitude from a given starting point, with only the X/Y meters
* @param long0
* @param lat0
* @param x
* @param y
* @return
*/
public static Pair<Double, Double> longLatFromXY(int long0, int lat0, double x, double y) {
double lat1 = (y / DEGREE_DISTANCE_AT_EQUATOR) + (lat0 / 1E6);
double long1 = x / longitudeDistanceAtLatitude(lat0) + (long0 / 1E6);
return new Pair<Double, Double>(lat1, long1);
}