如何在由geo URI Intent启动的地图中显示标记?


107

我有一个应用程序,通过启动具有特定地理位置的Google地图,可以显示不同的位置(一次由用户输入选择)。

我目前正在使用它(当然具有真实的纬度和经度值):

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:<lat>,<long>?z=17"));
startActivity(intent);

它完全是我想要的,除了它不显示指定点的任何指示器或标记。它仅在其位置居中。

是否有某种方法可以在不使用MapView的情况下获得标记或其他内容?


该标签已停止在最新的地图更新中显示。.该怎么办?
user2297550

Answers:


253

试试这个:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:<lat>,<long>?q=<lat>,<long>(Label+Name)"));
startActivity(intent);

如果您不想要标签,则可以省略(Label + Name),它会根据最近的街道或它认为相关的其他内容随机选择一个。


实现此URI后,我在设置缩放时遇到问题。现在看来已经过时了
LuckyMalaka 2012年

8
@mmm ...:您需要将?z更改为&z。你只能有一个?在一个uri中。不好:geo:N,M?z = 10?q = N,M(Place)良好:geo:N,M?z = 10&q = N,M(Place)
Josh

没有缩放仍然不起作用(但是带有标签的东西却没有)。另外,如果地图找不到任何相关内容(即使我们提供了标签),也会显示烤面包错误。该解决方案有效,但仅是半最佳的。
Warpzit 2012年

3
缩放被忽略,因为这是一个简单的查询,而不是地理意图。实际上发生的是发送给Google的普通查询,然后服务器以与之相对应的“搜索结果”进行响应。您可以尝试在maps.google.com上搜索<lat>,<long>(Label + Name)并获得相同的结果
robpvn 2013年

4
geo:lke robpvn指出,使用此方法(或此处涉及标记查询的任何其他方法)完全忽略了该部分中的地理位置。在某些情况下,使用纬度/经度查询将失败,然后您只会得到“无结果”吐司,而不是回落到geopoint。对于任何类型的GIS应用程序都不太有用。
Geobits,2013年

45

可接受的答案是正确的,除非您的标签上带有“&”号。

纵观统一资源标识符地理位置的(“地理” URI)

第5.1节规定:

如果最终URI要包括“查询”组件,请添加组件定界符“?” 到结果的末尾,然后是编码的查询字符串。

对于我们来说不幸的是,这样做也将逃脱我们不想要的'='。

我们应该这样做:

String label = "Cinnamon & Toast";
String uriBegin = "geo:12,34";
String query = "12,34(" + label + ")";
String encodedQuery = Uri.encode(query);
String uriString = uriBegin + "?q=" + encodedQuery;
Uri uri = Uri.parse(uriString);
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, uri);
startActivity(intent);

2
此功能在新的Google Maps 7.x中已被打破,请参见code.google.com/p/android/issues/detail?id=58507
ATom 2013年

42

还有更多选择可以使用意图启动Google地图...

   Double myLatitude = 44.433106;
   Double myLongitude = 26.103687;
   String labelLocation = "Jorgesys @ Bucharest";

1)

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:<" + myLatitude  + ">,<" + myLongitude + ">?q=<" + myLatitude  + ">,<" + myLongitude + ">(" + labelLocation + ")"));
    startActivity(intent);

2)

String urlAddress = "http://maps.google.com/maps?q="+ myLatitude  +"," + myLongitude +"("+ labelLocation + ")&iwloc=A&hl=es";
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlAddress));
    startActivity(intent);

3)

   String urlAddress = "http://maps.googleapis.com/maps/api/streetview?size=500x500&location=" + myLatitude  + "," + myLongitude + "&fov=90&heading=235&pitch=10&sensor=false";
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlAddress));
        startActivity(intent);

看起来像2)确实不需要“&iwloc = A&hl = es”
Olivier de Jonge

“ iwloc”代表信息窗口位置,“ hl”代表语言,如果您未设置此值,则应用默认值。=)
Jorgesys

你错过)了第二条路。

UPS!第二和第三选择!谢谢,我都固定了!Bar –•ᴥ•`ᕥ@Baras
Jorgesys

5

这个字符串对我来说很好:

String geoUriString="geo:"+lat+","+lon+"?q=("+head+")@"+lat+","+lon;
Uri geoUri = Uri.parse(geoUriString);
Log.e(TAG, "String: "+geoUriString);
Intent mapCall  = new Intent(Intent.ACTION_VIEW, geoUri);
startActivity(mapCall);

2

尝试将(LocationMarkerName)附加到geo:uri。例如,“ geo:,?z = 17(LocationMarkerName)”

在Android上的Google Maps中搜索23.0980,30.6797(NamedMarker)时,似乎将地图居中并在该位置放置名称为NamedMarker的标记。


1

我刚刚确认了@Kenton Price的以下代码段仍适用于Android 4.4(KitKat):

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:<lat>,<long>?q=<lat>,<long>(Label+Name)"));
startActivity(intent);

0

我仅将MapView和Overlay一起用于在地图顶部绘制标记。如果您的视图正在显示地图,则可以像在视图上绘制任何图像一样,只需在屏幕中央绘制标记即可。

但是,标记不会链接到实际的地图坐标,但是如果只是静态视图,则可能会这样做。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.