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

113

我有一个应用程序,我想通过使用其特定地理坐标启动Google Maps来显示不同的位置(由用户输入选择一个)。

我目前正在使用以下代码(当然要替换为实际的纬度和经度值):

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

这正是我想要的,只是它没有显示指定点的任何指示器或标记。 它仅居中于其位置。

有没有办法在不使用MapView的情况下包含标记或其他东西?


2
标签在最近的地图更新中停止显示了..该怎么办? - user2297550
7个回答

262

试一下这个:

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

如果您不想要标签,可以省略(Label+Name),然后它会基于最近的街道或其他相关事物随机选择一个标签。


9
您需要将“?z”更改为“&z”。URI 中只能有一个问号。错误示例:geo:N,M?z=10?q=N,M(Place)正确示例:geo:N,M?z=10&q=N,M(Place) - Josh
3
Zoom被忽略是因为这是一个简单的查询而不是地理意图。这里发生的实际上是将一个普通查询发送给Google,然后服务器会响应对应的“搜索结果”。你可以尝试在maps.google.com上搜索<纬度>,<经度>(标签+名称),得到相同的结果。 - robpvn
4
使用这种(或者其他使用标记查询的)方法完全忽略了“geo:”部分中的地理点,正如robpvn指出的那样。在某些情况下,使用纬度/经度进行查询会失败,然后您只会收到一个“无结果”的提示,而不是回退到地理点。对于任何GIS应用程序都不是很有用。 - Geobits
此功能在新版Google Maps 7.x中已经失效,请参见https://code.google.com/p/android/issues/detail?id=58507。 - ATom
1
这不再起作用了.. 标签没有显示。 - user2297550
显示剩余6条评论

51

有许多选项可以使用意图来启动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);

似乎对于"&iwloc=A&hl=es"并不是必需的。 - Olivier de Jonge
"iwloc"代表信息窗口位置,"hl"代表语言,如果您没有设置这些值,则会应用默认值。=) - Jorgesys
你在第二个方法里少写了一个 ) - Sen
糟糕!第二和第三个选项!谢谢,我已经修复了它们!ᕦ ´• ᴥ •` ᕥ @Baras - Jorgesys

45

除非您的标签中有一个&(&符号),否则接受的答案是正确的。

参考地理位置统一资源标识符('geo' 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中已经失效,请参见https://code.google.com/p/android/issues/detail?id=58507。 - ATom

6

这个字符串对我来说很有效:

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的叠加层来在地图上绘制标记。如果您的视图显示了地图,那么可能可以简单地在屏幕中心绘制标记,就像在View上绘制任何图像一样。

然而,该标记将不会与实际的地图坐标相关联,但如果它只是一个静态视图,那么这可能足够了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接