0

0

基于API的城市驾车距离筛选教程

聖光之護

聖光之護

发布时间:2025-10-18 12:14:22

|

599人浏览过

|

来源于php中文网

原创

基于API的城市驾车距离筛选教程

本文将详细介绍如何高效地根据驾车距离筛选城市列表。文章将阐述为何直接进行网页抓取存在局限性,并推荐转而利用专业的距离计算api(如`distance.to`)作为更可靠、高效的解决方案。我们将通过实际代码示例,指导读者实现从指定“主位置”筛选出75公里内城市的完整流程,并强调api使用的优势、注意事项及最佳实践。

在现代应用开发中,根据地理位置或距离筛选数据是一项常见需求。例如,您可能需要从一个城市列表中找出距离特定“主位置”在指定范围内的所有城市。这在物流、本地服务推荐或地理信息系统中都非常有用。

直接网页抓取的局限性与挑战

最初,面对这样的需求,许多开发者可能会考虑直接从提供距离查询服务的网站(如luftlinie.org)抓取数据。这种方法通常涉及以下步骤:

  1. 构建带有城市名称的查询URL。
  2. 发送HTTP请求获取网页内容。
  3. 解析HTML页面,提取包含距离信息的特定元素(例如,一个带有特定ID或class的标签)。
  4. 将提取到的距离数据进行比较和筛选。

然而,这种直接的网页抓取(Web Scraping)方法存在诸多问题:

  • 跨域资源共享(CORS)问题: 浏览器出于安全考虑,会阻止网页脚本向不同源的服务器发起请求。这意味着您在自己的网站上运行的JavaScript代码,很难直接抓取另一个网站的内容。
  • HTML结构不稳定: 目标网站的HTML结构可能随时改变,导致您的解析代码失效,需要频繁维护。
  • 效率低下: 抓取整个网页并解析HTML通常比直接获取结构化数据更耗时、耗资源。
  • 法律与道德风险: 未经许可的网页抓取可能违反网站的服务条款,甚至涉及法律风险。
  • 缺乏API密钥管理: 无法有效控制请求频率,容易被目标网站封禁IP。

以下是一个尝试直接抓取luftlinie.org的失败示例,它很可能因为CORS问题而无法正常工作:


专业解决方案:利用距离计算API

鉴于直接网页抓取的诸多局限性,更推荐的解决方案是利用专业的距离计算API。许多提供地理信息服务的平台都开放了API接口,例如distance.to网站本身就基于一个API(可在docs.distance.to/api查看其文档),并且通常通过像RapidAPI这样的API市场进行分发。

使用API的优势包括:

  • 数据结构化: API通常返回JSON或XML等结构化数据,易于解析和处理。
  • 稳定性与可靠性: API接口通常有明确的契约和版本管理,稳定性远高于网页HTML结构。
  • 高效性: 直接获取所需数据,无需下载和解析整个网页。
  • 解决CORS问题: 多数公共API都支持CORS,允许前端应用直接调用。
  • 配额与计费: API服务通常提供免费层级和付费计划,便于管理和控制使用成本。

API接入与配置

要使用距离计算API,通常需要以下步骤:

  1. 注册API平台: 例如在RapidAPI上注册账号。
  2. 订阅API: 找到并订阅distance.to或其他地理距离API。
  3. 获取API Key: 平台会为您生成一个API密钥(X-RapidAPI-Key),这是您调用API的凭证。
  4. 查阅API文档: 了解API的端点(Endpoint)、请求方法(GET/POST)、所需参数(起点、终点、单位等)以及响应数据格式。

一个典型的距离计算API请求可能包含起点、终点和单位参数,并返回一个包含距离数值的JSON对象。

Cursor
Cursor

一个新的IDE,使用AI来帮助您重构、理解、调试和编写代码。

下载

示例:API请求与数据处理

以下是一个使用JavaScript(结合jQuery,与用户原代码风格保持一致)通过API获取并处理距离的示例。请注意,https://api.example.com/distance是一个占位符,您需要替换为实际的API端点,并根据distance.to或其他API的文档调整请求参数和响应解析逻辑。

// 假设的API端点和API密钥
const API_ENDPOINT = 'https://api.example.com/distance'; // 替换为实际的API端点,例如RapidAPI上的distance.to端点
const RAPIDAPI_KEY = 'YOUR_RAPIDAPI_KEY'; // 替换为您的RapidAPI密钥
const RAPIDAPI_HOST = 'distance.p.rapidapi.com'; // 替换为实际的API主机

/**
 * 异步函数:通过API获取两个地点之间的驾车距离
 * @param {string} origin - 起点城市名称或坐标
 * @param {string} destination - 终点城市名称或坐标
 * @returns {Promise} 距离(公里)或null(如果发生错误)
 */
async function getDrivingDistance(origin, destination) {
    // 假设API接受 origin, destination, units 参数
    const params = new URLSearchParams({
        origin: origin,
        destination: destination,
        units: 'km' // 请求单位为公里
    });

    try {
        const response = await $.ajax({
            url: `${API_ENDPOINT}?${params.toString()}`,
            method: 'GET',
            headers: {
                'X-RapidAPI-Host': RAPIDAPI_HOST,
                'X-RapidAPI-Key': RAPIDAPI_KEY
            }
        });

        // 假设API响应是一个JSON对象,包含一个 'distance' 字段
        // 例如:{ "distance": 123.45, "unit": "km" }
        if (response && typeof response.distance === 'number') {
            return response.distance;
        } else {
            console.error('API响应格式不正确:', response);
            return null;
        }
    } catch (error) {
        console.error(`获取 ${origin} 到 ${destination} 距离失败:`, error);
        return null;
    }
}

实现城市距离筛选的完整步骤

现在,我们将结合上述API调用方法,实现一个完整的城市距离筛选功能。

1. 准备数据

首先,定义您的“主位置”和待筛选的城市列表。

const mainPosition = "Hameln,Niedersachsen,DEU";
const citiesToFilter = [
    "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 MAX_DISTANCE_KM = 75; // 筛选阈值:75公里

2. 异步请求与距离判断

由于API请求是异步的,我们需要使用async/await来处理。为了提高效率,可以并行发起所有城市的距离查询请求。




    
    
    城市驾车距离筛选
    
    


    

筛选距离在75公里内的城市

主位置:

正在计算距离,请稍候...

符合条件的城市:

所有城市及距离:

在上述代码中:

  • getDrivingDistance函数负责调用API获取单个城市的距离。
  • filterAndDisplayCities函数是主逻辑,它遍历城市列表,为每个城市调用getDrivingDistance。
  • Promise.allSettled用于等待所有API请求完成,无论成功或失败,这样可以确保所有城市都被处理。
  • 根据返回的距离和MAX_DISTANCE_KM阈值,将城市添加到不同的列表中,并在HTML中显示。

注意事项与最佳实践

  1. API密钥安全: 在客户端(浏览器)代码中直接暴露API密钥存在安全风险,尤其对于付费API。更安全的做法是将API调用放在后端服务器进行,由后端服务器代理请求并管理密钥。如果必须在前端使用,请确保API服务提供商支持基于域名的访问限制,并仅授予必要的权限。
  2. API限额与计费: 大多数API服务都有免费层级和请求限额。在开发和测试阶段注意监控使用量,避免超出限额导致服务中断或产生额外费用。对于

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

420

2023.08.07

json是什么
json是什么

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

536

2023.08.23

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

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

312

2023.10.13

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

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

77

2025.09.10

jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

151

2023.09.12

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

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

312

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

396

2023.11.10

jQuery hover()方法的使用
jQuery hover()方法的使用

hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

504

2023.12.04

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

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

精品课程

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

共58课时 | 4.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.6万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

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

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