Определить существование функции Google Streetview
Есть ли способ узнать, доступна ли панорама Google Streetview из приложения Android (т.е. с использованием Java).
Никаких альтернатив не существует для PHP или Python или других серверных технологий.
Воздействие вызова Google Streetview, где нет панорамы, - это просто черный экран и "вращающаяся вещь".
Ответы
Ответ 1
Я создал небольшой взлом для этого.:)
strings.xml
<string name="html_streetview"> <![CDATA[
<html>
<head>
<script src="http://maps.google.com/maps/api/js?v=3&sensor=false" type="text/javascript"></script>
</head>
<body>
<script type="text/javascript">
Android.echo();
var testPoint = new google.maps.LatLng(%1$s, %2$s,true);
var svClient = new google.maps.StreetViewService();
svClient.getPanoramaByLocation(testPoint, 50,function (panoramaData, status) {
if (status == google.maps.StreetViewStatus.OK) {
Android.hasStreetview();
} else {
Android.hasNotStreetview();
}
});
</script>
</body>
</html>
]]>
</string>
теперь добавьте кнопку для просмотра улиц в действии и поместите следующий код в метод onclick:
if (webView == null) {
webView = new WebView(this);
webView.setVisibility(View.INVISIBLE);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JavascriptCheck(this), "Android");
webView.setWebViewClient(new WebViewClient() {
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Toast.makeText(this, "Streetview loading", Toast.LENGTH_SHORT).show();
super.onReceivedError(view, errorCode, description, failingUrl);
}
});
}
Toast.makeText(this, "Streetview loading", Toast.LENGTH_SHORT).show();
webView.loadDataWithBaseURL(baseurl,
getString(R.string.html_streetview, latitude, longitude), "text/html", "UTF-8", baseurl);
И теперь внутренний класс действия:
public class JavascriptCheck {
private final Context context;
public JavascriptCheck(Context context) {
this.context = context;
}
public void echo() {
Log.d("JavascriptChecker", "javascript called");
}
public void hasStreetview() {
pushStreetviewState(true);
}
public void hasNotStreetview() {
pushStreetviewState(false);
}
private void pushStreetviewState(final boolean hasStreetview) {
Log.d("JavascriptChecker", hasStreetview);
// TODO do your stuff needed here
}
}
Это довольно плохое решение, но, вероятно, может помочь.:)
Ответ 2
Чтобы получить отличный ответ от alos, вот script, который вернет вам необходимый угол, чтобы уличное шоу запустилось, указав правильные координаты:
<string name="html_streetview_bearing"> <![CDATA[
<html>
<head>
<script src="http://maps.google.com/maps/api/js?v=3&sensor=false" type="text/javascript"></script>
</head>
<body>
<script type=\"text/javascript\">
var testPoint = new google.maps.LatLng(%1$s, %2$s,true);
var svClient = new google.maps.StreetViewService();
svClient.getPanoramaByLocation(testPoint,100,function (camera, status) {
if(camera!=null) {
var location = camera.location;
var latLng = location.latLng;
lat2 = latLng.lat();
lon2 = latLng.lng();
lat1 = testPoint.lat();
lon1 = testPoint.lng();
var dLon = lon1 - lon2;
var y = Math.sin(dLon) * Math.cos(lat2);
var x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);
var bearing = Math.atan2(y, x) * (180 / Math.PI);
Android.setStreetviewAngle(bearing);
}
}
);
</script>
</body>
</html>
]]>
</string>
Примечание. Возвращаемое значение необходимо изменить, чтобы
bearing = (bearing + 180) % 360;
чтобы дать вам правильное окончательное значение. Я делаю это в собственном коде.
ОБНОВЛЕНО ОТВЕТ: Теперь работаем над Android 3.0 и выше.
Ответ 3
Спасибо святой Алосу и steemcb, я застрял с видом на улицу, показывая неправильное свойство или пустой экран. Я надеюсь, что google выйдет с родным SDK для Android, до тех пор и ваши коды ROX!!
Мне пришлось сделать несколько настроек, прежде чем я смогу использовать код. Вот моя реализация.
strings.xml
<string formatted="false" name="html_streetview">
<html>
<head>
<script src=\"http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=false\" type=\"text/javascript\"/>
</head>
<body>
<script type=\"text/javascript\">
var testPoint = new GLatLng(%1$s, %2$s);
var svClient = new GStreetviewClient();
svClient.getNearestPanoramaLatLng(testPoint,function(camera){
if (camera !== null){
lat2 = camera.lat();
lon2 = camera.lng();
lat1 = testPoint.lat();
lon1 = testPoint.lng();
dLon = lon1 - lon2;
y = Math.sin(dLon) * Math.cos(lat2);
x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);
var bearing = Math.atan2(y, x) * (180 / Math.PI);
//had to get rid of this line it was causing formatting exceptions
// I moved this logic to the inner class
//bearing = (bearing + 180) % 360;
Android.setStreetViewAngle(bearing);
}
//had trouble with bearing taking long to calculate and end up with 0.0 value in the uri. So I put it in here after when bearing is calculated. Not pretty.. but it works for me
svClient.getNearestPanoramaLatLng(testPoint, function (nearest) {
if ((nearest !== null) && (testPoint.distanceFrom(nearest) <= 100)) {
Android.hasStreetview(true);
}
else {
Android.hasStreetview(false);
}
});
});
</script>
</body>
</html>
</string>
Частный внутренний класс
private final Context context;
private double bearing;
public JavascriptCheck(Context context) {
this.context = context;
}
public void hasStreetview(boolean hasStreetview) {
if (hasStreetview) {
String uri = "google.streetview:cbll=" + propDetailInfo.getLatitude() + "," + propDetailInfo.getLongitude() +
"&cbp=1,"+ bearing + ",,1,1.0&mz=14";
Utils.printDebug("URI: " + uri);
Intent streetView = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(streetView);
} else {
Toast.makeText(context, "Sorry Streetview not available for this address", Toast.LENGTH_LONG).show();
}
}
public void setStreetViewAngle(double bearing){
bearing = (bearing + 180) % 360;
this.bearing = bearing;
}
public void toast(String part) {
Toast.makeText(context, part, Toast.LENGTH_SHORT).show();
}
}
Ответ 4
Для этого можно использовать API-интерфейс Google Street View Image, чтобы проверить, существует ли Google Street View или нет.
https://developers.google.com/maps/documentation/streetview/
Он возвращает изображение с другим размером файла, когда вид улиц в определенных координатах существует, чем когда он не
http://maps.googleapis.com/maps/api/streetview?size=400x400&location=40.720032,%20-73.988354&fov=90&heading=235&pitch=10&sensor=false
Вы можете сравнить эти изображения и проверить, существует ли это.