Перейти к содержимому
Tutorial

Бесплатный API геокодирования: вперед, назад и расстояние за один вызов REST

| 6 min read

Преобразуйте адреса в координаты, координаты в адреса и рассчитывайте расстояния между точками с тремя конечными точками REST. Уровень бесплатного пользования, Карты Google не требуются.

Satellite view of city with map pins overlay
Photo by NASA on Unsplash

Вашему приложению доставки необходимо преобразовать адрес в широту и долготу для маршрутизации. API геокодирования Google Maps стоит 5 долларов США за 1000 запросов. Для стартапа, делающего 10 000 доставок в день это 50 долларов в день только за геокодирование.

API botoi geo охватывает прямое геокодирование, обратное геокодирование и расчет расстояния с помощью три конечных точки REST. Анонимный доступ обрабатывает 100 запросов в день бесплатно. Платные планы начните с 9 долларов США в месяц и охватывайте все более 150 конечных точек на платформе, а не только геокодирование.

Прямое геокодирование: адрес к координатам

The /v1/geo/geocode конечная точка принимает адрес и возвращает широту, долгота и стандартизированный адрес. Один POST-запрос:

curl -X POST https://api.botoi.com/v1/geo/geocode \\
  -H "Content-Type: application/json" \\
  -d '{"address": "1600 Amphitheatre Parkway, Mountain View, CA"}'

Ответ:

{
  "success": true,
  "data": {
    "latitude": 37.4224764,
    "longitude": -122.0842499,
    "formatted_address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
    "place_name": "Googleplex",
    "country": "United States",
    "country_code": "US"
  }
}

Ответ включает код страны, название места (если оно доступно) и formatted_address строку, которую вы можете сохранить как каноническую версию. Частичный адреса тоже работают; API преобразует «Маунтин-Вью, Калифорния» в координаты центра города.

Обратное геокодирование: координаты по адресу

Мобильное приложение фиксирует падение булавки GPS. Для получения вам понадобится удобочитаемый адрес. /v1/geo/reverse конечная точка принимает широту и долготу и разрывает результат на структурированные компоненты:

curl -X POST https://api.botoi.com/v1/geo/reverse \\
  -H "Content-Type: application/json" \\
  -d '{"latitude": 37.4224, "longitude": -122.0842}'

Ответ:

{
  "success": true,
  "data": {
    "formatted_address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
    "street": "Amphitheatre Pkwy",
    "house_number": "1600",
    "city": "Mountain View",
    "state": "California",
    "postal_code": "94043",
    "country": "United States",
    "country_code": "US"
  }
}

Каждое поле разделено: улица, номер дома, город, штат, почтовый индекс и страна. Вам не нужно анализировать ни одну строку, чтобы извлечь город или почтовый индекс.

Расчет расстояния между двумя точками

The /v1/geo/distance конечная точка вычисляет расстояние по большому кругу между две пары координат. Он возвращает как километры, так и мили:

curl -X POST https://api.botoi.com/v1/geo/distance \\
  -H "Content-Type: application/json" \\
  -d '{"from": {"lat": 37.7749, "lng": -122.4194}, "to": {"lat": 34.0522, "lng": -118.2437}}'

Ответ:

{
  "success": true,
  "data": {
    "distance_km": 559.12,
    "distance_miles": 347.42,
    "from": { "lat": 37.7749, "lng": -122.4194 },
    "to": { "lat": 34.0522, "lng": -118.2437 }
  }
}

Сан-Франциско — Лос-Анджелес: 559 км. В расчете используется формула Хаверсинуса, которая дает вам расстояние по прямой линии по поверхности Земли. Для бесконтактных фильтров, доставка проверки радиуса и функции локатора магазинов — это правильный показатель.

Практический пример: проверка адреса при оформлении заказа

Клиент вводит «123 Fake Stret, Nowhereville» в форму оформления заказа. Проверка синтаксиса проходит, потому что это похоже на адрес. Геокодирование решает проблему. Если API не может разрешить адрес в координатах, адрес, скорее всего, недействителен.

async function validateAddress(address) {
  const res = await fetch("https://api.botoi.com/v1/geo/geocode", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-Api-Key": process.env.BOTOI_API_KEY,
    },
    body: JSON.stringify({ address }),
  });

  const { success, data } = await res.json();

  if (!success || !data.latitude) {
    return { valid: false, suggestion: null };
  }

  return {
    valid: true,
    formatted: data.formatted_address,
    coordinates: {
      lat: data.latitude,
      lng: data.longitude,
    },
  };
}

// Usage in a checkout form handler
const result = await validateAddress("1600 Amphitheatre Parkway, Mountain View");

if (!result.valid) {
  // Show error: "We couldn't verify this address. Check for typos."
}

// Use result.formatted as the canonical address
// Use result.coordinates for delivery routing

Этот подход выявляет опечатки, несуществующие названия улиц и неполные адреса, прежде чем вы отправить посылку в никуда. formatted_address поле дает вам стандартизированная версия для хранения в вашей базе данных.

Практический пример: расположение магазинов

Учитывая координаты пользователя (из геолокации браузера или геокодированного адреса), найдите три ближайшие магазины:

async function findNearestStore(userLat, userLng, stores) {
  // Calculate distance from user to each store in parallel
  const distances = await Promise.all(
    stores.map(async (store) => {
      const res = await fetch("https://api.botoi.com/v1/geo/distance", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "X-Api-Key": process.env.BOTOI_API_KEY,
        },
        body: JSON.stringify({
          from: { lat: userLat, lng: userLng },
          to: { lat: store.lat, lng: store.lng },
        }),
      });

      const { data } = await res.json();
      return { ...store, distance_km: data.distance_km };
    })
  );

  // Sort by distance and return the closest 3
  return distances
    .sort((a, b) => a.distance_km - b.distance_km)
    .slice(0, 3);
}

const stores = [
  { name: "Downtown", lat: 37.7849, lng: -122.4094 },
  { name: "Mission Bay", lat: 37.7699, lng: -122.3894 },
  { name: "Sunset", lat: 37.7549, lng: -122.4894 },
];

const nearest = await findNearestStore(37.7749, -122.4194, stores);
// Returns stores sorted by distance from the user

Для небольшого количества магазинов (до 50) хорошо работают параллельные вызовы API. Для сотен местоположения, выполните расчет Haversine на стороне клиента и используйте API только для геокодирования. шаг.

Практический пример: проверка радиуса доставки

Приложение для доставки еды должно отклонять заказы в радиусе 25 км от кухни. Проверить расстояние до принятия заказа:

async function isWithinDeliveryRadius(
  warehouseLat, warehouseLng,
  customerLat, customerLng,
  maxRadiusKm
) {
  const res = await fetch("https://api.botoi.com/v1/geo/distance", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-Api-Key": process.env.BOTOI_API_KEY,
    },
    body: JSON.stringify({
      from: { lat: warehouseLat, lng: warehouseLng },
      to: { lat: customerLat, lng: customerLng },
    }),
  });

  const { data } = await res.json();

  return {
    eligible: data.distance_km <= maxRadiusKm,
    distance_km: data.distance_km,
  };
}

// Check if a customer is within 25 km of the warehouse
const check = await isWithinDeliveryRadius(
  37.7749, -122.4194,  // warehouse
  37.3382, -121.8863,  // customer in San Jose
  25                    // 25 km radius
);

if (!check.eligible) {
  console.log(
    \`Customer is \\\${check.distance_km.toFixed(1)} km away. Outside delivery zone.\`
  );
}

Проверка принимает один вызов API и возвращает результат менее чем за 100 мс. Объедините это с прямым геокодированием перейти от введенного адреса к решению о приемлемости доставки в двух последовательных запросах.

Ключевые моменты

  • /v1/geo/geocode преобразует уличные адреса в широту/долготу с помощью стандартизированный форматированный адрес. Работает с частичными адресами и географическими названиями.
  • /v1/geo/reverse преобразует координаты в структурированный адрес с отдельными поля для улицы, города, штата, почтового индекса и страны.
  • /v1/geo/distance вычисляет расстояние по большому кругу между двумя точками, используя формула Гаверсина. Возвращает как км, так и мили.
  • Анонимный доступ допускает 5 запросов в минуту и ​​100 в день. Ключ API не требуется для тестирование или использование в небольших объемах.
  • Все три конечные точки принимают и возвращают JSON. Никакого кодирования строки запроса, никакого синтаксического анализа XML, никакого Установка SDK. Любой язык с HTTP-клиентом работает.

FAQ

Является ли API геокодирования бесплатным?
Анонимный доступ доступен со скоростью 5 запросов в минуту и ​​100 запросов в день с ограничением скорости по IP. Никакой ключ API или учетная запись не требуется. Для более высокой пропускной способности платные планы начинаются с 9 долларов США в месяц с одним ключом API, охватывающим все более 150 конечных точек.
В чем разница между прямым и обратным геокодированием?
Прямое геокодирование преобразует адрес улицы или название места в координаты широты и долготы. Обратное геокодирование делает обратное: оно берет координаты широты и долготы и возвращает ближайший адрес. API botoi поддерживает как через /v1/geo/geocode, так и /v1/geo/reverse.
Конечная точка расстояния возвращает расстояние проезда или расстояние по прямой?
Конечная точка /v1/geo/distance возвращает расстояние по большому кругу (прямой линии) между двумя точками с использованием формулы Хаверсинуса. Он не учитывает дороги и маршруты движения. Для проверки радиуса доставки и фильтров приближения обычно достаточно расстояния по прямой.
Какую систему координат использует API?
API использует WGS 84 (EPSG:4326), ту же систему координат, которая используется устройствами GPS, Google Maps и OpenStreetMap. Широта варьируется от -90 до 90, долгота от -180 до 180.
Могу ли я использовать API геокодирования для пакетной обработки?
API обрабатывает один адрес или пару координат за запрос. Для пакетного геокодирования отправьте несколько запросов параллельно. На бесплатном уровне вы можете отправлять 5 сообщений в минуту. Платные планы поддерживают более высокий уровень параллелизма при обработке тысяч адресов.

Начните разработку с botoi

150+ API-эндпоинтов для поиска, обработки текста, генерации изображений и утилит для разработчиков. Бесплатный тариф, без банковской карты.