【发布时间】:2011-09-15 00:17:44
【问题描述】:
我创建了这篇文章 -> plot a real world lat lon into different angle still image map
据此,我可以在给定两 (2) 个坐标(左上、右下)的情况下成功标记给定的纬度和经度,但由于静止图像地图的角度与现实世界地图角度相比不正确,我的标记被移位了。
现在,我正在考虑使用图像的四 (4) 个坐标(左上、左下、右上、右下)。因此,我可以在不考虑角度的情况下绘制给定的 lat&lon。
我认为,即使没有 Android 经验也可以回答这个问题。我只是在数学问题上有点慢。
有可能实现吗?如果是,任何指导和代码 sn-ps 表示赞赏。
更新1 主要目标是将给定的纬度和经度标记为与现实世界地图具有不同角度的图像地图。
更新2 我正在使用以下代码来计算我的角度。你会检查它是否可靠地获得角度。然后将其转换为像素。 注意:此代码仅使用图像的两个坐标加上目标坐标。
public static double[] calc_xy (double imageSize, Location target, Location upperLeft, Location upperRight) {
double newAngle = -1;
try {
double angle = calc_radian(upperRight.getLongitude(), upperRight.getLatitude(),
upperLeft.getLongitude(), upperLeft.getLatitude(),
target.getLongitude(), target.getLatitude());
newAngle = 180-angle;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
double upperLeft_Target_dist = upperLeft.distanceTo(target);
double upperLeft_Right_dist = upperLeft.distanceTo(upperRight);
double distancePerPx = imageSize /upperLeft_Right_dist;
double distance = upperLeft_Target_dist * distancePerPx;
double radian = newAngle * Math.PI/180;
double[] result = radToPixel(distance, radian);
return result;
}
public static double[] radToPixel(double distance, double radian) {
double[] result = {-1,-1};
result[Functions.Location.PIXEL_X_LON] = distance * Math.cos(radian);
result[Functions.Location.PIXEL_Y_LAT] = distance * Math.sin(radian);
return result;
}
public static double calc_radian(Double x1, Double y1, Double x2, Double y2, Double x3, Double y3)
throws Exception{
double rad = 0.0;
if((Double.compare(x1, x2) == 0 && Double.compare(y1, y2) == 0) ||
(Double.compare(x3, x2) == 0 && Double.compare(y3, y2) == 0))
{
Log.d(tag, "Same place") ;
return rad;
}
/* compute vector */
double BAx = x2 - x1;
double BAy = y2 - y1;
double BCx = x3 - x2;
double BCy = y3 - y2;
double cosA = BAx / Math.sqrt( BAx * BAx + BAy * BAy ) ;
double cosC = BCx / Math.sqrt( BCx * BCx + BCy * BCy ) ;
double radA = Math.acos( cosA ) * 180.0 / Math.PI ;
double radC = Math.acos( cosC ) * 180.0 / Math.PI ;
if( BAy < 0.0 )
{
radA = radA * -1.0 ;
}
if( BCy < 0.0 )
{
radC = radC * -1.0 ;
}
rad = radC - radA ;
if( rad > 180.0 )
{
rad = rad - 360;
}
if( rad < -180.0 )
{
rad = rad + 360;
}
return rad ;
}
【问题讨论】:
-
看起来角度可能是恒定的。如果是这种情况,您可以简单地对每个纬度/经度点应用变换。
-
实际上,我认为保持点静止并旋转图像可能会更好。您可以将其旋转到与手持设备的方向一致。
-
@John J Smith ,1) 角度是恒定的。你能帮我应用纬度/经度点的变换吗? 2)轮换方法似乎是最好的方法。如果我们不能转换纬度/经度,我会试试这个……看来这些是我帖子的答案。你会把它作为答案发布吗?这样,人们就可以投票了。
-
有人使用自定义地图让这些方法正常工作吗?
标签: android map geolocation location coordinates