mapAPI.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // 查询 OSM 周边所有 POI(不限制类型)
  2. export function getOSMAround(lat, lon, radius = 500) {
  3. // Overpass Query
  4. const query = `
  5. [out:json];
  6. (
  7. node(around:${radius},${lat},${lon})["amenity"];
  8. node(around:${radius},${lat},${lon})["shop"];
  9. node(around:${radius},${lat},${lon})["tourism"];
  10. node(around:${radius},${lat},${lon})["leisure"];
  11. node(around:${radius},${lat},${lon})["public_transport"];
  12. );
  13. out center;
  14. `;
  15. return new Promise((resolve, reject) => {
  16. uni.request({
  17. url: "https://overpass-api.de/api/interpreter",
  18. method: "POST",
  19. header: {
  20. "Content-Type": "application/x-www-form-urlencoded"
  21. },
  22. data: query,
  23. success: (res) => {
  24. if (res.data && res.data.elements) {
  25. resolve(res.data.elements); // 返回 OSM 对象列表
  26. } else {
  27. resolve([]);
  28. }
  29. },
  30. fail: (err) => {
  31. reject(err);
  32. }
  33. });
  34. });
  35. };
  36. export function geoByName(keyword) {
  37. return new Promise((resolve, reject) => {
  38. uni.request({
  39. url: "https://nominatim.openstreetmap.org/search",
  40. method: "GET",
  41. data: {
  42. q: keyword, // 地名
  43. format: "jsonv2", // 返回 JSON 格式
  44. addressdetails: 1 // 返回详细地址
  45. },
  46. header: {
  47. "User-Agent": "uni-app - OSM Demo"
  48. },
  49. success: (res) => {
  50. if (res.data && res.data.length > 0) {
  51. resolve(res.data[0]); // 返回最匹配项
  52. } else {
  53. resolve(null);
  54. }
  55. },
  56. fail: (err) => reject(err)
  57. });
  58. });
  59. };