0

0

使用API高效筛选城市列表:基于驾驶距离的地理数据处理教程

碧海醫心

碧海醫心

发布时间:2025-10-19 09:05:45

|

547人浏览过

|

来源于php中文网

原创

使用API高效筛选城市列表:基于驾驶距离的地理数据处理教程

本教程旨在帮助您解决如何高效筛选指定城市列表的问题,特别是当您需要根据城市间的驾驶距离进行过滤时。我们将聚焦于一个具体场景:从一份德国城市列表中,筛选出与特定“主位置”(例如哈默尔恩,德国下萨克森州)驾驶距离在75公里以内(含)的所有城市。不同于手动网页抓取,本教程将引导您采用更专业、更稳定的api集成方案,以确保数据获取的准确性、稳定性和处理效率。

理解挑战:为何不推荐直接网页抓取

在处理地理位置数据时,许多开发者可能会首先想到通过网页抓取(Web Scraping)来获取所需信息。例如,用户最初尝试通过抓取 www.luftlinie.org 网站上的距离数据。然而,这种方法存在以下几个主要弊端:

  1. 跨域资源共享(CORS)问题: 浏览器出于安全考虑,默认禁止网页脚本向不同域名的服务器发起请求。直接通过前端JavaScript抓取第三方网站通常会遇到CORS限制,导致请求失败。
  2. 网站结构变动: 网页抓取依赖于目标网站的HTML结构。一旦网站布局或HTML元素发生变化,您的抓取代码就会失效,需要频繁维护。
  3. 效率低下: 抓取HTML并解析所需数据比直接调用API获取结构化数据要慢得多,尤其是在需要处理大量数据时。
  4. 服务条款: 多数网站的服务条款禁止未经授权的自动化抓取,可能导致IP被封禁或面临法律风险。

因此,对于需要稳定、高效、可靠获取地理距离数据的应用场景,使用专业的地理距离API是更优的选择。

解决方案:利用 distance.to API

幸运的是,许多地理信息服务都提供了API接口。distance.to 就是其中之一,并且它在RapidAPI平台上提供了易于集成的API服务。通过使用API,您可以规避上述所有问题,直接获取结构化的距离数据。

1. 前提条件

在使用distance.to API之前,您需要完成以下准备工作:

  • 注册RapidAPI账户: 访问 RapidAPI 并注册一个免费账户。
  • 订阅 distance.to API: 在RapidAPI市场上搜索 distance.to,并订阅其服务。通常,它会提供一个免费层级(Free Tier),允许您在一定限额内免费使用。
  • 获取API密钥: 订阅后,您将在RapidAPI控制台中获得一个API密钥(X-RapidAPI-Key)和API主机(X-RapidAPI-Host)。这些是您发起API请求时需要包含的认证信息。

2. API 使用概述

distance.to API通常提供一个或多个端点来计算两点之间的距离。以计算驾驶距离为例,您可能需要使用一个类似于 /v1/route-summary 的端点,并提供起点和终点的地址信息。API响应通常是JSON格式,其中包含距离、时间等详细信息。

核心步骤:

Krea AI
Krea AI

多功能的一站式AI图像生成和编辑平台

下载
  1. 构建API请求URL: 包含起点、终点和必要的参数。
  2. 设置请求头: 包含您的RapidAPI密钥和主机。
  3. 发送HTTP请求: 使用JavaScript的 fetch API或axios库。
  4. 解析API响应: 从JSON数据中提取驾驶距离。
  5. 应用过滤逻辑: 根据距离阈值(75公里)筛选城市。
  6. 展示结果: 将符合条件的城市显示在网页上。

3. 示例代码:筛选德国城市列表

以下是一个使用JavaScript(配合async/await和fetch)实现城市筛选的完整示例。

<!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; }
        #results { margin-top: 20px; border: 1px solid #ccc; padding: 15px; min-height: 100px; }
        ul { list-style-type: none; padding: 0; }
        li { margin-bottom: 5px; }
        .loading { color: gray; }
        .error { color: red; }
    </style>
</head>
<body>
    <h1>德国城市驾驶距离筛选</h1>
    <p>筛选出与主位置“哈默尔恩, 下萨克森州, 德国”驾驶距离在75公里以内(含)的城市。</p>
    <button id="filterButton">开始筛选</button>
    <div id="results">
        <p class="loading">点击“开始筛选”按钮以获取结果...</p>
    </div>

    <script>
        // 请替换为您的RapidAPI密钥和主机
        const RAPIDAPI_KEY = "YOUR_RAPIDAPI_KEY"; 
        const RAPIDAPI_HOST = "distance-to.p.rapidapi.com"; // 根据RapidAPI文档获取

        const mainPosition = "Hameln,Niedersachsen,DEU"; // 主位置
        const maxDistanceKm = 75; // 最大允许距离(公里)

        // 待筛选的德国城市列表
        const germanCities = [
            "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 resultsDiv = document.getElementById('results');
        const filterButton = document.getElementById('filterButton');

        /**
         * 调用distance.to API获取两点间的驾驶距离
         * @param {string} from 起点城市
         * @param {string} to 终点城市
         * @returns {Promise<number|null>} 驾驶距离(公里)或null(如果发生错误)
         */
        async function getDrivingDistance(from, to) {
            // 确保城市名称在URL中正确编码
            const fromEncoded = encodeURIComponent(from + ",Niedersachsen,DEU"); // 假设所有城市都在下萨克森州,可根据实际情况调整
            const toEncoded = encodeURIComponent(to + ",Niedersachsen,DEU");

            // 构建API请求URL
            // 注意:具体的API端点和参数可能需要根据distance.to在RapidAPI上的文档进行调整
            const url = `https://${RAPIDAPI_HOST}/v1/route-summary?from=${fromEncoded}&to=${toEncoded}`;

            const options = {
                method: 'GET',
                headers: {
                    'X-RapidAPI-Key': RAPIDAPI_KEY,
                    'X-RapidAPI-Host': RAPIDAPI_HOST
                }
            };

            try {
                const response = await fetch(url, options);
                if (!response.ok) {
                    const errorText = await response.text();
                    throw new Error(`HTTP error! status: ${response.status}, message: ${errorText}`);
                }
                const data = await response.json();

                // 假设API响应结构中,驾驶距离在data.route.distance.value,单位为公里
                // 请务必根据实际API文档确认此路径
                if (data && data.route && data.route.distance && typeof data.route.distance.value === 'number') {
                    return data.route.distance.value; // 返回公里数
                } else {
                    console.warn(`无法从API响应中解析距离,城市: ${to}`, data);
                    return null;
                }
            } catch (error) {
                console.error(`获取 ${from} 到 ${to} 的距离时发生错误:`, error);
                return null;
            }
        }

        /**
         * 筛选城市并显示结果
         */
        async function filterCities() {
            resultsDiv.innerHTML = '<p class="loading">正在获取距离并筛选城市,请稍候...</p>';
            filterButton.disabled = true;

            const filteredCities = [];
            const promises = germanCities.map(async city => {
                const distance = await getDrivingDistance(mainPosition, city);
                if (distance !== null && distance <= maxDistanceKm) {
                    filteredCities.push({ name: city, distance: distance });
                }
            });

            // 等待所有API请求完成
            await Promise.all(promises);

            // 排序(可选):按距离从小到大
            filteredCities.sort((a, b) => a.distance - b.distance);

            // 显示结果
            if (filteredCities.length > 0) {
                let html = '<h2>符合条件的城市列表:</h2><ul>';
                filteredCities.forEach(city => {
                    html += `<li>${city.name} (距离: ${city.distance.toFixed(2)} 公里)</li>`;
                });
                html += '</ul>';
                resultsDiv.innerHTML = html;
            } else {
                resultsDiv.innerHTML = '<p>没有找到符合条件的城市。</p>';
            }
            filterButton.disabled = false;
        }

        filterButton.addEventListener('click', filterCities);

        // 初始加载时可以自动触发一次,或者等待用户点击
        // filterCities(); 
    </script>
</body>
</html>

代码说明:

  • RAPIDAPI_KEY 和 RAPIDAPI_HOST:请务必替换为从RapidAPI获取的真实密钥和主机名。
  • mainPosition:定义了作为参照的“主位置”。
  • germanCities:存储了待筛选的城市列表。
  • getDrivingDistance 函数:封装了调用distance.to API的逻辑。它构建URL,设置请求头,发起fetch请求,并解析JSON响应以提取距离。请注意,API响应的结构(例如data.route.distance.value)需要根据distance.to在RapidAPI上的最新文档进行确认。
  • filterCities 函数:这是核心的筛选逻辑。它遍历germanCities列表,为每个城市调用getDrivingDistance函数。由于API请求是异步的,我们使用Promise.all来等待所有请求完成,然后根据maxDistanceKm进行过滤,并将结果显示在页面上。
  • 错误处理:代码中包含了基本的try-catch块来捕获API请求或解析过程中可能发生的错误。

4. 注意事项与最佳实践

  • API密钥安全: 在客户端(浏览器)代码中直接暴露API密钥存在安全风险。对于生产环境应用,更推荐将API请求发送到您自己的后端服务器,由后端服务器使用密钥调用第三方API,再将结果返回给前端。这样可以保护您的API密钥不被泄露。
  • API限额与计费: RapidAPI上的免费层级通常有请求次数限制。在开发和测试时请留意您的使用情况,避免超出限额。对于高并发或大规模数据处理,可能需要升级到付费层级。
  • 错误处理与用户反馈: 确保您的代码能够妥善处理API调用失败、网络中断等情况,并向用户提供清晰的反馈(例如,“数据加载失败,请稍后再试”)。
  • 异步操作: API调用是异步的。理解并正确使用 Promise、async/await 是编写此类应用程序的关键。
  • 性能优化: 如果城市列表非常庞大,一次性发起所有API请求可能会导致性能问题或触发API限流。可以考虑分批次(Batch Processing)处理,或实现请求队列和节流(Throttling)。
  • 地址格式: distance.to API对地址格式可能有特定要求。在示例中,我们假设通过添加,Niedersachsen,DEU可以帮助API准确识别城市。实际使用时,请查阅API文档,确保传递正确的地址或地理坐标。
  • 单位转换: 确认API返回的距离单位(公里、英里等),并根据需要进行转换。本示例假设返回单位为公里。

总结

通过本教程,您应该已经掌握了如何利用专业的地理距离API(如RapidAPI上的distance.to)来高效、稳定地筛选城市列表。相比于传统的网页抓取,API集成方案提供了更高的可靠性、更快的响应速度和更好的可维护性。记住,在实际项目中,始终优先考虑使用官方提供的API接口,并注意API密钥安全、限额管理和完善的错误处理机制。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

456

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

546

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1925

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

656

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2395

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号