Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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街景中检查位置是否有效_Android_Google Maps Api 3 - Fatal编程技术网

如何在Android街景中检查位置是否有效

如何在Android街景中检查位置是否有效,android,google-maps-api-3,Android,Google Maps Api 3,我有一个应用程序,它根据定义的边界在谷歌地图上随机生成位置。所以我首先生成一个随机的LatLng,然后我验证这个点是否在我的边界内。如果是,它是有效的 Builder builder = new LatLngBounds.Builder(); double antartica[] = {-62.5670958528642, -59.92767333984375, -62.584805850293485, -59.98260498046875, -62.6145096365908

我有一个应用程序,它根据定义的边界在谷歌地图上随机生成位置。所以我首先生成一个随机的LatLng,然后我验证这个点是否在我的边界内。如果是,它是有效的

Builder builder = new LatLngBounds.Builder();

        double antartica[] = {-62.5670958528642, -59.92767333984375, -62.584805850293485, -59.98260498046875, -62.61450963659083};
        for (int i = 0; i < antartica.length; i++) {
            builder.include(new LatLng(antartica[i],antartica[++i]));
        }
        pAntarctica = builder.build();

LatLng point = generateRandomPosition();
    if(isWithinBoundaries(point))
        return point;
    else
        return getValidPoint();
但我希望只使用安卓系统。顺便说一下,我使用的是Google Play Services API,而不是Google Maps v2 Android

有人能解释一下吗

编辑: 根据拉塔纳的建议,我目前的情况如下:

svpView.getStreetViewPanoramaAsync(new OnStreetViewPanoramaReadyCallback() {
            @Override
            public void onStreetViewPanoramaReady(final StreetViewPanorama panorama) {
                for(final LatLng point : points) {
                    System.out.println(point.latitude + " " + point.longitude);     
                    panorama.setPosition(point, 1000);

                    final CountDownLatch latch = new CountDownLatch(1);

                    mHandlerMaps.post(new Runnable() {
                        @Override
                        public void run() {
                            if (panorama.getLocation() != null) {
                                System.out.println("not null " + panorama.getLocation().position);
                                writeToFile(panorama.getLocation().position.toString());
                                l.add(point);
                            }
                            latch.countDown();
                        }
                    });

                    try {
                        latch.await(4, TimeUnit.SECONDS);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(l.toString());
            }
        });

我搜索了很多关于这个问题的信息。最后我得到了一个有用的链接。请看,在android api中没有直接使用getPanoramaByLocation()javascript函数的方法。但这方面还有一项工作要做

我在这里提供url:

见案例:

  • 当您通过提供有效的lat/lng点击此url时。你会看到街景。因此,您可以使用该图像大小或内容来检查它是空白图像还是有效图像
  • 请参阅此url:

  • 在上面的url中,我传递了无效的lat/lng,这意味着此lat/lng没有街景,因此您可以使用“文本提取库”或通过检查文件大小。您将了解街景是否适用于该点
  • 点击url获取街景时,请检查此链接以获取响应:

    编辑:谷歌的官方答案是here(),其中指出:

    官方解决方案包括通过HTTPS使用官方谷歌街景图像API(免费,无限制)

    旧(已弃用)答案:

    我已经为这个问题拼凑了一个解决方案,这个解决方案很难看,但仍在API中,直到Google更新它,以允许像iOS SDK那样查询全景图

    这涉及到创建
    街景全景视图
    ,但不将其附着到布局,并将其位置设置为当前位置。然后测试它是否有一个全景位置

    这似乎可行,但将在Android Google Maps API V2(它是Google play services API的一部分)跟踪器上申请添加此功能,因为iOS SDK具有此功能

    // Handle on the panorama view
    private StreetViewPanoramaView svpView;
    
    ...
    
    // create a StreetViewPanoramaView in your fragment onCreateView or activity onCreate method
    // make sure to handle its lifecycle methods with the fragment or activity's as per the documentation - onResume, onPause, onDestroy, onSaveInstanceState, etc.
    StreetViewPanoramaOptions options = new StreetViewPanoramaOptions();
    svpView = new StreetViewPanoramaView(getActivity(), options);
    svpView.onCreate(savedInstanceState);
    
    ...
    
    // Snippet for when the map's location changes, query for street view panorama existence
    private Handler mHandler = new Handler();
    private static final int QUERY_DELAY_MS = 500;
    
    // When the map's location changes, set the panorama position to the map location
    svpView.getStreetViewPanorama().setPosition(mapLocationLatLng);
    
    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            if (svpView.getStreetViewPanorama().getLocation() != null) {
                // YOUR DESIRED ACTION HERE -- get the panoramaID, etc..
                // getLocation() -- a StreetViewPanoramaLocation -- will be null if there is no panorama
                // We have to delay this a bit because it may take some time before it loads
                // Note that adding an OnStreetViewPanoramaChangeListener doesn't seem to be reliably called after setPosition is called and there is a panorama -- possibly because it's not been added to the layout?
            }
        }
    }, QUERY_DELAY_MS);
    
    编辑:要使用新的异步API调用:

    svpView.getStreetViewPanoramaAsync(new OnStreetViewPanoramaReadyCallback() {
        @Override
        public void onStreetViewPanoramaReady(final StreetViewPanorama panorama) {
            panorama.setPosition(mapLocationLatLng, DEFAULT_SEARCH_RADIUS);
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (panorama.getLocation() != null) {
                        // your actions here
                    }
                }
            }, QUERY_DELAY_MS);
    

    对于我的街景应用程序,我创建了一个刮片应用程序作为配套,该刮片应用程序在给定半径的所有lat/lng位置上运行,并向街景查询全景

    该应用程序的输出是一个小型文本文件,以适合我需要的分辨率(5度)显示lat/lng位置。然后,我在主应用程序中使用此数据文件作为街景位置的源

    使用setposition(LatLng,radius)方法,我保证每次都能得到一个结果。该文件的大小也非常小,小于500kb


    我怀疑谷歌是否会发布街景的数据集(每次更新我的主应用之前,我都会运行我的抓取应用程序,以确保我有最新的值)。我不确定他们是否会提供具有以下特征的方法:布尔hasStreetView(LatLng,radius)。

    我已经创建了一个小型库(基于),让您(非常可靠地)检查StreetView是否适用于特定位置

  • 验证全景视图是否可用

    mStreetViewPanoramaView.getStreetViewPanoramaAsync(new OnStreetViewPanoramaReadyCallback() {
        @Override
        public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) {
            //Using setPositionWithRadius
            streetViewPanorama.setPosition(new LatLng(latitud, longitud), 200);
            mPanorama = streetViewPanorama;
    
            mPanorama.setOnStreetViewPanoramaChangeListener(new StreetViewPanorama.OnStreetViewPanoramaChangeListener() {
                @Override
                public void onStreetViewPanoramaChange(StreetViewPanoramaLocation streetViewPanoramaLocation) {
                    if (streetViewPanoramaLocation == null) {                            
                        Log.e("StreetViewActivity","Panoramic view not available");                            
                    }
                }
            });
        }
    });
    

  • 可能重复:另请参阅,以了解新的(可能更好的)解决方法。尝试很好,但我认为请求图像(大小为50x50 px的图像至少有2 KB)只是为了检查街景是否可用不是一个好主意。我不确定,但必须有一种通过宽度/高度来获得小尺寸图像的方法。所以尺寸会缩小。这确实是一个很好的尝试,但我会谨慎对待。想象一下,如果我生成1000个随机点,而这些点恰好在街景中都无效?我的应用程序中的用户体验将是可怕的:(我仍然没有找到一个很好的解决方案。我会为你的最后一条评论推荐缓存机制。因此它可能会把你带到你的目的地。@AlexVogel&Felipe Caldas根据你的最后一条评论,你接受我的回答吗?功能请求现在在谷歌的问题跟踪程序中-请在那里加上星号-这可能是最好的解决方案,所以。)r、 我一直在尝试让它工作,但到目前为止运气不佳。我发现getStreetViewPanorama已被弃用,现在应该使用getStreetViewPanorama异步()了。我正在尝试,但条件是(svpView.getStreetViewPanorama().getLocation()!=null)总是错误的。尽管我100%确定我正在测试一个在全景中有效的位置。有什么提示吗?非常感谢你的代码。它现在肯定可以工作了。我必须对它进行更改,因为我有一个带有随机Latling点的ArrayList,所以我需要迭代整个列表,但需要先等待postDelayed完成,然后再移动转到下一项。我已将这段代码添加到我的原始帖子中。它的工作效果不如预期。我在处理线程时遇到了困难。不过非常感谢。另请参见code.google.com/p/gmaps api issues/issues/detail?id=7033了解新的(可能更好的)问题解决方法。你有没有可能分享你的刮削应用程序的代码?抱歉@FelipeCaldas,我不能分享代码,但它会为地球上的每个点生成LatLng坐标,并检查该位置是否有街景图像。半径参数用于计算我生成的网格大小和相同的半径s被传递给streetview方法。嗨,安德鲁·凯利。没关系,谢谢。我正在使用一个代码生成随机LatLng,这很好。我在谷歌地图中测试的所有点实际上都是有效的,甚至在我定义的范围内。问题是当我使用@ratana代码试图在Panaroma中验证点时。它总是将null返回给me、 我让它运行了一个小时,甚至没有生成一个有效点。我很伤心:)我甚至现在正在考虑使用与PHP集成的JS Maps API创建一个javascript页面来提供数据。我只是不知道
    svpView.getStreetViewPanoramaAsync(new OnStreetViewPanoramaReadyCallback() {
        @Override
        public void onStreetViewPanoramaReady(final StreetViewPanorama panorama) {
            panorama.setPosition(mapLocationLatLng, DEFAULT_SEARCH_RADIUS);
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (panorama.getLocation() != null) {
                        // your actions here
                    }
                }
            }, QUERY_DELAY_MS);
    
    mStreetViewPanoramaView.getStreetViewPanoramaAsync(new OnStreetViewPanoramaReadyCallback() {
        @Override
        public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) {
            //Using setPositionWithRadius
            streetViewPanorama.setPosition(new LatLng(latitud, longitud), 200);
            mPanorama = streetViewPanorama;
    
            mPanorama.setOnStreetViewPanoramaChangeListener(new StreetViewPanorama.OnStreetViewPanoramaChangeListener() {
                @Override
                public void onStreetViewPanoramaChange(StreetViewPanoramaLocation streetViewPanoramaLocation) {
                    if (streetViewPanoramaLocation == null) {                            
                        Log.e("StreetViewActivity","Panoramic view not available");                            
                    }
                }
            });
        }
    });