You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
488 lines
17 KiB
488 lines
17 KiB
import { HtmlRender, ICircle, IIcon, IIconOptions, ILayer, ILngLat, IMap, IMapOptions, IMarker, IMarkerCluster, IMarkOptions, IMouseTool, IInfoWindow, IPixel, IRenderClusterMarker, ISelf, ISize, PixelRender, ITileLayer, IDriving, IDrivingOptions, IAutocomplete, IPlaceSearch, AutocompleteSearchCallback, AutocompleteSelectCallback, PlaceSearchCallback, AutocompleteSearch, DrivingSearchCallback } from './map' |
|
import MapTools from './map-tools'; |
|
declare var AMap: any; |
|
declare var AMapUI: any; |
|
|
|
class GaodeBasic implements ISelf { |
|
self: any; |
|
discriminator: string = "ISelf"; |
|
} |
|
|
|
export class GaoDeMap extends GaodeBasic implements IMap { |
|
/// plugins:同步加载插件 |
|
constructor(container: string, options: IMapOptions, plugins?: string[]) { |
|
super(); |
|
this.self = new AMap.Map(container, options); |
|
if (!!plugins && plugins.length) { |
|
for (var i in plugins) { |
|
let name = plugins[i]; |
|
if (name.indexOf('AMap.') == -1) continue; |
|
let pObj = eval(`new ${plugins[i]}()`); |
|
this.self.plugin(pObj); |
|
} |
|
} |
|
} |
|
containerToLngLat(e: any) { |
|
return this.self.containerToLngLat(e) |
|
} |
|
clearMap() { |
|
return this.self.clearMap(); |
|
} |
|
distance(a: number[], b: number[]) { |
|
return AMap.GeometryUtil.distance(a, b); |
|
} |
|
getCity(callback: Function) { |
|
return this.self.getCity(callback) |
|
} |
|
setZoomAndCenter(zoom: number, pos: number[]) { |
|
return this.self.setZoomAndCenter(zoom, pos) |
|
} |
|
plugin(pluginNames: string[], callback: Function) { |
|
let names = pluginNames.filter(s => s.indexOf("AMap.") == 0); |
|
return this.self.plugin(names, callback) |
|
} |
|
getBounds() { |
|
return this.self.getBounds() |
|
} |
|
add(obj: IMarker | any) { |
|
return this.self.add(obj.self) |
|
} |
|
remove(obj: any) { |
|
return this.self.remove(obj.self) |
|
} |
|
setCity(city: string) { |
|
return this.self.setCity(city) |
|
} |
|
setZoom(zoom) { |
|
return this.self.setZoom(zoom) |
|
} |
|
setCenter(pos: any) { |
|
return this.self.setCenter(pos) |
|
} |
|
getCenter(): ILngLat { |
|
let d = this.self.getCenter(); |
|
return new GaoDeLngLat(0, 0, d); |
|
} |
|
getZoom() { |
|
return this.self.getZoom(); |
|
} |
|
on(eventName: string, callback: Function): void { |
|
return this.self.on(eventName, callback); |
|
} |
|
setAdministrativeAreaStyle(component: any, getData?: Function, setData?: Function) {//自定义 行政区划 样式 |
|
let that = this |
|
let level = sessionStorage.getItem("level") |
|
AMapUI.loadUI(['geo/DistrictExplorer'], (DistrictExplorer) => { |
|
|
|
let colors = [ |
|
"#3366cc", "#dc3912", "#ff9900", "#109618", "#990099", "#0099c6", "#dd4477", "#66aa00", |
|
"#b82e2e", "#316395", "#994499", "#22aa99", "#aaaa11", "#6633cc", "#e67300", "#8b0707", |
|
"#651067", "#329262", "#5574a6", "#3b3eac" |
|
]; |
|
|
|
//创建一个实例 |
|
let districtExplorer = new DistrictExplorer({ |
|
map: that.self, |
|
eventSupport: true, //打开事件支持 |
|
}); |
|
|
|
let adcode = 310000 //上海行政编码 |
|
districtExplorer.loadAreaNode(adcode, (error, areaNode) => { |
|
|
|
//更新地图视野 |
|
that.self.setBounds(areaNode.getBounds(), null, null, true); |
|
|
|
//设置定位节点,支持鼠标位置识别 |
|
//注意节点的顺序,前面的高优先级 |
|
districtExplorer.setAreaNodesForLocating(areaNode); |
|
|
|
//清除已有的绘制内容 |
|
districtExplorer.clearFeaturePolygons(); |
|
|
|
//绘制子区域 |
|
districtExplorer.renderSubFeatures(areaNode, (feature, i) => { |
|
let fillColor = colors[i % colors.length]; |
|
let strokeColor = colors[colors.length - 1 - i % colors.length]; |
|
return { |
|
cursor: 'default', |
|
bubble: true, |
|
strokeColor: strokeColor, //线颜色 |
|
strokeOpacity: 1, //线透明度 |
|
strokeWeight: 1, //线宽 |
|
fillColor: fillColor, //填充色 |
|
fillOpacity: 0.5, //填充透明度 |
|
}; |
|
}); |
|
|
|
//绘制父区域 |
|
districtExplorer.renderParentFeature(areaNode, { |
|
cursor: 'default', |
|
bubble: true, |
|
strokeColor: 'black', //线颜色 |
|
strokeOpacity: 1, //线透明度 |
|
strokeWeight: 1, //线宽 |
|
fillColor: null, //填充色 |
|
fillOpacity: 0.5, //填充透明度 |
|
}); |
|
|
|
// 更新地图视野以适合区划面 |
|
that.self.setFitView(districtExplorer.getAllFeaturePolygons()); |
|
}); |
|
|
|
if (level == "0" || level == "1" || level == "2") { |
|
//区域内点击 |
|
districtExplorer.on('featureClick', (e, feature) => { |
|
getData && getData.call(component, feature); |
|
|
|
let props = feature.properties; |
|
adcode = props.adcode |
|
let fillColor2 |
|
if (props.level == 'city') { |
|
fillColor2 = null |
|
} else { |
|
fillColor2 = '#d0daee' |
|
} |
|
districtExplorer.loadAreaNode(adcode, (error, areaNode) => { |
|
|
|
//设置定位节点,支持鼠标位置识别 |
|
//注意节点的顺序,前面的高优先级 |
|
districtExplorer.setAreaNodesForLocating(areaNode); |
|
|
|
//清除已有的绘制内容 |
|
districtExplorer.clearFeaturePolygons(); |
|
|
|
//绘制子区域 |
|
districtExplorer.renderSubFeatures(areaNode, (feature, i) => { |
|
let fillColor = colors[i % colors.length]; |
|
let strokeColor = colors[colors.length - 1 - i % colors.length]; |
|
return { |
|
cursor: 'default', |
|
bubble: true, |
|
strokeColor: strokeColor, //线颜色 |
|
strokeOpacity: 1, //线透明度 |
|
strokeWeight: 1, //线宽 |
|
fillColor: fillColor, //填充色 |
|
fillOpacity: 0.5, //填充透明度 |
|
}; |
|
}); |
|
|
|
//绘制父区域 |
|
districtExplorer.renderParentFeature(areaNode, { |
|
cursor: 'default', |
|
bubble: true, |
|
strokeColor: 'black', //线颜色 |
|
strokeOpacity: 1, //线透明度 |
|
strokeWeight: 1, //线宽 |
|
fillColor: fillColor2, //填充色 |
|
fillOpacity: 0.5, //填充透明度 |
|
}); |
|
|
|
// 更新地图视野以适合区划面 |
|
that.self.setFitView(districtExplorer.getAllFeaturePolygons()); |
|
}); |
|
}); |
|
|
|
districtExplorer.on('outsideClick', (e) => { |
|
setData && setData.call(component); |
|
let adcode = 310000 |
|
districtExplorer.loadAreaNode(adcode, (error, areaNode) => { |
|
|
|
//设置定位节点,支持鼠标位置识别 |
|
//注意节点的顺序,前面的高优先级 |
|
districtExplorer.setAreaNodesForLocating(areaNode); |
|
|
|
//清除已有的绘制内容 |
|
districtExplorer.clearFeaturePolygons(); |
|
|
|
//绘制子区域 |
|
districtExplorer.renderSubFeatures(areaNode, (feature, i) => { |
|
let fillColor = colors[i % colors.length]; |
|
let strokeColor = colors[colors.length - 1 - i % colors.length]; |
|
return { |
|
cursor: 'default', |
|
bubble: true, |
|
strokeColor: strokeColor, //线颜色 |
|
strokeOpacity: 1, //线透明度 |
|
strokeWeight: 1, //线宽 |
|
fillColor: fillColor, //填充色 |
|
fillOpacity: 0.5, //填充透明度 |
|
}; |
|
}); |
|
|
|
//绘制父区域 |
|
districtExplorer.renderParentFeature(areaNode, { |
|
cursor: 'default', |
|
bubble: true, |
|
strokeColor: 'black', //线颜色 |
|
strokeOpacity: 1, //线透明度 |
|
strokeWeight: 1, //线宽 |
|
fillColor: null, //填充色 |
|
fillOpacity: 0.5, //填充透明度 |
|
}); |
|
|
|
// 更新地图视野以适合区划面 |
|
that.self.setFitView(districtExplorer.getAllFeaturePolygons()); |
|
}); |
|
}) |
|
} |
|
|
|
}); //end |
|
} |
|
} |
|
|
|
export class GaoDePixel extends GaodeBasic implements IPixel { |
|
constructor(x: number, y: number) { |
|
super(); |
|
this.x = x; |
|
this.y = y; |
|
this.self = new AMap.Pixel(x, y); |
|
} |
|
getArray(): number[] { |
|
return [this.x, this.y]; |
|
} |
|
|
|
x: number; |
|
y: number; |
|
} |
|
|
|
export class GaoDeMarker extends GaodeBasic implements IMarker { |
|
constructor(options: IMarkOptions) { |
|
super(); |
|
let conf = MapTools.ExplicitConvert(options); |
|
this.self = new AMap.Marker(conf); |
|
this._position = this.self._position; |
|
} |
|
getLngLatByMarkerEvent(map: IMap, e: any): ILngLat { |
|
return map.containerToLngLat(e.pixel); |
|
} |
|
setContent(html: string) { |
|
return this.self.setContent(html) |
|
} |
|
setPosition(x: ILngLat | number[]) { |
|
x = (x as ILngLat).getArray == undefined ? x : (x as ILngLat).getArray(); |
|
return this.self.setPosition(x) |
|
} |
|
_position: number[] |
|
setMap() { |
|
return this.self.setMap(null) |
|
} |
|
get id(): string { |
|
return this.self.id; |
|
} |
|
set id(str: string) { |
|
this.self.id = str; |
|
} |
|
on(eventName: string, callback: Function): void { |
|
return this.self.on(eventName, callback); |
|
} |
|
} |
|
|
|
export class GaoDeMarkerCluster extends GaodeBasic implements IMarkerCluster { |
|
constructor(map: IMap, list: Object[], options: any) { |
|
super(); |
|
let conf = MapTools.ExplicitConvert(options); |
|
AMap.plugin('AMap.MarkerClusterer', () => { |
|
this.self = new AMap.MarkerCluster(map.self, list, conf) |
|
}); |
|
} |
|
on(eventName: string, callback: Function): void { |
|
this.self.on(eventName, callback); |
|
} |
|
setData(list: any[]) { |
|
this.self.setData(list) |
|
} |
|
} |
|
|
|
export class GaoDeLngLat extends GaodeBasic implements ILngLat { |
|
constructor(x: number, y: number, me?: any) { |
|
super(); |
|
if (me == undefined) |
|
this.self = new AMap.LngLat(x, y); |
|
else |
|
this.self = me; |
|
} |
|
|
|
typeName = "LngLat"; |
|
get KL(): number { |
|
return this.lng; |
|
} |
|
get kT(): number { |
|
return this.lat; |
|
} |
|
getArray(): number[] { |
|
return [this.lng, this.lat]; |
|
} |
|
get lng(): number { |
|
return this.self.lng; |
|
} |
|
get lat(): number { |
|
return this.self.lat; |
|
} |
|
offset(x: number, y: number): ILngLat { |
|
return this.self.offset(x, y) |
|
} |
|
} |
|
|
|
export class GaodeLayer extends GaodeBasic implements ILayer { |
|
constructor(options: any) { |
|
super(); |
|
this.self = new AMap.createDefaultLayer(options); |
|
} |
|
} |
|
|
|
export class GaodeIcon extends GaodeBasic implements IIcon { |
|
constructor(options: IIconOptions) { |
|
super(); |
|
options.size = options.size.self |
|
options.imageSize = options.imageSize.self |
|
this.self = new AMap.Icon(options); |
|
} |
|
} |
|
|
|
export class GaodeSize extends GaodeBasic implements ISize { |
|
constructor(x: number, y: number) { |
|
super(); |
|
this.self = new AMap.Size(x, y); |
|
} |
|
} |
|
|
|
export class GaodeTileLayer extends GaodeBasic implements ITileLayer { |
|
constructor() { |
|
super(); |
|
} |
|
Satellite() { |
|
this.self = new AMap.TileLayer.Satellite() |
|
return this |
|
} |
|
RoadNet() { |
|
this.self = new AMap.TileLayer.RoadNet() |
|
return this |
|
} |
|
} |
|
|
|
export class GaodeDriving extends GaodeBasic implements IDriving { |
|
constructor(options: IDrivingOptions) { |
|
super(); |
|
options.map = options.map.self |
|
AMap.plugin('AMap.Driving', () => { |
|
this.self = new AMap.Driving(options) |
|
}) |
|
} |
|
search(component: any, posStart: ILngLat, posEnd: ILngLat, callback: DrivingSearchCallback) { |
|
return this.self.search(posStart.getArray(), posEnd.getArray(), (status, result)=>{ |
|
callback.call(component,status,result) |
|
}) |
|
} |
|
clear() { |
|
return this.self.clear() |
|
} |
|
} |
|
|
|
export class GaodeAutocomplete extends GaodeBasic implements IAutocomplete { |
|
private component: any |
|
constructor(options: any, component: any) { |
|
super(); |
|
this.component = component |
|
AMap.plugin('AMap.AutoComplete', () => { |
|
this.self = new AMap.Autocomplete(options) |
|
}) |
|
} |
|
on(eventName: string, callback: AutocompleteSelectCallback) { |
|
this.self.on(eventName, (event) => { |
|
callback.call(this.component, event) |
|
}) |
|
} |
|
search(address: string, callback: AutocompleteSearchCallback) { |
|
this.self.search(address, (status, result) => { |
|
callback.call(this.component, status, result) |
|
}) |
|
} |
|
} |
|
|
|
export class GaodePlaceSearch extends GaodeBasic implements IPlaceSearch { |
|
private component: any |
|
constructor(component: any) { |
|
super(); |
|
this.component = component |
|
AMap.plugin('AMap.PlaceSearch', () => { |
|
this.self = new AMap.PlaceSearch() |
|
}) |
|
} |
|
search(text: string, callback: PlaceSearchCallback) { |
|
return this.self.search(text, (status, result) => { |
|
callback.call(this.component, status, result) |
|
}) |
|
} |
|
} |
|
|
|
export class GaodeMouseTool extends GaodeBasic implements IMouseTool { |
|
constructor(map: IMap) { |
|
super(); |
|
AMap.plugin(["AMap.RangingTool", "AMap.MouseTool"], () => { |
|
this.self = new AMap.MouseTool(map.self); |
|
}) |
|
} |
|
rule(options: any) { |
|
let conf = MapTools.ExplicitConvert(options); |
|
return this.self.rule(conf) |
|
} |
|
measureArea(options: any) { |
|
return this.self.measureArea(options) |
|
} |
|
close(isTrue: boolean) { |
|
return this.self.close(isTrue) |
|
} |
|
} |
|
|
|
export class GaodeInfoWindow extends GaodeBasic implements IInfoWindow { |
|
constructor(options: any) { |
|
super(); |
|
options.offset = options.offset.self |
|
this.self = new AMap.InfoWindow(options); |
|
} |
|
open(map: IMap) { |
|
return this.self.open(map.self) |
|
} |
|
listen(html: any, event: string, callback: Function) { |
|
return this.self.listen(html, event, callback) |
|
} |
|
} |
|
|
|
export class GaodeCircle extends GaodeBasic implements ICircle { |
|
constructor(options: Object) { |
|
super(); |
|
this.self = new AMap.Circle(options); |
|
} |
|
setMap(map: IMap) { |
|
return this.self.setMap(map.self) |
|
} |
|
setCenter(pos: number[]) { |
|
return this.self.setCenter(pos) |
|
} |
|
setRadius(num: number) { |
|
return this.self.setRadius(num) |
|
} |
|
} |
|
|
|
export class GaoDeRenderClusterMarker implements IRenderClusterMarker, ISelf { |
|
discriminator: string = "ISelfCombine"; |
|
getFirstImages(context: any): string { |
|
return context.data[0].image; |
|
} |
|
contentRender: HtmlRender; |
|
contentNonRender: HtmlRender; |
|
pixelRender: PixelRender; |
|
pixelNonRender: PixelRender; |
|
get self(): any { |
|
return { |
|
renderClusterMarker: (context) => { |
|
context.marker.setContent(this.contentRender(context.count)); |
|
context.marker.setOffset(this.pixelRender(context.count).self); |
|
}, |
|
renderMarker: (context) => { |
|
context.marker.setContent(this.contentNonRender(this.getFirstImages(context))); |
|
context.marker.setOffset(this.pixelNonRender(context.count).self); |
|
} |
|
}; |
|
} |
|
} |