当前位置: 首页 > 知识库问答 >
问题:

Google Maps toScreenLocation()方法Android出现问题

太叔睿
2023-03-14

正如标题所提到的,我在使用Google地图的toScreen位置()时遇到了问题。

我试图在谷歌地图上选取任意点,并将其广播到我的谷歌地图片段。在片段中,我想得到这个LatLng坐标对应的屏幕点。但是,大多数情况下,我会遇到如下错误:

Caused by: java.lang.IllegalArgumentException: left == right
        at android.opengl.Matrix.frustumM(Matrix.java:327)
        at com.google.maps.api.android.lib6.gmm6.o.b.b.j(Unknown Source)
        at com.google.maps.api.android.lib6.gmm6.o.b.b.l(Unknown Source)
        at com.google.maps.api.android.lib6.gmm6.o.b.b.a(Unknown Source)
        at com.google.maps.api.android.lib6.gmm6.o.b.b.c(Unknown Source)
        at com.google.maps.api.android.lib6.gmm6.c.y.a(Unknown Source)
        at com.google.maps.api.android.lib6.c.az.a(Unknown Source)
        at com.google.android.gms.maps.internal.ca.onTransact(SourceFile:74)
        at android.os.Binder.transact(Binder.java:380)
        at com.google.android.gms.maps.internal.IProjectionDelegate$zza$zza.toScreenLocation(Unknown Source)
        at com.google.android.gms.maps.Projection.toScreenLocation(Unknown Source)
        at com.example.tracker.googlemaps.GoogleMapsTracker.convertCoordinates(GoogleMapsTracker.java:163)
        at com.example.tracker.googlemaps.GoogleMapsTracker.access$100(GoogleMapsTracker.java:38)
        at com.example.tracker.googlemaps.GoogleMapsTracker$2.onReceive(GoogleMapsTracker.java:153)
        at     android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:866)

与转换对应的代码是:

    private void convertCoordinates(float latitude, float longitude){
    location = new LatLng(latitude, longitude);
    if(location.latitude != (float) 0.0 || location.longitude != (float) 0.0){
        //Point map = mapView.getMap().getProjection().toScreenLocation(location);

        Point map = projection.toScreenLocation(location);
        ScreenAdjustments.setLati(map.y);
        ScreenAdjustments.setLongi(map.x);
    } else {
        Log.e(TAG, "BAD COORDINATES!!!");
    }
}

我已经验证了我正在获取浮点值,并且它们是我硬编码的。但大多数情况下,当它到达Point map=projection.toScreenloce(位置)时;它会抛出有关截头体的错误。

我需要帮助来弄清楚如何让它工作。

共有1个答案

魏鸿
2023-03-14

我第一次尝试了你的代码,没有出错。

根据这里的情况,我厌倦了ScreenLocation,它可以正常工作。请记住设置OnGlobalLayoutListener以确保地图视图并等待布局过程结束。

示例代码:

public class MainActivity extends FragmentActivity {

    GoogleMap mGoogleMap;
    private static LatLng MountainView = new LatLng(37.42, -122.08);
    private static LatLng MountainView2 = new LatLng(37.421, -122.081);
    View mapView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        // Initial Map
        try {

            if (mGoogleMap == null) {
                mGoogleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        mapView = getSupportFragmentManager().findFragmentById(R.id.map).getView();

        mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
        mGoogleMap.getUiSettings().setZoomControlsEnabled(true);
        mGoogleMap.getUiSettings().setZoomGesturesEnabled(true);

        //mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(MountainView, 15));

        Marker marker = mGoogleMap.addMarker(new MarkerOptions()
                .position(MountainView)
                .title("Have a nice day!"));

        convertCoordinates((float) 37.42, (float) -122.08);

    }

    private void convertCoordinates(float latitude, float longitude) {
        final LatLng location = new LatLng(latitude, longitude);
        if (location.latitude != (float) 0.0 || location.longitude != (float) 0.0) {
            if (mapView.getViewTreeObserver().isAlive()) {
                mapView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        // remove the listener
                        // ! before Jelly Bean:
                        mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                        // ! for Jelly Bean and later:
                        //mapView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                        // set map viewport
                        // CENTER is LatLng object with the center of the map
                        mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 15));
                        // ! you can query Projection object here
                        Point markerScreenPosition = mGoogleMap.getProjection().toScreenLocation(location);
                        // ! example output in my test code: (356, 483)
                        Log.d("x!!!!", markerScreenPosition.x + "");
                        Log.d("y!!!!", markerScreenPosition.y + "");
                    }
                });

            } else {
                //Log.e(TAG, "BAD COORDINATES!!!");
            }
        }
    }
}

在我的Nexus 6上,它工作正常,输出为x=639,y=1049。

 类似资料:
  • 本文向大家介绍解决Python出现_warn_unsafe_extraction问题的方法,包括了解决Python出现_warn_unsafe_extraction问题的方法的使用技巧和注意事项,需要的朋友参考一下 在Python项目中运行出现了“AttributeError: ResourceManager instance has no attribute ‘_warn_unsafe_extr

  • 本文向大家介绍Android 出现问题Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER解决办法,包括了Android 出现问题Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER解决办法的使用技巧和注意事项,需要的朋友参考一下 Android 出现问题Installation e

  • 我遇到了这样的问题 w/YouTubeAndroidPlayerAPI:强制创建的覆盖:acqm@6b45523帮助器:lazy@8cb1a20视图:空状态:.......{...} 在Recycleview中实现

  • 本文向大家介绍Android实现弹出键盘的方法,包括了Android实现弹出键盘的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android实现弹出键盘代码,是一个非常实用的功能。代码非常简洁。分享给大家供大家参考。 具体功能代码如下: 希望本文所述对大家Android程序设计的学习有所帮助。

  • 本文向大家介绍Android双击退出的实现方法,包括了Android双击退出的实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android双击退出的实现方法。分享给大家供大家参考。具体实现方法如下: 方式一: 重写onBackPressed方法直接监听返回键(建议高版本用2.0以上) 方式二: (推荐使用) 希望本文所述对大家的Android程序设计有所帮助。

  • 我正在创建一个程序,它从一个文件中获取输入(在我的例子中,是学生姓名及其相关联的编号),并以预购形式(使用/iterator)、后置+后置形式(使用/recursive)打印出来。在我的驱动程序中,我已经成功地创建和添加了学生的名字+关联号码+用预购迭代器打印出来。然而,我的问题是当我尝试打印这两个递归方法时,我得到一个“Void type not allowed here”错误。这两个方法存储在