การวางซ้อนของชิ้นส่วนแผนที่ หรือที่เรียกว่าเลเยอร์ชิ้นส่วนแผนที่ คือชุดรูปภาพที่ แสดงอยู่ด้านบนของชิ้นส่วนแผนที่ฐาน
ตัวอย่างโค้ด
ที่เก็บ ApiDemos ใน GitHub มีตัวอย่างที่แสดง ฟีเจอร์การวางซ้อนของชิ้นส่วนแผนที่ ดังนี้
- TileOverlayDemoActivity - Java: ฟีเจอร์การวางซ้อนของชิ้นส่วนแผนที่ใน Java
- TileCoordinateDemoActivity - Java: ระบบพิกัดที่ใช้ สำหรับการวางซ้อนของชิ้นส่วนแผนที่ใน Java
- TileOverlayDemoActivity - Kotlin: ฟีเจอร์การวางซ้อนของชิ้นส่วนแผนที่ใน Kotlin
- TileCoordinateDemoActivity - Kotlin: ระบบพิกัดที่ใช้ สำหรับการวางซ้อนของชิ้นส่วนแผนที่ใน Kotlin
บทนำ
ออบเจ็กต์
TileOverlay กำหนดชุดรูปภาพที่จะเพิ่มไว้ด้านบนของ
ชิ้นส่วนแผนที่ฐาน
คุณต้องระบุชิ้นส่วนแผนที่สำหรับระดับการซูมแต่ละระดับที่ต้องการรองรับ หากมีชิ้นส่วนแผนที่เพียงพอในระดับการซูมหลายระดับ คุณสามารถเสริมข้อมูลแผนที่ของ Google สำหรับแผนที่ทั้งผืนได้
การวางซ้อนของชิ้นส่วนแผนที่มีประโยชน์เมื่อคุณต้องการเพิ่มภาพจำนวนมากในแผนที่ ซึ่งโดยปกติจะครอบคลุมพื้นที่ทางภูมิศาสตร์ขนาดใหญ่ ในทางตรงกันข้าม การวางซ้อนบนพื้นดิน จะมีประโยชน์เมื่อคุณต้องการตรึงรูปภาพรูปเดียวไว้ในพื้นที่หนึ่งบนแผนที่
นอกจากนี้ คุณยังใช้การวางซ้อนของชิ้นส่วนแผนที่แบบโปร่งใสเพื่อเพิ่มฟีเจอร์พิเศษลงในแผนที่ได้ด้วย การตั้งค่าปัจจัยความโปร่งใสในการวางซ้อนของชิ้นส่วนแผนที่แบบเป็นโปรแกรม หรือโดย การระบุรูปภาพชิ้นส่วนแผนที่แบบโปร่งใส
พิกัดแผนที่ย่อยและระดับการซูม
Google Maps API จะแบ่งภาพในระดับการซูมแต่ละระดับออกเป็นชุดของ ชิ้นส่วนแผนที่สี่เหลี่ยมจัตุรัสที่จัดเรียงเป็นตารางกริด เมื่อแผนที่ย้ายไปยังตำแหน่งใหม่หรือ ไปยังระดับการซูมใหม่ Maps API จะกำหนดชิ้นส่วนแผนที่ที่จำเป็นและ แปลข้อมูลนั้นเป็นชุดชิ้นส่วนแผนที่ที่จะดึงข้อมูล
ชิ้นส่วนแผนที่ที่มีพิกัด (0,0) จะอยู่ที่มุมตะวันตกเฉียงเหนือของแผนที่เสมอ โดยค่า x จะเพิ่มขึ้นจากตะวันตกไปตะวันออก และค่า y จะเพิ่มขึ้นจากเหนือ ลงใต้ ระบบจะจัดทำดัชนีชิ้นส่วนแผนที่โดยใช้พิกัด x,y จากจุดเริ่มต้นนั้น
ที่ระดับการซูม 0 ระบบจะแสดงโลกทั้งใบในชิ้นส่วนแผนที่ชิ้นเดียว ระดับการซูมแต่ละระดับจะเพิ่มการขยายเป็น 2 เท่า ดังนั้นที่ระดับการซูม 1 ระบบจะแสดงแผนที่เป็นตารางกริดชิ้นส่วนแผนที่ขนาด 2x2 ที่ระดับการซูม 2 จะเป็นตารางกริดขนาด 4x4 ที่ระดับการซูม 3 จะเป็นตารางกริดขนาด 8x8 และอื่นๆ
ตัวอย่างเช่น ที่ระดับการซูม 2 โลกจะแบ่งออกเป็น 16 ชิ้นส่วนแผนที่ คุณอ้างอิงชิ้นส่วนแผนที่แต่ละชิ้น ได้โดยใช้การผสมผสานที่ไม่ซ้ำกันของ x, y และการซูม ดังนี้
เมื่อสร้างรูปภาพสำหรับเลเยอร์ชิ้นส่วนแผนที่ คุณจะต้องสร้างรูปภาพสำหรับ ชิ้นส่วนแผนที่แต่ละชิ้นในระดับการซูมแต่ละระดับที่ต้องการรองรับ Google Maps กำหนดเป้าหมายไว้ที่ 256 dp (พิกเซลอิสระจากอุปกรณ์) เมื่อแสดงชิ้นส่วนแผนที่ สำหรับอุปกรณ์ความละเอียดสูง เราขอแนะนำให้คุณแสดงชิ้นส่วนแผนที่ dpi สูง (512x512 พิกเซล) โปรดดูข้อมูลเกี่ยวกับการรองรับขนาดและความหนาแน่นของหน้าจอที่แตกต่างกันในเอกสารประกอบสำหรับนักพัฒนาซอฟต์แวร์ Android
หมายเหตุ: ระดับการซูมที่กล้องรองรับขึ้นอยู่กับปัจจัยต่างๆ และไม่เกี่ยวข้องกับระดับการซูมที่ชิ้นส่วนแผนที่รองรับ
-
GoogleMap.getMaxZoomLevel()จะแสดงระดับการซูมสูงสุด ที่ใช้ได้ในตำแหน่งกล้องปัจจุบัน โดยจะพิจารณาจากประเภทแผนที่ ที่ใช้อยู่ในปัจจุบัน ตัวอย่างเช่น แผนที่ดาวเทียมหรือแผนที่ภูมิประเทศอาจมี ระดับการซูมสูงสุดต่ำกว่าชิ้นส่วนแผนที่ฐาน -
GoogleMap.getMinZoomLevel()จะแสดงระดับการซูมต่ำสุด ซึ่งจะเหมือนกันสำหรับทุกตำแหน่ง (ต่างจากระดับการซูมสูงสุด) แต่ อาจแตกต่างกันไปตามอุปกรณ์และขนาดแผนที่
เพิ่มการวางซ้อนของชิ้นส่วนแผนที่
วิธีที่ง่ายและพบได้บ่อยที่สุดในการสร้างการวางซ้อนของชิ้นส่วนแผนที่คือการระบุ
URL ที่ชี้ไปยังรูปภาพชิ้นส่วนแผนที่ที่เกี่ยวข้อง
UrlTileProvider เป็นการใช้งานบางส่วนของ
TileProvider ที่แสดงชิ้นส่วนแผนที่รูปภาพตาม URL คลาสนี้
กำหนดให้รูปภาพทั้งหมดต้องมีขนาดเท่ากัน
คุณจะต้องใช้ UrlTileProvider.getTileUrl() ซึ่ง
ยอมรับพิกัดแผนที่ย่อย (x, y, การซูม) และแสดง URL ที่ชี้ไปยัง
รูปภาพที่จะใช้สำหรับชิ้นส่วนแผนที่ เมธอดควรแสดงผลเป็น Null หากไม่มี
ชิ้นส่วนแผนที่สำหรับ x, y และการซูมที่ระบุ URL สามารถชี้ไปยังแหล่งข้อมูลเว็บ, ชิ้นงาน Android
หรือไฟล์ในดิสก์ภายในเครื่อง
ตั้งค่าคลังรูปภาพชิ้นส่วนแผนที่บนเซิร์ฟเวอร์ โดยกำหนดไว้สำหรับพิกัด x,y และระดับการซูมทั้งหมดที่คุณต้องการรองรับ จากนั้นเพิ่มการวางซ้อนของชิ้นส่วนแผนที่ โดยทำดังนี้
- กำหนด
UrlTileProviderเพื่อแสดงรูปภาพชิ้นส่วนแผนที่ - ลบล้าง
getTileUrl()เพื่อสร้าง URL สำหรับรูปภาพชิ้นส่วนแผนที่แต่ละรูป - ระบุออบเจ็กต์
TileOverlayOptionsที่มีตัวเลือกที่เกี่ยวข้อง ดังนี้ fadeIn: บูลีน ระบุว่าจะให้ชิ้นส่วนแผนที่ค่อยๆ ปรากฏขึ้นหรือไม่ ค่าเริ่มต้นคือtrueคุณอาจพบว่าการปิดการค่อยๆ ปรากฏขึ้นมีประโยชน์เมื่อสลับไปมาระหว่างการวางซ้อนของชิ้นส่วนแผนที่อย่างรวดเร็ว ดูข้อมูลเกี่ยวกับความสัมพันธ์ระหว่างความโปร่งใสกับการค่อยๆ ปรากฏขึ้นได้ในส่วน ความโปร่งใส ด้านล่างtileProvider:TileProviderที่จะใช้สำหรับ การวางซ้อนนี้transparency: จำนวนลอยตัว ตั้งค่าปัจจัยความโปร่งใสสำหรับ รูปภาพชิ้นส่วนแผนที่ ค่าต้องอยู่ในช่วง[0.0f, 1.0f]โดยที่0.0fหมายถึงทึบแสงทั้งหมด (ค่าเริ่มต้น) และ1.0fหมายถึงโปร่งใสทั้งหมด ดูตัวอย่างโค้ดและความสัมพันธ์ระหว่างความโปร่งใสกับการค่อยๆ ปรากฏขึ้นได้ในส่วน ความโปร่งใสด้านล่างvisible: บูลีน ระบุระดับการมองเห็นของการวางซ้อนของชิ้นส่วนแผนที่ ระบบจะไม่วาดการวางซ้อนของชิ้นส่วนแผนที่ที่มองไม่เห็น (ค่าfalse) บนแผนที่ แต่จะเก็บพร็อพเพอร์ตี้อื่นๆ ทั้งหมดไว้ ค่าเริ่มต้น คือtruezIndex: กำหนดลำดับที่จะวาดการวางซ้อนของชิ้นส่วนแผนที่เมื่อเทียบกับการวางซ้อนอื่นๆ รวมถึงการวางซ้อนบนพื้นดิน , วงกลม เส้นหลายเส้นและรูปหลายเหลี่ยม การวางซ้อนที่มี z-index สูงกว่าจะวาดอยู่ด้านบนของการวางซ้อนที่มี z-index ต่ำกว่า ลำดับของการวางซ้อนที่มี z-index เดียวกันจะขึ้นอยู่กับดุลยพินิจ z-index เริ่มต้นคือ 0 โปรดทราบว่า มาร์กเกอร์ จะ วาดไว้เหนือการวางซ้อนอื่นๆ เสมอ ไม่ว่า z-index ของการวางซ้อน อื่นๆ จะเป็นเท่าใด- เรียกใช้
GoogleMap.addTileOverlay()เพื่อเพิ่มการวางซ้อนลงใน แผนที่
Kotlin
val tileProvider: TileProvider = object : UrlTileProvider(256, 256) { override fun getTileUrl(x: Int, y: Int, zoom: Int): URL? { /* Define the URL pattern for the tile images */ val url = "http://my.image.server/images/$zoom/$x/$y.png" return if (!checkTileExists(x, y, zoom)) { null } else try { URL(url) } catch (e: MalformedURLException) { throw AssertionError(e) } } /* * Check that the tile server supports the requested x, y and zoom. * Complete this stub according to the tile range you support. * If you support a limited range of tiles at different zoom levels, then you * need to define the supported x, y range at each zoom level. */ private fun checkTileExists(x: Int, y: Int, zoom: Int): Boolean { val minZoom = 12 val maxZoom = 16 return zoom in minZoom..maxZoom } } val tileOverlay = map.addTileOverlay( TileOverlayOptions() .tileProvider(tileProvider) ) tileOverlay?.let { val isVisible = it.isVisible val fadeIn = it.fadeIn val transparency = it.transparency val zIndex = it.zIndex }
Java
TileProvider tileProvider = new UrlTileProvider(256, 256) { @Override public URL getTileUrl(int x, int y, int zoom) { /* Define the URL pattern for the tile images */ String s = String.format(java.util.Locale.US, "http://my.image.server/images/%d/%d/%d.png", zoom, x, y); if (!checkTileExists(x, y, zoom)) { return null; } try { return new URL(s); } catch (MalformedURLException e) { throw new AssertionError(e); } } /* * Check that the tile server supports the requested x, y and zoom. * Complete this stub according to the tile range you support. * If you support a limited range of tiles at different zoom levels, then you * need to define the supported x, y range at each zoom level. */ private boolean checkTileExists(int x, int y, int zoom) { int minZoom = 12; int maxZoom = 16; return (zoom >= minZoom && zoom <= maxZoom); } }; TileOverlay tileOverlay = map.addTileOverlay(new TileOverlayOptions() .tileProvider(tileProvider));
หากต้องการดูตัวอย่างการทำงานของ UrlTileProvider โปรดดู
TileOverlayDemoActivity ใน
โค้ดตัวอย่าง
ที่มาพร้อมกับ Google Play services SDK
ตั้งค่าความโปร่งใสสำหรับการวางซ้อนของชิ้นส่วนแผนที่
การวางซ้อนชิ้นส่วนแผนที่แบบโปร่งใสบนแผนที่อาจมีประโยชน์เพื่อให้ผู้ใช้เห็นแผนที่ฐานใต้ชิ้นส่วนแผนที่ที่วางซ้อน คุณทำได้โดยการระบุชิ้นส่วนแผนที่แบบโปร่งใสของคุณเอง หรือโดยการตั้งค่าปัจจัยความโปร่งใสในการวางซ้อนของชิ้นส่วนแผนที่แบบเป็นโปรแกรม
ตัวอย่างโค้ดต่อไปนี้จะสลับความโปร่งใสของการวางซ้อนของชิ้นส่วนแผนที่
ระหว่าง 0.5f กับ 0.0f
Kotlin
val tileOverlayTransparent = map.addTileOverlay( TileOverlayOptions() .tileProvider(object : UrlTileProvider(256, 256) { // ... }) .transparency(0.5f) ) // Switch between 0.0f and 0.5f transparency. tileOverlayTransparent?.let { it.transparency = 0.5f - it.transparency }
Java
TileOverlay tileOverlayTransparent = map.addTileOverlay(new TileOverlayOptions() .tileProvider(new UrlTileProvider(256, 256) { // ... }) .transparency(0.5f)); // Switch between 0.0f and 0.5f transparency. if (tileOverlayTransparent != null) { tileOverlayTransparent.setTransparency(0.5f - tileOverlayTransparent.getTransparency()); }
ความโปร่งใสจะใช้เป็นตัวคูณช่องสัญญาณอัลฟ่าสำหรับรูปภาพชิ้นส่วนแผนที่
หากต้องการตั้งค่าความโปร่งใสของการวางซ้อนของชิ้นส่วนแผนที่ ให้ระบุออบเจ็กต์
TileOverlayOptions ที่มี transparency
ในช่วง [0.0f, 1.0f] ดังที่แสดงในตัวอย่างด้านบน ค่า
ของ 0.0f หมายความว่าการวางซ้อนของชิ้นส่วนแผนที่ทึบแสงทั้งหมด และ
1.0f หมายความว่าโปร่งใสทั้งหมด ค่าเริ่มต้นคือ
0.0f (ทึบแสง)
คุณเข้าถึงความโปร่งใสของการวางซ้อนของชิ้นส่วนแผนที่ได้โดยเรียกใช้
TileOverlay.getTransparency() และเปลี่ยนได้โดยเรียกใช้
TileOverlay.setTransparency()
ความโปร่งใส ภาพเคลื่อนไหว และการค่อยๆ ปรากฏขึ้น
จะไม่มีภาพเคลื่อนไหวเมื่อมีการเปลี่ยนแปลงความโปร่งใส ตัวเลือกความโปร่งใส จะทำงานควบคู่ไปกับ fadeIn
การค่อยๆ ปรากฏขึ้นจะแสดงภาพเคลื่อนไหวของความโปร่งใสเมื่อโหลดชิ้นส่วนแผนที่ หากคุณตั้งค่าความโปร่งใส ชิ้นส่วนแผนที่จะค่อยๆ ปรากฏขึ้นจากโปร่งใสทั้งหมดเป็นค่าความโปร่งใสที่กำหนด หากคุณเปลี่ยนความโปร่งใสระหว่างการค่อยๆ ปรากฏขึ้น ภาพเคลื่อนไหวจะดำเนินต่อไปจนกว่าจะถึงความโปร่งใสเป้าหมายใหม่
นำการวางซ้อนของชิ้นส่วนแผนที่ออก
คุณนำการวางซ้อนของชิ้นส่วนแผนที่ออกได้ด้วยเมธอด
TileOverlay.remove()
Kotlin
tileOverlay?.remove()
Java
tileOverlay.remove();
ล้างชิ้นส่วนแผนที่ที่ล้าสมัย
หากชิ้นส่วนแผนที่ที่การวางซ้อนของชิ้นส่วนแผนที่แสดงกลายเป็น 'ล้าสมัย' คุณสามารถเรียกใช้
clearTileCache() เพื่อบังคับให้รีเฟรช ซึ่งจะทำให้ระบบโหลดชิ้นส่วนแผนที่ทั้งหมดในการวางซ้อนนี้อีกครั้ง ตัวอย่างเช่น หากชิ้นส่วนแผนที่ที่
TileProvider แสดงมีการเปลี่ยนแปลง คุณต้องเรียกใช้
clearTileCache() หลังจากนั้นเพื่อให้แน่ใจว่าระบบจะไม่แสดงชิ้นส่วนแผนที่ก่อนหน้านี้อีก
Kotlin
tileOverlay?.clearTileCache()
Java
tileOverlay.clearTileCache();