14 changed files with 1058 additions and 1129 deletions
@ -0,0 +1,259 @@ |
|||
import nextTick from "dai-js/tools/nextTick"; |
|||
|
|||
export const mapType = typeof window.TMap !== "undefined" ? "qq" : "td"; |
|||
|
|||
export const QQMap = window.TMap; |
|||
export const TDMap = window.T; |
|||
|
|||
export function searchNearby(map, keyword) { |
|||
if (mapType == "qq") { |
|||
return new Promise((reslove) => { |
|||
const search = new QQMap.service.Search(map, { pageSize: 10 }); |
|||
search |
|||
.searchNearby({ |
|||
keyword, |
|||
radius: 1000, |
|||
autoExtend: true, |
|||
center: map.getCenter(), |
|||
}) |
|||
.then((result) => { |
|||
let { data } = result; |
|||
if (Array.isArray(data) && data.length > 0) { |
|||
const { |
|||
location: { lat, lng, address }, |
|||
} = data[0]; |
|||
reslove({ |
|||
msg: "success", |
|||
data: { |
|||
lng, |
|||
lat, |
|||
address, |
|||
resultList: data, |
|||
}, |
|||
}); |
|||
} else { |
|||
reslove({ |
|||
msg: "failed", |
|||
error: "未检索到相关位置坐标", |
|||
}); |
|||
} |
|||
}) |
|||
.catch((error) => { |
|||
reslove({ |
|||
msg: "failed", |
|||
error, |
|||
}); |
|||
}); |
|||
}); |
|||
} else { |
|||
return new Promise(async (reslove) => { |
|||
const search = new TDMap.LocalSearch(map, { pageCapacity: 10 }); |
|||
search.setQueryType(1); |
|||
search.searchNearby(keyword, map.getCenter(), 1000000000); |
|||
|
|||
await nextTick(1000); |
|||
|
|||
const result = search.getResults(); |
|||
const data = result ? result.getPois() : null; |
|||
|
|||
console.log("检索结果", data); |
|||
|
|||
if (Array.isArray(data) && data.length > 0) { |
|||
const { lonlat, address, name } = data[0]; |
|||
const lng = lonlat.split(" ")[0]; |
|||
const lat = lonlat.split(" ")[1]; |
|||
reslove({ |
|||
msg: "success", |
|||
data: { |
|||
lng, |
|||
lat, |
|||
address: address + name, |
|||
resultList: data, |
|||
}, |
|||
}); |
|||
} else { |
|||
reslove({ |
|||
msg: "failed", |
|||
error: "未检索到相关位置坐标", |
|||
}); |
|||
} |
|||
}); |
|||
} |
|||
} |
|||
|
|||
// 封装了地图相关函数,兼容天地图、腾讯地图常用api
|
|||
export default function init(ele, position, params) { |
|||
this.mapType = mapType; |
|||
this.map = null; |
|||
this.marker = null; |
|||
this.markers = null; |
|||
this.getCenter = function () { |
|||
return { |
|||
lat: 0, |
|||
lng: 0, |
|||
}; |
|||
}; |
|||
this.setCenter = function (lat, lng) {}; |
|||
this.setMarker = function (lat, lng, title) {}; |
|||
this.getAddress = async function (lat, lng) {}; |
|||
this.on = function (eventType, fn) {}; |
|||
|
|||
let { latitude, longitude } = position; |
|||
if (!latitude || latitude == "" || latitude == "0") { |
|||
latitude = 39.9088810666821; |
|||
longitude = 116.39743841556731; |
|||
} |
|||
|
|||
if (mapType == "qq") { |
|||
let center = new QQMap.LatLng(latitude, longitude); |
|||
this.map = new QQMap.Map(ele, { |
|||
center, |
|||
...params, |
|||
}); |
|||
|
|||
this.markers = new QQMap.MultiMarker({ |
|||
map: this.map, |
|||
geometries: [], |
|||
}); |
|||
|
|||
this.getCenter = function () { |
|||
const center = this.map.getCenter(); |
|||
const lat = center.getLat(); |
|||
const lng = center.getLng(); |
|||
return { lat, lng }; |
|||
}; |
|||
|
|||
this.setCenter = function (lat, lng) { |
|||
this.map.setCenter(new QQMap.LatLng(lat, lng)); |
|||
}; |
|||
|
|||
this.setMarker = function (lat, lng, title = "位置") { |
|||
this.markers.setGeometries([]); |
|||
this.markers.add([ |
|||
{ |
|||
id: "4", |
|||
styleId: "marker", |
|||
position: new QQMap.LatLng(lat, lng), |
|||
properties: { |
|||
title, |
|||
}, |
|||
}, |
|||
]); |
|||
}; |
|||
|
|||
this.geocoder = new QQMap.service.Geocoder(); // 新建一个正逆地址解析类
|
|||
this.getAddress = async function (lat, lng) { |
|||
return new Promise((reslove) => { |
|||
this.geocoder |
|||
.getAddress({ location: new QQMap.LatLng(lat, lng) }) // 将给定的坐标位置转换为地址
|
|||
.then((result) => { |
|||
reslove({ |
|||
msg: "success", |
|||
data: { |
|||
address: result.result.address, |
|||
}, |
|||
}); |
|||
}) |
|||
.catch((error) => { |
|||
reslove({ |
|||
msg: "failed", |
|||
error, |
|||
}); |
|||
}); |
|||
}); |
|||
}; |
|||
|
|||
this.on = function (eventType, fn) { |
|||
if (eventType == "dragend") { |
|||
this.map.on("moveend", (e) => { |
|||
console.log("dragend", e); |
|||
if (e && e.originalEvent) { |
|||
fn(e); |
|||
} |
|||
}); |
|||
} else { |
|||
this.map.on(eventType, fn); |
|||
} |
|||
}; |
|||
} else { |
|||
if (typeof ele == "string") { |
|||
ele = document.getElementById("app"); |
|||
} |
|||
let width = ele.offsetWidth; |
|||
let height = ele.offsetHeight; |
|||
if (height == 0) { |
|||
ele.style.height = width * 0.5 + "px"; |
|||
} |
|||
|
|||
let center = new TDMap.LngLat(longitude, latitude); |
|||
this.map = new TDMap.Map(ele, { |
|||
center, |
|||
...params, |
|||
}); |
|||
|
|||
this.getCenter = function () { |
|||
const center = this.map.getCenter(); |
|||
const lat = center.getLat(); |
|||
const lng = center.getLng(); |
|||
return { lat, lng }; |
|||
}; |
|||
|
|||
this.setCenter = function (lat, lng) { |
|||
this.map.panTo(new TDMap.LngLat(lng, lat)); |
|||
}; |
|||
|
|||
this.setMarker = function (lat, lng, title = "位置") { |
|||
let lnglat = new TDMap.LngLat(lng, lat); |
|||
if (!this.marker) { |
|||
this.marker = new TDMap.Marker(lnglat, { |
|||
title, |
|||
}); |
|||
this.map.addOverLay(this.marker); |
|||
} else { |
|||
this.marker.setLngLat(lnglat); |
|||
} |
|||
}; |
|||
|
|||
this.geocoder = new TDMap.Geocoder(); // 新建一个正逆地址解析类
|
|||
this.getAddress = async function (lat, lng) { |
|||
return new Promise((reslove) => { |
|||
this.geocoder.getLocation(new TDMap.LngLat(lng, lat), (result) => { |
|||
if (result) { |
|||
console.log("this.geocoder.getLocation", result); |
|||
let status = result.getStatus(); |
|||
reslove({ |
|||
msg: "success", |
|||
data: { |
|||
address: result.getAddress(), |
|||
}, |
|||
}); |
|||
} else { |
|||
reslove({ |
|||
msg: "failed", |
|||
error: "解析失败", |
|||
}); |
|||
} |
|||
}); |
|||
}); |
|||
}; |
|||
|
|||
this.on = function (eventType, fn) { |
|||
if (eventType == "dragend") { |
|||
this.map.on("dragend", (e) => { |
|||
console.log("dragend", e); |
|||
fn(e); |
|||
}); |
|||
} else { |
|||
this.map.on(eventType, fn); |
|||
} |
|||
}; |
|||
} |
|||
|
|||
this.searchNearby = async function (keyword) { |
|||
const ret = await searchNearby(this.map, keyword); |
|||
|
|||
return ret; |
|||
}; |
|||
|
|||
return this; |
|||
} |
|||
Loading…
Reference in new issue