
本文将指导您如何高效地根据驾驶距离筛选城市列表。针对传统网页抓取可能遇到的跨域(cors)和数据解析难题,我们推荐使用专业的第三方地理信息api,例如`distance.to`。教程将详细介绍api的接入流程、javascript代码实现步骤,并提供示例代码,帮助您在前端应用中准确、稳定地获取城市间的驾驶距离,并根据预设条件进行筛选展示。
在开发地理位置相关的应用时,经常会遇到需要根据距离来筛选地点列表的需求。例如,从一份德国城市列表中找出距离特定“主位置”不超过75公里的所有城市。最初,开发者可能会考虑通过网页抓取(Web Scraping)的方式,解析如www.luftlinie.org这类网站的输出。然而,这种方法存在诸多挑战:
面对这些挑战,一种更专业、高效且稳定的解决方案是利用专门的地理信息API服务。
许多提供地理距离计算服务的网站,其背后都运行着一套成熟的API。直接使用这些API,可以规避网页抓取带来的所有问题。以www.luftlinie.org为例,其底层的API服务便是docs.distance.to/api。
以下将演示如何使用JavaScript(结合fetch API)来调用Distance.to API,筛选出距离主位置不超过75公里的城市。
首先,我们需要定义一个包含待筛选城市的数组,以及作为参照的“主位置”。
// 定义主位置,通常包含城市、州/省、国家信息,以便API准确识别
const mainPosition = "Hameln,Niedersachsen,DEU";
// 待筛选的德国城市列表
const cities = [
    "Bad Eilsen", "Buchholz", "Hannover", "Heeßen", "Luhden", "Samtgemeinde Lindhorst",
    "Beckedorf", "Heuerßen", "Berlin", "Lindhorst", "Lüdersfeld", "Samtgemeinde Nenndorf",
    "Bad Nenndorf", "Haste", "Kassel", "Hohnhorst", "Suthfeld", "Samtgemeinde Niedernwöhren",
    "Lauenhagen", "Meerbeck", "Dortmund", "Niedernwöhren", "Nordsehl", "Pollhagen",
    "Wiedensahl", "Samtgemeinde Nienstädt", "Helpsen", "Hespe", "Frankfurt", "Nienstädt",
    "Freiburg", "Seggebruch", "Potsdam"
];
// 设定最大距离阈值(公里)
const maxDistanceKm = 75;
// 用于显示结果的DOM元素
const resultsContainer = document.getElementById('city-results'); // 假设页面中有一个id为'city-results'的div
if (!resultsContainer) {
    console.error("Error: 'city-results' container not found.");
    // 如果没有找到,创建一个并添加到body
    const newDiv = document.createElement('div');
    newDiv.id = 'city-results';
    document.body.appendChild(newDiv);
    resultsContainer = newDiv;
}接下来,我们将遍历城市列表,为每个城市构造API请求,发送请求,并根据返回的距离进行筛选。
请注意:以下代码中的RAPIDAPI_KEY和RAPIDAPI_HOST是占位符,您需要替换为从RapidAPI获取的真实值。API的URL结构和响应格式可能因具体API版本而异,请参考Distance.to API的官方文档。
// RapidAPI相关配置(请替换为您的真实API Key和Host)
const RAPIDAPI_KEY = 'YOUR_RAPIDAPI_KEY_HERE'; // 从RapidAPI获取
const RAPIDAPI_HOST = 'distance-to.p.rapidapi.com'; // Distance.to API的RapidAPI Host
// API端点,根据Distance.to API文档确定
const API_ENDPOINT = `https://${RAPIDAPI_HOST}/v1/distance`;
/**
 * 异步函数:根据驾驶距离筛选城市
 */
async function filterCitiesByDrivingDistance() {
    resultsContainer.innerHTML = '<h2>符合条件的城市:</h2><ul></ul>'; // 清空并初始化结果列表
    const ulElement = resultsContainer.querySelector('ul');
    for (const city of cities) {
        // 构造API请求URL
        const url = new URL(API_ENDPOINT);
        // 假设API参数名为'from'和'to'
        url.searchParams.append('from', mainPosition);
        // 为了确保API准确识别,可以为目标城市也添加州/省和国家信息
        // 这里简化为假设所有待筛选城市都在Niedersachsen, DEU
        url.searchParams.append('to', `${city},Niedersachsen,DEU`);
        try {
            // 发送API请求
            const response = await fetch(url.toString(), {
                method: 'GET',
                headers: {
                    'X-RapidAPI-Host': RAPIDAPI_HOST,
                    'X-RapidAPI-Key': RAPIDAPI_KEY,
                    'Accept': 'application/json' // 明确请求JSON格式响应
                }
            });
            // 检查响应状态码
            if (!response.ok) {
                throw new Error(`API请求失败,状态码: ${response.status} - ${response.statusText}`);
            }
            // 解析JSON响应
            const data = await response.json();
            // 假设API响应结构为 { distance: { value: 50, unit: "km" } }
            const distanceInKm = data.distance ? data.distance.value : null;
            if (distanceInKm !== null) {
                console.log(`${mainPosition} 到 ${city} 的距离: ${distanceInKm} km`);
                if (distanceInKm <= maxDistanceKm) {
                    // 如果距离符合条件,则添加到结果列表
                    const listItem = document.createElement('li');
                    listItem.textContent = `${city} (距离: ${distanceInKm} km)`;
                    ulElement.appendChild(listItem);
                }
            } else {
                console.warn(`无法获取 ${city} 的距离信息,API响应可能不完整。`, data);
            }
        } catch (error) {
            console.error(`处理城市 ${city} 时发生错误:`, error);
            const errorItem = document.createElement('li');
            errorItem.textContent = `${city} (获取距离失败: ${error.message})`;
            errorItem.style.color = 'red';
            ulElement.appendChild(errorItem);
        }
    }
}
// 在页面加载完成后调用筛选函数
document.addEventListener('DOMContentLoaded', () => {
    // 确保在生产环境中,API Key不直接暴露在客户端代码中
    // 考虑使用服务器端代理来隐藏API Key
    if (RAPIDAPI_KEY === 'YOUR_RAPIDAPI_KEY_HERE') {
        resultsContainer.innerHTML = '<p style="color:red;">请在代码中替换 `YOUR_RAPIDAPI_KEY_HERE` 为您的真实RapidAPI Key。</p>';
    } else {
        filterCitiesByDrivingDistance();
    }
});为了运行上述JavaScript代码,您需要一个基本的HTML文件:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>城市距离筛选教程</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; }
        #city-results { border: 1px solid #ccc; padding: 15px; margin-top: 20px; }
        #city-results ul { list-style-type: none; padding: 0; }
        #city-results li { margin-bottom: 5px; padding: 5px; border-bottom: 1px dashed #eee; }
    </style>
</head>
<body>
    <h1>根据驾驶距离筛选城市列表</h1>
    <p>本页面将展示距离哈默尔恩(Hameln)不超过75公里的德国城市。</p>
    <div id="city-results">
        <!-- 筛选结果将显示在此处 -->
        <p>正在加载中...</p>
    </div>
    <script src="your_script_file.js"></script> <!-- 替换为您的JavaScript文件路径 -->
</body>
</html>将上面的JavaScript代码保存为your_script_file.js,并在HTML文件中正确引用。
通过利用专业的地理信息API,如Distance.to,我们可以高效、稳定且合法地解决根据驾驶距离筛选城市列表的问题。相比传统的网页抓取,API方式不仅规避了跨域、解析复杂性等技术难题,还提供了更强大的功能和更好的可维护性。遵循API接入规范和最佳实践,将有助于您构建出功能强大且用户体验良好的地理位置应用。
以上就是使用Distance.to API高效筛选城市列表:解决跨域与数据获取难题的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                
                                
                                
                                
                                
                                
                                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号