Làm cách nào để hiển thị điểm đánh dấu trong Bản đồ do Ý định URI địa lý khởi chạy?


107

Tôi có một ứng dụng mà tôi muốn hiển thị các vị trí khác nhau (tại một thời điểm, do người dùng nhập vào) bằng cách khởi chạy Google Maps với các tọa độ địa lý cụ thể của chúng.

Tôi hiện đang sử dụng cái này (tất nhiên là với giá trị vĩ độ thực và dài.):

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

Nó khá chính xác những gì tôi muốn, ngoại trừ việc nó không hiển thị bất kỳ chỉ báo hoặc điểm đánh dấu nào cho điểm được chỉ định. Nó chỉ tập trung tại vị trí của nó.

Có cách nào để lấy điểm đánh dấu hoặc thứ gì đó khác đi kèm mà không sử dụng MapView không?


nhãn đã ngừng hiển thị trong bản cập nhật bản đồ gần đây nhất .. phải làm gì?
user2297550

Câu trả lời:


254

Thử cái này:

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

Bạn có thể bỏ qua (Nhãn + Tên) nếu bạn không muốn một nhãn và nó sẽ chọn một nhãn ngẫu nhiên dựa trên đường phố gần nhất hoặc những thứ khác mà nó cho là có liên quan.


Sau khi triển khai URI này, tôi gặp sự cố khi đặt thu phóng. Nó có vẻ là lỗi thời
LuckyMalaka

8
@mmm ...: Bạn sẽ cần thay đổi dấu? z thành & z. Bạn chỉ có thể có một? trong một lần đi tiểu. BAD: geo: N, M z = 10 q = N, M (Place) TỐT: geo:?? N, M z = 10 & q = N, M (Place)
Josh

Không thu phóng vẫn không hoạt động (nhưng nhãn thì có). Ngoài ra, nếu bản đồ không thể tìm thấy bất kỳ thứ gì có liên quan (mặc dù chúng tôi cung cấp nó cùng với nhãn), nó sẽ hiển thị lỗi bánh mì nướng. Giải pháp này hoạt động nhưng chỉ bán tối ưu.
Warpzit 20/12/12

3
Thu phóng bị bỏ qua vì đây là một truy vấn đơn giản hơn là một địa lý. Những gì xảy ra ở đây thực sự là một truy vấn thuần túy được gửi đến Google, và sau đó máy chủ trả lời bằng một "kết quả tìm kiếm" tương ứng với nó. Bạn có thể thử tìm kiếm <lat>, <long> (Nhãn + Tên) trên maps.google.com và nhận được kết quả tương tự
robpvn 14/03/2013

4
geo:Lke robpvn chỉ ra rằng việc sử dụng phương pháp này (hoặc bất kỳ phương pháp nào khác ở đây có liên quan đến truy vấn được gắn nhãn) hoàn toàn bỏ qua điểm địa lý trong phần này. Trong một số trường hợp, truy vấn sẽ không thành công khi sử dụng lat / long, và sau đó bạn chỉ nhận được một lời chúc "không có kết quả" thay vì quay trở lại điểm địa lý. Không hữu ích cho bất kỳ loại ứng dụng GIS nào.
Geobits

45

Câu trả lời được chấp nhận là đúng, ngoại trừ trường hợp nhãn của bạn có ký hiệu và (&) trong đó.

Xem xét Mã định danh tài nguyên thống nhất cho các vị trí địa lý (URI 'geo') :

Phần 5.1 nêu rõ:

nếu URI cuối cùng bao gồm thành phần 'truy vấn', hãy thêm dấu phân cách thành phần "?" đến cuối kết quả, theo sau là chuỗi truy vấn được mã hóa.

Thật không may cho chúng tôi, làm điều này cũng sẽ thoát khỏi dấu '=' không phải là những gì chúng tôi muốn.

Chúng ta nên làm điều này:

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
Chức năng này đã bị hỏng trong Google Maps 7.x mới, hãy xem quá code.google.com/p/android/issues/detail?id=58507
ATom

42

Có nhiều tùy chọn khác để khởi chạy bản đồ Google bằng cách sử dụng ý định ...

   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);

trông giống như 2) "& iwloc = A & hl = es" là không thực sự cần thiết
Olivier de Jonge

"iwloc" là viết tắt của vị trí cửa sổ thông tin và "hl" cho ngôn ngữ, nếu bạn không đặt các giá trị này, các giá trị mặc định sẽ được áp dụng. =)
Jorgesys

bạn bỏ lỡ )ở cách thứ hai.
Sen

Tăng lên! tùy chọn thứ hai và thứ ba! cảm ơn tôi đã sửa cả hai! ᕦ ´ • ᴥ • `ᕥ @Baras
Jorgesys 22/02/17

5

Chuỗi này hoạt động tốt đối với tôi:

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

Hãy thử thêm (LocationMarkerName) vào địa chỉ: uri. Ví dụ: "geo :,? Z = 17 (LocationMarkerName)"

Trong Google Maps trên Android tìm kiếm 23.0980,30.6797 (NamedMarker), nó dường như căn giữa bản đồ và định vị một điểm đánh dấu có tên NamedMarker tại vị trí đó.


1

Tôi vừa xác nhận đoạn mã sau từ @Kenton Price vẫn hoạt động trên Android 4.4 (KitKat):

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

0

Tôi chỉ sử dụng Lớp phủ với MapView để vẽ các điểm đánh dấu trên bản đồ. Nếu chế độ xem của bạn đang hiển thị bản đồ của bạn, bạn có thể chỉ cần vẽ điểm đánh dấu của mình ở giữa màn hình, giống như cách bạn vẽ bất kỳ hình ảnh nào trên Chế độ xem.

Tuy nhiên, điểm đánh dấu sẽ không được liên kết với tọa độ bản đồ thực tế, nhưng nếu nó chỉ là một chế độ xem tĩnh, thì điều này có thể làm được.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.