You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript/React提取YouTube视频描述地址并地理编码获经纬度

从YouTube视频描述提取地址并实现地理编码

一、提取地址

你的视频描述里的地址都是以ADDRESS:开头的单行内容,用正则表达式就能快速匹配提取。下面是JavaScript实现代码:

const videoDescription = `这里替换成你的完整视频描述文本`;

// 匹配所有以ADDRESS:开头的地址行
const addressRegex = /ADDRESS:\s*(.*)/g;
const extractedAddresses = [];
let matchResult;

while ((matchResult = addressRegex.exec(videoDescription)) !== null) {
  extractedAddresses.push(matchResult[1].trim());
}

console.log('提取到的地址:', extractedAddresses);
// 输出示例: ["49/3 Trần Hưng Đạo, Sơn Phong, Hội An, Quảng Nam 56000", "Lê Thánh Tông street, An Phú ward, Tam Kỳ city, Quảng Nam Province"]

这段代码会遍历整个描述文本,把所有符合格式的地址提取出来存到数组里,方便后续处理。

二、地理编码获取经纬度

可以用公开的地理编码API把地址转换成经纬度,下面给出两种常用实现:

1. 纯JavaScript批量处理(用OpenStreetMap Nominatim免费API)

async function getLatLon(address) {
  try {
    const encodedAddr = encodeURIComponent(address);
    const response = await fetch(`https://nominatim.openstreetmap.org/search?q=${encodedAddr}&format=json&limit=1`);
    const data = await response.json();
    
    if (data.length > 0) {
      return {
        latitude: parseFloat(data[0].lat),
        longitude: parseFloat(data[0].lon)
      };
    } else {
      throw new Error('没找到对应地址的坐标');
    }
  } catch (error) {
    console.error(`处理地址 ${address} 失败:`, error);
    return null;
  }
}

// 批量处理提取到的地址
async function processAllAddresses(addressList) {
  const resultList = [];
  for (const addr of addressList) {
    const coords = await getLatLon(addr);
    resultList.push({ address: addr, coordinates: coords });
    // 加个延迟,避免触发API频率限制
    await new Promise(resolve => setTimeout(resolve, 1000));
  }
  return resultList;
}

// 调用示例
processAllAddresses(extractedAddresses).then(finalResult => {
  console.log('地址与坐标对应结果:', finalResult);
});

2. React组件中集成(结合状态管理)

import { useState, useEffect } from 'react';

function AddressGeocoder({ videoDesc }) {
  const [addresses, setAddresses] = useState([]);
  const [geoResults, setGeoResults] = useState([]);

  // 提取地址
  useEffect(() => {
    const regex = /ADDRESS:\s*(.*)/g;
    const addrList = [];
    let match;
    while ((match = regex.exec(videoDesc)) !== null) {
      addrList.push(match[1].trim());
    }
    setAddresses(addrList);
  }, [videoDesc]);

  // 批量获取坐标
  useEffect(() => {
    const fetchCoordinates = async () => {
      const results = [];
      for (const addr of addresses) {
        try {
          const encodedAddr = encodeURIComponent(addr);
          const res = await fetch(`https://nominatim.openstreetmap.org/search?q=${encodedAddr}&format=json&limit=1`);
          const data = await res.json();
          if (data.length) {
            results.push({
              address: addr,
              lat: parseFloat(data[0].lat),
              lon: parseFloat(data[0].lon)
            });
          } else {
            results.push({ address: addr, error: '无匹配坐标' });
          }
        } catch (err) {
          results.push({ address: addr, error: err.message });
        }
        await new Promise(resolve => setTimeout(resolve, 1000));
      }
      setGeoResults(results);
    };

    if (addresses.length > 0) {
      fetchCoordinates();
    }
  }, [addresses]);

  return (
    <div className="geocoder-container">
      <h3>提取到的地址</h3>
      <ul>
        {addresses.map((addr, idx) => (
          <li key={idx}>{addr}</li>
        ))}
      </ul>
      <h3>对应经纬度</h3>
      <ul>
        {geoResults.map((item, idx) => (
          <li key={idx}>
            {item.address}: 
            {item.error ? ` 错误: ${item.error}` : ` 纬度: ${item.lat.toFixed(6)}, 经度: ${item.lon.toFixed(6)}`}
          </li>
        ))}
      </ul>
    </div>
  );
}

// 使用组件示例
// <AddressGeocoder videoDesc={你的视频描述文本} />

注意:Nominatim API有请求频率限制,批量处理时一定要加延迟,避免被临时封禁。如果需要更高的请求限额,也可以考虑使用Google Maps Geocoding API(需要自己申请密钥)。

内容的提问来源于stack exchange,提问作者Dimas Rizqi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:09:24