如何在Android街景中检查位置是否有效
我有一个应用程序,它根据定义的边界在谷歌地图上随机生成位置。所以我首先生成一个随机的LatLng,然后我验证这个点是否在我的边界内。如果是,它是有效的如何在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
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: 见案例:
街景全景视图
,但不将其附着到布局,并将其位置设置为当前位置。然后测试它是否有一个全景位置
这似乎可行,但将在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");
}
}
});
}
});