15

我有一个应用程序根据定义的边界在 GoogleMaps 中随机生成位置。因此,我首先生成一个随机 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();

所以在此之后,我得到了有效的观点。我的问题是谷歌地图中的有效点在街景中不一定有效。

这个随机点可能位于地球上尚未在街景中映射的某个位置。我也需要它在那里有效。

我知道您可以使用此链接后的 JavaScript API v3 来完成此操作。

你会做这样的事情:

var latLng = new google.maps.LatLng(12.121221, 78.121212);
            streetViewService.getPanoramaByLocation(latLng, STREETVIEW_MAX_DISTANCE, function (streetViewPanoramaData, status) {
                if (status === google.maps.StreetViewStatus.OK) {
                    //ok
                } else {
                    //no ok
                }
            });

但我希望仅使用 Android 来执行此操作。顺便说一句,我使用的是 Google Play Services API,而不是Google Maps v2 Android。

任何人都可以解释一下吗?

编辑: 按照ratana的建议,这是我目前所拥有的:

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());
            }
        });
4

5 回答 5

6
@Override
public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) {
    mPanorama.setOnStreetViewPanoramaChangeListener(new StreetViewPanorama.OnStreetViewPanoramaChangeListener() {
@Override
public void onStreetViewPanoramaChange(StreetViewPanoramaLocation streetViewPanoramaLocation) {
    if (streetViewPanoramaLocation != null && streetViewPanoramaLocation.links != null) {
        // location is present
    } else {
        // location not available
    }
}
 });

编辑:谷歌的官方答案在这里(https://code.google.com/p/gmaps-api-issues/issues/detail?id=7033),它指向这里: https ://code.google.com/p /gmaps-api-issues/issues/detail?id=4823

官方解决方案涉及通过 HTTPS使用官方 Google Street View Image API(免费,无限制 - https://developers.google.com/maps/documentation/streetview/metadata )。

旧(已弃用)答案:

我已经为此解决了一个丑陋但保留在 API 中的解决方法,直到 Google 对其进行更新以允许以 iOS SDK 的方式查询全景图。

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

这似乎可行,但将在 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);

于 2014-08-22T00:49:37.877 回答
5

我用谷歌搜索了很多这个问题。最后我得到了一个有用的链接。请参阅在 android api 中没有直接使用 getPanoramaByLocation() javascript 函数的方法。但是有一个解决方法。

我在这里提供网址:

http://maps.googleapis.com/maps/api/streetview?size=400x400&location=40.720032,-73.988354&fov=90&heading=235&pitch=10

见案例:

  1. 当您通过提供有效的纬度/经度点击此网址时。你会得到街景。因此,您可以使用该图像大小或内容来检查它是空白图像还是有效图像。

看到这个网址:

http://maps.googleapis.com/maps/api/streetview?size=400x400&location=73.67868,-73.988354&fov=90&heading=235&pitch=10

  1. 在上面的 url 中,我传递了无效的 lat/lng 意味着对于这个 lat/lng 没有街景,因此您可以使用“文本提取库”或检查文件大小。您将了解该点是否可以使用街景

当您点击 url 以获取 streetview 时,请检查此链接以获得响应:

https://developers.google.com/maps/documentation/geocoding/?hl=nl

于 2014-07-31T13:20:39.910 回答
3

我创建了一个小型库(基于VVB 的回答),它可以让您(非常可靠地)检查 StreetView 是否可用于特定位置。

随意检查一下。

街景探测器

于 2015-06-01T08:25:43.297 回答
1
  1. 验证可用的全景视图

    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");                            
                    }
                }
            });
        }
    });
    
于 2019-03-19T21:56:05.640 回答
0

对于我的街景应用程序,我构建了一个抓取应用程序作为伴侣,这个抓取应用程序遍历给定半径内的所有纬度/经度位置,并查询街景视图以获取全景图。

这个应用程序的输出是一个包含 lat/lng 位置的小文本文件,其分辨率适合我的需要(5 度)。然后,我在我的主应用程序中使用此数据文件作为 StreetView 位置的来源。

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

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

于 2014-08-26T03:06:25.890 回答