Список интересных мест в выбранном населенном пункте

Этот пример использует запросы geoname, radius и xid.

Укажите название населенного пункта и смотрите список достопримечательнстей в радиусе 1км от центра. По клику на элементе списка можно увидеть фото и описание объекта.

Смотреть пример в отдельном окне

Краткое описание кода

Эта функция вызывает методы API при помощи fetch (вместо нее можно использовать XMLHttpRequest или $.ajax):


    //You should get your API key at https://dev.opentripmap.org
    const apiKey = "";

    function apiGet(method, query) {
      return new Promise(function(resolve, reject) {
        var otmAPI =
          "https://api.opentripmap.com/0.1/en/places/" +
          method +
          "?apikey=" +
          apiKey;
        if (query !== undefined) {
          otmAPI += "&" + query;
        }
        fetch(otmAPI)
          .then(response => response.json())
          .then(data => resolve(data))
          .catch(function(err) {
            console.log("Fetch Error :-S", err);
          });
      });
    }
    

Инициализируем глобальные переменные для поддержки постраничного просмотра:


    const pageLength = 5; // number of objects per page

    let lon; // place longitude
    let lat; // place latitude

    let offset = 0; // offset from first object in the list
    let count; // total objects count
    

Этот блок использует название из текстового поля и получает местоположение населенного пункта из API. Если населенный пункт найден, вызываем функцию загрузки списка:


    document
      .getElementById("search_form")
      .addEventListener("submit", function(event) {
        let name = document.getElementById("textbox").value;
        apiGet("geoname", "name=" + name).then(function(data) {
          let message = "Name not found";
          if (data.status == "OK") {
            message = data.name + ", " + getCountryName(data.country);
            lon = data.lon;
            lat = data.lat;
            firstLoad();
          }
          document.getElementById("info").innerHTML = `

${message}

`; }); event.preventDefault(); });

Эта функция получает общее количество объектов в радиусе 1000 метров от указанного местоположения (lon, lat), а затем загружает первую страницу списка объектов:


    function firstLoad() {
      apiGet(
        "radius",
        `radius=1000&limit=${pageLength}&offset=${offset}&lon=${lon}&lat=${lat}&rate=2&format=count`
      ).then(function(data) {
        count = data.count;
        offset = 0;
        document.getElementById(
          "info"
        ).innerHTML += `<p>${count} objects with description in a 1km radius</p>`;
        loadList();
      });
    }
    

Эта функция загружает страницу списка объектов в левую часть окна. Объекты ищутся в радиусе 1000 метров:


    function loadList() {
      apiGet(
        "radius",
        `radius=1000&limit=${pageLength}&offset=${offset}&lon=${lon}&lat=${lat}&rate=2&format=json`
      ).then(function(data) {
        let list = document.getElementById("list");
        list.innerHTML = "";
        data.forEach(item => list.appendChild(createListItem(item)));
        let nextBtn = document.getElementById("next_button");
        if (count < offset + pageLength) {
          nextBtn.style.visibility = "hidden";
        } else {
          nextBtn.style.visibility = "visible";
          nextBtn.innerText = `Next (${offset + pageLength} of ${count})`;
        }
      });
    }
    

Эта функция создает элемент списка объектов в левой части окна:


    function createListItem(item) {
      let a = document.createElement("a");
      a.className = "list-group-item list-group-item-action";
      a.setAttribute("data-id", item.xid);
      a.innerHTML = `<h5 class="list-group-item-heading">${item.name}</h5>
                <p class="list-group-item-text">${getCategoryName(item.kinds)}</p>`;

      a.addEventListener("click", function() {
        document.querySelectorAll("#list a").forEach(function(item) {
          item.classList.remove("active");
        });
        this.classList.add("active");
        let xid = this.getAttribute("data-id");
        apiGet("xid/" + xid).then(data => onShowPOI(data));
      });
      return a;
    }

Эта функция создает карточку объекта в правой части окна, заполняя ее картинкой и описанием:


    function onShowPOI(data) {
      let poi = document.getElementById("poi");
      poi.innerHTML = "";
      if (data.preview) {
        poi.innerHTML += `<img src="${data.preview.source}">`;
      }
      poi.innerHTML += data.wikipedia_extracts
        ? data.wikipedia_extracts.html
        : data.info
        ? data.info.descr
        : "No description";

      poi.innerHTML += `<p><a target="_blank" href="${data.otm}">Show more at OpenTripMap</a></p>`;
    }

Этот блок кода обрабатывает кнопку запроса следующей страницы списка:


    document
      .getElementById("next_button")
      .addEventListener("click", function() {
        offset += pageLength;
        loadList();
      });