examples-vite/layers/amap/base.ts (116 lines of code) (raw):
import { Mesh } from '@gs.i/frontend-sdk'
import { buildBox } from '@gs.i/utils-geom-builders'
import { StandardLayer } from '@polaris.gl/gsi'
import { PolarisLite } from '@polaris.gl/lite'
import { generateScene } from '@gs.i/utils-random-scene'
import { IndicatorProcessor } from '@gs.i/processor-indicator'
import { HelperLayer } from '@polaris.gl/layer-std-helper'
import { MarkerLayer, Marker } from '@polaris.gl/layer-std-marker'
import { AMapLayer } from '@polaris.gl/layer-amap'
import { specifyUnlitMaterial } from '@gs.i/utils-specify'
await test(true, 'PolarisLite', () => {
const p = new PolarisLite({
container: document.querySelector('#container') as HTMLDivElement,
background: 'transparent',
// autoplay: false,
asyncRendering: true, // 为了和AMap渲染同步加的参数,在AMap加载的时候一定要打开
// autoResize: true,
width: 700,
height: 700,
})
const h = new HelperLayer()
p.add(h)
h.setProps({ box: false })
// p.addEventListener('viewChange', (e) => {
// console.log(e)
// })
globalThis.p = p
console.log(p)
const markerLayer = new MarkerLayer()
p.add(markerLayer)
const marker = new Marker({ html: 'hahaha' })
markerLayer.add(marker)
const marker2 = new Marker({ html: 'hoho', lng: 0.01 })
markerLayer.add(marker2)
const marker3 = new Marker({
object3d: generateScene({
// scale: 1000,
count: 10,
depth: 10,
useAnimation: true,
useSprite: true,
usePoint: false,
resolution: [500, 500],
}),
lng: 0.01,
lat: 0.01,
})
markerLayer.add(marker3)
const marker4 = new Marker({
object3d: generateScene({
// scale: 1000,
count: 10,
depth: 10,
useAnimation: true,
useSprite: true,
usePoint: false,
resolution: [500, 500],
}),
lng: -0.01,
lat: 0.01,
})
markerLayer.add(marker4)
const marker5 = new Marker({
html: '5',
object3d: new Mesh({
material: specifyUnlitMaterial({ type: 'unlit', baseColorFactor: { r: 1, g: 0, b: 0 } }),
geometry: buildBox({ width: 0.5, height: 0.5, depth: 0.5 }),
}),
lng: 119.918,
lat: 30.0475,
})
markerLayer.add(marker5)
// ---------------------
// 传入外部amap instance并交给Polaris管理
// ---------------------
window['onAMapLoaded'] = () => {
const polarisElement = p.view.html.element
const amapContainer = document.createElement('div')
amapContainer.id = 'user-amap-container'
// AMap DOM 需要在被Polaris container覆盖在上层
if (polarisElement.hasChildNodes()) {
polarisElement.insertBefore(amapContainer, polarisElement.firstChild)
} else {
polarisElement.appendChild(amapContainer)
}
// 确保 Polaris 和 AMap 的 DOM width/height 一致
amapContainer.style.width = polarisElement.style.width
amapContainer.style.height = polarisElement.style.height
const map = new window['AMap'].Map('user-amap-container', {
// 默认属性
viewMode: '3D',
animateEnable: false, // 为了相机同步,禁止缓动效果
jogEnable: false, // 为了相机同步,禁止动画效果
buildingAnimation: false, // 禁止楼快出现动画效果
resizeEnable: true,
expandZoomRange: true, // zooms默认最大为19,true才能放大至20
zooms: [3, 20], // 高德默认[3,19]
zoomEnable: true,
// 自定义属性
center: [120, 30],
zoom: 8,
mapStyle: 'amap://styles/normal',
layers: [],
features: ['bg', 'road'],
// 区别投影
crs: 'EPSG3857',
showLabel: false,
})
const amapLayer = new AMapLayer({ amapInstance: map })
p.add(amapLayer)
console.log(amapLayer)
}
const url =
'https://webapi.amap.com/maps?v=2.0&key=6bfc5bc9f3037cfc65a0fd282de5d57f&callback=onAMapLoaded'
const jsapi = document.createElement('script')
jsapi.charset = 'utf-8'
jsapi.src = url
document.head.appendChild(jsapi)
p.setStatesCode('1|119.918672|30.047431|0.000000|0.00000|-0.00000|16.66800')
})
// ===
async function test(enable: boolean, name: string, fun: () => void, duration = 1000) {
if (!enable) return
console.group(name)
fun()
await new Promise((resolve, reject) => {
setTimeout(() => resolve(true), duration)
})
console.log(`test end (${name})`)
console.groupEnd()
return
}