เอกสาร / พื้นฐาน / เลเยอร์แรสเตอร์

เลเยอร์แรสเตอร์

ระบุเทมเพลต URL ของไทล์ XYZ เพื่อวางซ้อนชุดไทล์ใดๆ บนแผนที่ สามารถใช้ไทล์ภายนอก เช่น ไทล์ GSI ได้โดยตรง

ANDROID
com.mapconductor:core
iOS
MapConductorCore
REACT
@mapconductor/js-sdk-react
แพลตฟอร์ม

01 · การใช้งาน

เพียงส่งเทมเพลต URL ไปยังแหล่งข้อมูล ความโปร่งใสและช่วงซูมจะถูกควบคุมทางด้านเลเยอร์

RasterLayerScreen.kt · Jetpack Compose
val rasterLayerState = RasterLayerState(
    id = "gsi-raster",
    source = RasterLayerSource.UrlTemplate(
        template = "https://cyberjapandata.gsi.go.jp/xyz/relief/{z}/{x}/{y}.png",
        tileSize = 256,
        minZoom = 5,
        maxZoom = 15,
    ),
    opacity = 0.75f,
)

MapLibreMapView(state = mapState) {
    RasterLayer(rasterLayerState)
}

02 · ตัวเลือกหลัก

Option
Default
คำอธิบาย
template
เทมเพลต URL ของไทล์ที่มี {z}/{x}/{y}
tileSize
512
จำนวนพิกเซลในด้านหนึ่งของไทล์
minZoom / maxZoom
ไม่มี
ช่วงซูมที่แสดงเลเยอร์ หากไม่ระบุจะแสดงในทุกซูม
attributionRules
[]
กฎการระบุแหล่งที่มาตามการซูมและช่วง ระบุใน `source`
opacity
1.0
ความทึบของเลเยอร์ทั้งหมด (ระบุทางด้านเลเยอร์)
visible
true
สลับการแสดง/ซ่อน
zIndex
0
ลำดับการวางซ้อนกับเลเยอร์อื่นๆ
userAgent
MapConductor/…
User-Agent เมื่อดึงไทล์ การรองรับขึ้นอยู่กับผู้ให้บริการ (ดูตารางด้านล่าง)
extraHeaders
ไม่มี
ส่วนหัวเพิ่มเติมเมื่อดึงไทล์ เช่น โทเค็นการตรวจสอบสิทธิ์ การรองรับขึ้นอยู่กับผู้ให้บริการ (ดูตารางด้านล่าง)

03 · การรองรับส่วนหัว

การดึงไทล์ดำเนินการโดยแผนที่ SDK ของผู้ให้บริการแต่ละราย และมีวิธีแก้ไขคำขอหรือไม่แตกต่างกันไปในแต่ละ SDK สำหรับผู้ให้บริการที่ไม่มีวิธีดังกล่าว การระบุจะถูกละเว้นและจะมีการแสดงบันทึกในขณะทำงาน ตารางด้านล่างแสดงผลลัพธ์จากการตรวจสอบคำขอไทล์จริง (เนทีฟบนอุปกรณ์จริง เว็บบนเบราว์เซอร์)

บนเว็บ `userAgent` จะไม่ทำงานกับผู้ให้บริการใดๆ เนื่องจากเบราว์เซอร์ห้ามการเขียนทับ User-Agent และ SDK ไม่สามารถหลีกเลี่ยงได้ คุณสมบัตินี้ยังคงไว้เพื่อ React Native และบน RN ค่าจะถูกส่งไปยัง native SDK และทำงานได้จริง นี่เป็นการออกแบบโดยตั้งใจเพื่อให้โค้ดชุดเดียวทำงานได้ทั้งบนเว็บและ RN

Provider
iOS
Android
Web(extraHeaders)
หมายเหตุ
MapLibre
iOS ใช้ `MLNNetworkConfiguration` Android ใช้การเปลี่ยนไคลเอนต์ `OkHttp` Web ผ่าน `transformRequest` ของ `maplibre-gl` ทั้งหมดจะถูกแนบเฉพาะกับคำขอไปยังโฮสต์จำหน่ายไทล์เท่านั้น
MapTiler
iOS ใช้กลไกเดียวกับ MapLibre เนื่องจาก MapTiler SDK ของ Android ทำงานบน WebView จึงไม่สามารถแทนที่ส่วนหัวจากฝั่งเนทีฟได้
MapKit
ผู้ให้บริการเฉพาะสำหรับ iOS
HERE
iOS จะใช้พร็อกซีในเครื่องเมื่อระบุส่วนหัวเท่านั้น (เพิ่มหนึ่งฮอป)
Google Maps
userAgent
Android ดึงไทล์เองจึงสามารถใช้ทั้งสองอย่างได้ `GMSURLTileLayer` ของ iOS เปิดเผยเฉพาะ `userAgent` และจะละเว้น `extraHeaders`
Mapbox
SDK สำหรับ iOS / Android ไม่มี API สาธารณะสำหรับเขียนคำขอใหม่ เนื่องจาก mapbox-gl บนเว็บมี transformRequest จึงรองรับเฉพาะเว็บ
ArcGIS
เช่นเดียวกัน
TomTom
เช่นเดียวกัน
Longdo
เช่นเดียวกัน
Leaflet
สำหรับเว็บเท่านั้น ดึงข้อมูลไทล์ด้วย fetch เมื่อระบุส่วนหัวเท่านั้น และแทนที่ด้วย blob
OpenLayers
สำหรับเว็บเท่านั้น เช่นเดียวกัน (แทนที่ tileLoadFunction)
Azure Maps
สำหรับเว็บเท่านั้น ผ่าน transformRequest
Cesium
✓ (ไม่ได้วัด)
สำหรับเว็บเท่านั้น การนำไปใช้งานที่ส่ง Resource พร้อม headers แต่ไม่สามารถวัดค่าจริงได้เนื่องจากข้อผิดพลาดอื่นในแอปตัวอย่าง

หากคุณใช้เซิร์ฟเวอร์ไทล์ที่จำเป็นต้องมีส่วนหัว โปรดเลือกผู้ให้บริการที่รองรับ สำหรับผู้ให้บริการที่ไม่รองรับ คุณสามารถใช้งานได้หากส่งโทเค็นผ่านพารามิเตอร์การค้นหาใน URL

04 · ตัวอย่าง

ตัวอย่างไทล์ GSI

ตัวอย่างสลับระหว่างแผนที่เงาและแผนที่มาตรฐาน และเปลี่ยนความโปร่งใสด้วยสไลเดอร์ การระบุแหล่งที่มาจะเปลี่ยนโดยอัตโนมัติผ่าน attributionRules

การนำไปใช้งานในวิดีโอ · Android + MapLibreKotlin · Jetpack Compose
var opacity by remember { mutableFloatStateOf(0.75f) }
var relief by remember { mutableStateOf(true) }

val layerState = remember { RasterLayerState(id = "gsi-raster") }

// Both source and opacity can be reassigned; the layer is not rebuilt
LaunchedEffect(relief, opacity) {
    layerState.source = RasterLayerSource.UrlTemplate(
        template = if (relief) {
            "https://cyberjapandata.gsi.go.jp/xyz/relief/{z}/{x}/{y}.png"
        } else {
            "https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png"
        },
        tileSize = 256,
        minZoom = 5,
        maxZoom = 15,
    )
    layerState.opacity = opacity
}

MapLibreMapView(state = mapViewState) {
    RasterLayer(layerState)
}

Slider(value = opacity, onValueChange = { opacity = it })
Switch(checked = relief, onCheckedChange = { relief = it })
วิดีโอตัวอย่าง · ซ้อนทับไทล์แรสเตอร์
ยังไม่ได้ถ่ายวิดีโอซ้อนทับเซิร์ฟเวอร์ไทล์ภายนอก และแสดงให้เห็นว่าไทล์ถูกเปลี่ยนตามระดับการซูมอย่างไร

หน้าที่เกี่ยวข้อง