Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-在自定义地图上绘制gps坐标_Android_Gps_Android Canvas - Fatal编程技术网

Android-在自定义地图上绘制gps坐标

Android-在自定义地图上绘制gps坐标,android,gps,android-canvas,Android,Gps,Android Canvas,我的应用程序中有一个活动,其中有我用作地图的图像。如果图像与谷歌地图“网格对齐”,那么当我使用从谷歌地图在线获取的地图的左上角和右下角时,我可以将用户的gps变成屏幕上的x和y。但是,如果地图没有“网格对齐”,并且角度大于“我的数学”返回的值,则会将用户的位置绘制到屏幕外。很明显,我遗漏了关于如何处理地图角度的部分,所以如果有人能解释一下如何做到这一点,那将是非常有帮助的 我知道我必须计算出以弧度为单位的角度,并进行一些转换,但我不知道从哪里开始。到目前为止,这是我用来在画布上绘制x和y的 pu

我的应用程序中有一个活动,其中有我用作地图的图像。如果图像与谷歌地图“网格对齐”,那么当我使用从谷歌地图在线获取的地图的左上角和右下角时,我可以将用户的gps变成屏幕上的x和y。但是,如果地图没有“网格对齐”,并且角度大于“我的数学”返回的值,则会将用户的位置绘制到屏幕外。很明显,我遗漏了关于如何处理地图角度的部分,所以如果有人能解释一下如何做到这一点,那将是非常有帮助的

我知道我必须计算出以弧度为单位的角度,并进行一些转换,但我不知道从哪里开始。到目前为止,这是我用来在画布上绘制x和y的

public double[] getPositionGPS(Location upperLeft, Location lowerRight, Location current){

    try{

        double hypotenuse = upperLeft.distanceTo(current);
        double bearing = upperLeft.bearingTo(current);
        double currentDistanceY = Math.cos(bearing * Math.PI / OneEightyDeg) * hypotenuse;
        //                           "percentage to mark the position"
        double totalHypotenuse = upperLeft.distanceTo(lowerRight);
        double totalDistanceY = totalHypotenuse * Math.cos(upperLeft.bearingTo(lowerRight) * Math.PI / OneEightyDeg);
        double currentPixelY = currentDistanceY / totalDistanceY * ImageSizeH;

        double hypotenuse2 = upperLeft.distanceTo(current);
        double bearing2 = upperLeft.bearingTo(current);
        double currentDistanceX = Math.sin(bearing2 * Math.PI / OneEightyDeg) * hypotenuse2;
        //                           "percentage to mark the position"
        double totalHypotenuse2 = upperLeft.distanceTo(lowerRight);
        double totalDistanceX = totalHypotenuse2 * Math.sin(upperLeft.bearingTo(lowerRight) * Math.PI / OneEightyDeg);
        double currentPixelX = currentDistanceX / totalDistanceX * ImageSizeW;

        return new double[]{currentPixelX, currentPixelY};

    }catch(Exception e){

        e.printStackTrace();
        return new double[]{0,0};

    }

我不确定我是否理解了你的问题,但是你不能像这样从API获取(X,Y)位置吗

// myMap is a GoogleMap instance and location is a Location instance
Projection projection = myMap.getProjection();
LatLng latlng = new LatLng(location.getLatitude(), location.getLongitude());
Point pointInTheScreen = projection.toScreenLocation(latlng);

请参阅API以了解更多信息。

首先,将您的google地图坐标映射到您的自定义图像,就好像图像没有角度一样。这里您基本上是在处理缩放和偏移。假设你得到的坐标是
(x,y)

然后,根据以下矩阵旋转坐标:。因为您已经知道角度,所以您知道/可以计算自定义贴图围绕的中心点坐标。假设它是
(a,b)
。具体而言:

1) 将地图坐标
(x,y)
转换为基于坐标的坐标
(0,0)
(x-a,y-b)

2) 使用该矩阵旋转,您将获得一个新坐标
(x',y')


3) 将其返回到基于坐标的
(a,b)
(x'+a,y'+b)

您可以使用一个(又名指南针)获取设备的方向,并使用它将自定义视图与地图“网格对齐”。

是的,您可以绘制不在可见地图上的点。通过设置LatLngBounds来解决这个问题。然后显示LatLngBounds的地图。也可以移动地图以显示LatLngBounds。这里并没有什么棘手的问题,并没有切线、斜率或地球的双曲曲率。所有这些都以度为单位,所以不要过度考虑你的解决方案。如果你转动地图,点也会随之转动。因此,将你的点添加到地图中,找到边界并倾斜相机。将相机向后倾斜,所有点仍将显示在屏幕上!这将让你们从屏幕上的所有点开始

LatLng myLatLng = new LatLng(latitude, longitude);
myLatLngBuilder.include(myLatLng);
与示例相同,获取对谷歌地图的引用

private void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the
    // map.

    if (mMap == null) {
        // Try to obtain the map from the SupportMapFragment.
        // mMap = mMapFragment.getMap();
        // // Check if we were successful in obtaining the map.

        // Try to obtain the map from the SupportMapFragment.
        mMap = ((SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map)).getMap();
        // use the settings maptype

        // Check if we were successful in obtaining the map.
        if (mMap != null) {
            setUpMap();
        }
    }
}
让我们开始寻找地图的边界

import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds;
LatLngBounds字段和LatLngBounds.Builder

private LatLngBounds bounds;
private LatLngBounds.Builder myLatLngBuilder;
初始化LatLngBounds.Builder

myLatLngBuilder = new LatLngBounds.Builder();
对于地图上的每个点

LatLng myLatLng = new LatLng(latitude, longitude);
myLatLngBuilder.include(myLatLng);
然后,在完成添加点后,构建边界

bounds = myLatLngBuilder.build();
现在我有了地图上所有点的边界,我可以只显示地图上的那个区域。这是我从地图样本中提取的代码

final View mapView = getSupportFragmentManager().findFragmentById(
            R.id.map).getView();
    if (mapView.getViewTreeObserver().isAlive()) {
        mapView.getViewTreeObserver().addOnGlobalLayoutListener(
                new OnGlobalLayoutListener() {
                    @SuppressWarnings("deprecation")
                    // We use the new method when supported
                    @SuppressLint("NewApi")
                    // We check which build version we are using.
                    @Override
                    public void onGlobalLayout() {
                        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                            mapView.getViewTreeObserver()
                                    .removeGlobalOnLayoutListener(this);
                        } else {
                            mapView.getViewTreeObserver()
                                    .removeOnGlobalLayoutListener(this);
                        }
                        mMap.moveCamera(CameraUpdateFactory
                                .newLatLngBounds(bounds, 50));
                    }
                });
    }
final View mapView=getSupportFragmentManager().findFragmentById(
R.id.map);
如果(mapView.getViewTreeObserver().isAlive()){
mapView.getViewTreeObserver().addOnGlobalLayoutListener(
新OnGlobalLayoutListener(){
@抑制警告(“弃用”)
//我们在得到支持时使用新方法
@SuppressLint(“新API”)
//我们检查正在使用的构建版本。
@凌驾
公共图书馆{
if(Build.VERSION.SDK\u INT
这就是我的应用程序Bestrides KML Reader显示地图的基本方式,这样屏幕上就不会出现任何点

祝你好运
Danny117

我可能完全错了,但我认为这是一种获得旋转角度(或可能是4个角)的方法:

  • 获取右下角和左上角之间的角度alpha。我猜这等于
    180-右下角。bearingTo(左上)
    EDIT(这个等式应该取决于屏幕的象限)
  • 使用X,Y(屏幕)坐标获得斜边和下边缘之间的角度theta。我猜(再次)这个角度的正弦等于:
    (高度)/((高度^2)+(宽度^2))^1/2
  • 现在旋转角度等于θ-alpha
  • 如果要将其可视化,请执行以下操作:


    我没有使用谷歌地图api。我在一个自定义的图像视图中绘制了所有这些,这个视图可以通过收缩和缩放进行缩放,我可以使用画布在图像上绘制。关于你的建议,我有几个问题。首先,我没有使用谷歌地图,所以我没有谷歌地图坐标。不过,我确实知道设备的位置。第二,如何将地图坐标转换为基于0,0的坐标?以什么方式?当我决定在哪里画的时候,它基本上已经是x,y了。你是说要做我在问题中的数学运算,取x,y,然后变换它?还有a、b……这些是我用作地图的图像中心吗?@Jamesandresakis问题是,你需要弄清楚自定义地图是如何旋转的。因此,如果它只是在屏幕上旋转,那么(a,b)将是图像的中心点,因为图像是以(a,b)为轴心旋转的。在这种情况下,(0,0)将是屏幕的左上角。因此,您可以使网格对齐坐标,并将其映射到画布上,就像它太网格对齐一样,然后通过旋转变换坐标,绘制最终结果。@Jamesandresakis您不必转换为(0,0)