ฉันจะแสดงเครื่องหมายใน Maps ที่เปิดตัวโดย Geo URI Intent ได้อย่างไร


107

ฉันมีแอปพลิเคชันที่ต้องการแสดงสถานที่ต่างๆ (ทีละแห่งเลือกโดยการป้อนข้อมูลของผู้ใช้) โดยเปิดใช้ Google แผนที่ด้วยพิกัดทางภูมิศาสตร์ที่ระบุ

ฉันกำลังใช้สิ่งนี้อยู่ (โดยมีค่า lat จริงและค่า long แน่นอน):

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

ค่อนข้างตรงตามที่ฉันต้องการยกเว้นว่าจะไม่แสดงตัวบ่งชี้หรือเครื่องหมายสำหรับจุดที่ระบุ ศูนย์เฉพาะที่ตั้งเท่านั้น

มีวิธีรับเครื่องหมายหรืออย่างอื่นโดยไม่ใช้ MapView หรือไม่?


ป้ายกำกับหยุดแสดงในการอัปเดตแผนที่ล่าสุด .. จะทำอย่างไร?
user2297550

คำตอบ:


254

ลองสิ่งนี้:

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

คุณสามารถละเว้น (ป้ายกำกับ + ชื่อ) ได้หากคุณไม่ต้องการป้ายกำกับและจะเลือกแบบสุ่มตามถนนที่ใกล้ที่สุดหรือสิ่งอื่นที่คิดว่าเกี่ยวข้อง


หลังจากใช้ URI นี้ฉันมีปัญหาในการตั้งค่าการซูม ดูเหมือนจะล้าสมัยไปแล้ว
LuckyMalaka

8
@mmm ... : คุณจะต้องเปลี่ยน? z เป็น an & z คุณสามารถมีเพียงหนึ่ง? ในอูรี BAD: geo: N, M? z = 10? q = N, M (สถานที่) GOOD: geo: N, M? z = 10 & q = N, M (สถานที่)
Josh

ไม่มีการซูมยังไม่ทำงาน (แต่สิ่งที่ป้ายกำกับทำ) นอกจากนี้หากแผนที่ไม่พบสิ่งที่เกี่ยวข้อง (แม้ว่าเราจะให้ป้ายกำกับ) แผนที่จะแสดงข้อผิดพลาดในการปิ้ง วิธีนี้ใช้ได้ผล แต่เพียงกึ่งดีที่สุด
Warpzit

3
การซูมจะถูกละเว้นเนื่องจากนี่เป็นคำค้นหาที่เรียบง่ายแทนที่จะเป็น geointent สิ่งที่เกิดขึ้นที่นี่เป็นข้อความค้นหาธรรมดาที่ส่งไปยัง Google จากนั้นเซิร์ฟเวอร์จะตอบกลับด้วย "ผลการค้นหา" ที่เกี่ยวข้อง คุณสามารถลองค้นหา <lat>, <long> (Label + Name) บน maps.google.com และได้ผลลัพธ์เดียวกัน
robpvn

4
การใช้สิ่งนี้ (หรือวิธีการอื่นใดที่นี่ซึ่งเกี่ยวข้องกับข้อความค้นหาที่มีป้ายกำกับ) จะละเว้น geopoint ในgeo:ส่วนนั้นโดยสิ้นเชิง lke robpvn ชี้ให้เห็น ในบางกรณีข้อความค้นหาจะล้มเหลวโดยใช้ lat / long จากนั้นคุณจะได้รับขนมปังปิ้ง "ไม่มีผลลัพธ์" แทนที่จะกลับไปที่ geopoint ไม่มีประโยชน์มากสำหรับแอป GIS ทุกประเภท
Geobits

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 ใหม่โปรดดูcode.google.com/p/android/issues/detail?id=58507
ATom

42

มีตัวเลือกอื่น ๆ อีกมากมายในการเปิด Google map โดยใช้ความตั้งใจ ...

   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

คุณพลาด)ทางที่สอง
เซน

อัพ! ตัวเลือกที่สองและสาม! ขอบคุณฉันได้แก้ไขทั้งสองอย่างแล้ว! ᕦ ´•ᴥ• `ᕥ @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)"

ใน Google แผนที่บน Android ค้นหา 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 เพื่อวาดเครื่องหมายที่ด้านบนของแผนที่ หากมุมมองของคุณกำลังแสดงแผนที่ของคุณอาจเป็นไปได้ที่จะวาดเครื่องหมายของคุณที่กึ่งกลางของหน้าจอในลักษณะเดียวกับที่คุณวาดภาพใด ๆ บนมุมมอง

อย่างไรก็ตามเครื่องหมายจะไม่เชื่อมโยงกับพิกัดแผนที่จริง แต่ถ้าเป็นเพียงมุมมองคงที่สิ่งนี้อาจทำได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.