
本文将详细介绍如何高效地根据驾车距离筛选城市列表。文章将阐述为何直接进行网页抓取存在局限性,并推荐转而利用专业的距离计算api(如`distance.to`)作为更可靠、高效的解决方案。我们将通过实际代码示例,指导读者实现从指定“主位置”筛选出75公里内城市的完整流程,并强调api使用的优势、注意事项及最佳实践。
在现代应用开发中,根据地理位置或距离筛选数据是一项常见需求。例如,您可能需要从一个城市列表中找出距离特定“主位置”在指定范围内的所有城市。这在物流、本地服务推荐或地理信息系统中都非常有用。
最初,面对这样的需求,许多开发者可能会考虑直接从提供距离查询服务的网站(如luftlinie.org)抓取数据。这种方法通常涉及以下步骤:
然而,这种直接的网页抓取(Web Scraping)方法存在诸多问题:
以下是一个尝试直接抓取luftlinie.org的失败示例,它很可能因为CORS问题而无法正常工作:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
// 这种尝试通常会遇到CORS错误,因为浏览器阻止了跨域请求
$.get('https://www.luftlinie.org/Hameln,Niedersachsen,DEU/berlin,%20niedersachsen').then(function (html) {
// 成功响应(如果CORS允许),但解析目标可能不准确
var $mainbar = $(html).find('#rt'); // '#rt'并非距离数据所在元素
if ($mainbar.length) {
document.write($mainbar.html());
} else {
document.write('未能找到指定元素');
}
}, function () {
// 错误响应,通常是CORS或网络问题
document.write('访问被拒绝或发生错误');
});
</script>鉴于直接网页抓取的诸多局限性,更推荐的解决方案是利用专业的距离计算API。许多提供地理信息服务的平台都开放了API接口,例如distance.to网站本身就基于一个API(可在docs.distance.to/api查看其文档),并且通常通过像RapidAPI这样的API市场进行分发。
使用API的优势包括:
要使用距离计算API,通常需要以下步骤:
一个典型的距离计算API请求可能包含起点、终点和单位参数,并返回一个包含距离数值的JSON对象。
以下是一个使用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<number|null>} 距离(公里)或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调用方法,实现一个完整的城市距离筛选功能。
首先,定义您的“主位置”和待筛选的城市列表。
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公里由于API请求是异步的,我们需要使用async/await来处理。为了提高效率,可以并行发起所有城市的距离查询请求。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>城市驾车距离筛选</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
#loading { color: blue; }
#results { margin-top: 20px; border: 1px solid #ccc; padding: 10px; }
#results ul { list-style-type: none; padding: 0; }
#results li { margin-bottom: 5px; }
</style>
</head>
<body>
<h1>筛选距离在75公里内的城市</h1>
<p>主位置:<span id="main-pos-display"></span></p>
<div id="loading">正在计算距离,请稍候...</div>
<div id="results">
<h2>符合条件的城市:</h2>
<ul id="filtered-city-list">
<!-- 筛选结果将显示在这里 -->
</ul>
<h2>所有城市及距离:</h2>
<ul id="all-city-distances">
<!-- 所有城市的距离将显示在这里 -->
</ul>
</div>
<script>
// 假设的API端点和API密钥(请替换为您的实际信息)
const API_ENDPOINT = 'https://example-distance-api.com/v1/distance'; // 替换为实际的API端点
const RAPIDAPI_KEY = 'YOUR_RAPIDAPI_KEY'; // 替换为您的RapidAPI密钥
const RAPIDAPI_HOST = 'example-distance-api.com'; // 替换为实际的API主机
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公里
// 显示主位置
$('#main-pos-display').text(mainPosition);
/**
* 异步函数:通过API获取两个地点之间的驾车距离
* @param {string} origin - 起点城市名称或坐标
* @param {string} destination - 终点城市名称或坐标
* @returns {Promise<number|null>} 距离(公里)或null(如果发生错误)
*/
async function getDrivingDistance(origin, destination) {
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);
// 在API调用失败时,可以返回一个特殊值,或者抛出错误
return null;
}
}
/**
* 筛选并显示城市列表
*/
async function filterAndDisplayCities() {
$('#loading').show(); // 显示加载提示
const distancePromises = citiesToFilter.map(city =>
getDrivingDistance(mainPosition, city + ",Niedersachsen,DEU").then(distance => ({ city, distance }))
);
const results = await Promise.allSettled(distancePromises); // 等待所有请求完成
const filteredCities = [];
const allCityDistances = [];
results.forEach(result => {
if (result.status === 'fulfilled' && result.value.distance !== null) {
const { city, distance } = result.value;
allCityDistances.push(`<li>${city}: ${distance.toFixed(2)} km</li>`);
if (distance <= MAX_DISTANCE_KM) {
filteredCities.push(`<li>${city} (${distance.toFixed(2)} km)</li>`);
}
} else {
const city = result.reason ? result.reason.city : '未知城市'; // 尝试获取城市名
allCityDistances.push(`<li>${city}: 获取距离失败</li>`);
console.error(`处理城市 ${city} 失败:`, result.reason);
}
});
// 显示筛选结果
const $filteredList = $('#filtered-city-list');
if (filteredCities.length > 0) {
$filteredList.html(filteredCities.join(''));
} else {
$filteredList.html('<li>没有找到符合条件的城市。</li>');
}
// 显示所有城市的距离
$('#all-city-distances').html(allCityDistances.join(''));
$('#loading').hide(); // 隐藏加载提示
}
// 页面加载完成后执行筛选
$(document).ready(function() {
filterAndDisplayCities();
});
</script>
</body>
</html>在上述代码中:
以上就是基于API的城市驾车距离筛选教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号