Files
opencloud/.agents/skills/amap-jsapi-skill/references/geocoder.md

4.4 KiB

地理编码 (Geocoder)

地理编码服务提供了将地址转换为经纬度(正向地理编码)和将经纬度转换为地址(逆向地理编码)的功能。

1. 加载插件

使用 AMapLoader 加载时需要包含 AMap.Geocoder 插件。

AMapLoader.load({
    key: '您的Key',
    version: '2.0',
    plugins: ['AMap.Geocoder'] // 预加载插件
}).then((AMap) => {
    // ...
});

2. 正向地理编码 (地址 -> 坐标)

将详细的结构化地址转换为经纬度坐标。

const geocoder = new AMap.Geocoder({
    city: '010', // 城市,默认全国
});

geocoder.getLocation('北京市朝阳区阜通东大街6号', function(status, result) {
    if (status === 'complete' && result.info === 'OK') {
        // result.geocodes 是一个数组
        const { location, formattedAddress } = result.geocodes[0];
        console.log('坐标:', location.lng, location.lat);
        console.log('规范地址:', formattedAddress);
        
        // 在地图上标记
        map.setCenter(location);
        new AMap.Marker({
            map: map,
            position: location
        });
    } else {
        console.error('地理编码失败');
    }
});

3. 逆向地理编码 (坐标 -> 地址)

将经纬度坐标转换为详细地址信息。

const lnglat = [116.396574, 39.992706];

geocoder.getAddress(lnglat, function(status, result) {
    if (status === 'complete' && result.info === 'OK') {
        // result.regeocode 包含详细地址信息
        const address = result.regeocode.formattedAddress;
        console.log('地址:', address);
        
        // 获取周边 POI、道路等详细信息
        const { roads, pois, aois } = result.regeocode.addressComponent;
    } else {
        console.error('逆地理编码失败');
    }
});

完整示例

地址搜索定位

const map = new AMap.Map('container', {
  zoom: 14,
  center: [116.397, 39.909]
});

const geocoder = new AMap.Geocoder({
  city: '北京',
  extensions: 'all'
});

const input = document.getElementById('addressInput');
const btn = document.getElementById('searchBtn');

btn.onclick = function() {
  const address = input.value.trim();
  if (!address) return;
  
  geocoder.getLocation(address, function(status, result) {
    if (status === 'complete' && result.geocodes.length > 0) {
      const geocode = result.geocodes[0];
      
      // 清除之前的标记
      map.clearMap();
      
      // 添加标记
      const marker = new AMap.Marker({
        map: map,
        position: geocode.location
      });
      
      // 信息窗体
      const infoWindow = new AMap.InfoWindow({
        content: `
          <div>
            <h4>${geocode.formattedAddress}</h4>
            <p>坐标: ${geocode.location.lng}, ${geocode.location.lat}</p>
          </div>
        `,
        offset: new AMap.Pixel(0, -30)
      });
      
      marker.on('click', function() {
        infoWindow.open(map, marker.getPosition());
      });
      
      // 移动视角
      map.setZoomAndCenter(16, geocode.location);
      
      // 自动打开信息窗体
      infoWindow.open(map, geocode.location);
    } else {
      alert('未找到该地址');
    }
  });
};

点击地图获取地址

const map = new AMap.Map('container', {
  zoom: 14,
  center: [116.397, 39.909]
});

const geocoder = new AMap.Geocoder({
  extensions: 'all'
});

const infoWindow = new AMap.InfoWindow({
  offset: new AMap.Pixel(0, -15)
});

map.on('click', function(e) {
  const lnglat = [e.lnglat.getLng(), e.lnglat.getLat()];
  
  geocoder.getAddress(lnglat, function(status, result) {
    if (status === 'complete') {
      const address = result.regeocode.formattedAddress;
      
      infoWindow.setContent(`
        <div style="padding: 10px;">
          <p><strong>地址:</strong> ${address}</p>
          <p><strong>坐标:</strong> ${lnglat[0].toFixed(6)}, ${lnglat[1].toFixed(6)}</p>
        </div>
      `);
      
      infoWindow.open(map, e.lnglat);
    }
  });
});

注意事项

  1. 城市限制: 设置 city 可以提高编码准确度
  2. 详细信息: 需要 POI、道路等信息时设置 extensions: 'all'
  3. 批量查询: 批量查询需要设置 batch: true
  4. 结果数量: 正向编码可能返回多个结果,需要根据 level 判断准确度
  5. 坐标格式: 逆向编码支持数组 [lng, lat] 或 LngLat 对象