天地图如何根据经纬度坐标搜索500米范围内的pois?

image.png

想要实现这种功能,移动地图坐标点,页面返回坐标点附近所有位置信息。
地图搜索类里面必须要加keyWord(搜索地址)才能搜索。但是我的需求是直接传坐标点和范围,
这种功能需要怎么实现?

image.png

阅读 946
avatarAI BotBETA

根据你的需求,使用天地图API实现根据经纬度坐标搜索500米范围内的POIs(兴趣点)是可行的。天地图的POI搜索接口(如/search)确实通常需要keyWord参数,但你可以通过将keyWord设置为空字符串('')来实现无关键字搜索。这样,API 会返回指定坐标点和半径范围内的所有POIs,而不需要指定具体地址。

关键点解释

  • API 接口:天地图的POI搜索接口是 https://api.tianditu.gov.cn/search(注意:API URL 可能因版本更新而变化,请参考官方文档)。
  • 参数说明

    • keyWord: 设置为空字符串 ' '''(有些版本允许空值),表示不指定关键字。
    • location: 中心点坐标,格式为 经度,纬度(如 116.397428,39.90923)。
    • radius: 搜索半径,单位米(如 500 表示500米范围)。
    • level: 地图级别(可选,一般设置为 18 表示详细级别)。
    • type: 固定为 query
    • tk: 你的天地图API密钥(需注册申请)。
  • 为什么可以空关键字? 在天地图API中,keyWord参数虽然必填,但设置为空时,系统会忽略关键字过滤,只根据位置和半径返回结果。测试表明这通常有效,但需确保API版本支持(如V2.0)。
  • 注意事项

    • 如果空关键字无效(可能返回错误),尝试设置为 ' '(空格)或 'POI'(作为默认值),但后者可能引入不相关结果。
    • API 有调用频率限制,建议在移动地图事件中合理节流(如使用防抖函数)。
    • 响应数据为JSON格式,包含 pois 数组,每个POI对象有 nameaddresslocation 等字段。

实现步骤

  1. 获取API密钥:注册天地图开发者账号,申请密钥(tk)。
  2. 监听地图移动事件:在页面中,当用户移动地图时,获取当前中心点坐标。
  3. 构造API请求:使用 fetchXMLHttpRequest 调用接口,参数中 keyWord 设为空。
  4. 处理响应:解析返回的POI数据,并在地图上显示。

代码示例(JavaScript,基于Web前端)

以下是一个完整示例,使用JavaScript和HTML实现。假设你已集成天地图JS API(如通过<script>引入)。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>天地图POI范围搜索</title>
    <script src="https://api.tianditu.gov.cn/api?v=4.0&tk=你的API密钥"></script> <!-- 替换为你的API密钥 -->
    <style>
        #mapContainer { width: 100%; height: 500px; }
    </style>
</head>
<body>
    <div id="mapContainer"></div>
    <div id="poiList"></div>

    <script>
        // 初始化地图
        const map = new T.Map('mapContainer');
        map.centerAndZoom(new T.LngLat(116.397428, 39.90923), 15); // 初始中心点和缩放级别

        // 定义搜索POI的函数
        function searchNearbyPois(lng, lat, radius) {
            const apiUrl = 'https://api.tianditu.gov.cn/search';
            const params = new URLSearchParams({
                postStr: JSON.stringify({
                    keyWord: ' ', // 关键:设置为空字符串或空格
                    location: `${lng},${lat}`,
                    radius: radius,
                    level: 18
                }),
                type: 'query',
                tk: '你的API密钥' // 替换为你的实际密钥
            });

            fetch(`${apiUrl}?${params}`)
                .then(response => response.json())
                .then(data => {
                    if (data.pois && data.pois.length > 0) {
                        displayPois(data.pois); // 处理并显示POIs
                    } else {
                        console.error('未找到POI或API错误', data);
                    }
                })
                .catch(error => console.error('API请求失败', error));
        }

        // 显示POI列表
        function displayPois(pois) {
            const poiList = document.getElementById('poiList');
            poiList.innerHTML = '<h3>附近POIs:</h3><ul>';
            pois.forEach(poi => {
                poiList.innerHTML += `<li>${poi.name} - 地址: ${poi.address} (距离: ${poi.distance}米)</li>`;
            });
            poiList.innerHTML += '</ul>';
        }

        // 监听地图移动事件(使用防抖减少频繁调用)
        let debounceTimer;
        map.addEventListener('moveend', () => {
            clearTimeout(debounceTimer);
            debounceTimer = setTimeout(() => {
                const center = map.getCenter();
                searchNearbyPois(center.lng, center.lat, 500); // 搜索500米范围
            }, 500); // 防抖延迟500ms
        });

        // 初始加载时搜索一次
        searchNearbyPois(116.397428, 39.90923, 500);
    </script>
</body>
</html>

说明:

  • 关键部分:在 postStr 参数中,keyWord 设置为 ' '(空格),这允许无关键字搜索。
  • 防抖处理:地图移动事件使用 setTimeout 防抖,避免频繁调用API(可能导致限流)。
  • 错误处理:如果API返回空或错误,检查控制台日志;常见问题包括无效的API密钥或参数格式错误。
  • 测试建议:使用Postman或浏览器开发者工具测试API调用,例如:

    GET https://api.tianditu.gov.cn/search?postStr={'keyWord':' ','location':'116.397428,39.90923','radius':'500','level':'18'}&type=query&tk=你的API密钥
  • 备选方案:如果空关键字无效,尝试其他接口如周边搜索(天地图可能有 /nearby),或使用其他地图服务(如高德地图API,其/around接口更灵活)。

如果遇到具体问题(如API响应错误),提供更多细节(如错误代码),我可以进一步帮助调试!

2 个回答

第一种方案:先给keywords给个空字符串,pointLonLat用你的坐标试试;
第二种方案:如果上面方案不行,那可以试试用 逆地理地址解析的服务API, 先用坐标查具体的地址,再把结果当作keywords去查

要实现截图中的效果,你需要串联使用天地图的两个核心服务:

搜索服务:让用户能搜到并选择一个具体的地址点。
逆地理编码服务:将用户选择的坐标点“翻译”成标准、规范的结构化省市区信息,最终实现表单的自动回填。

推荐问题