Mapbox: Найти POI с определенным радиусом - PullRequest
0 голосов
/ 16 марта 2020

Мне нужна следующая задача:

input: координаты геолокации от GPS, радиус

ouput: список точек (только имена), которые пользователь может выбрать

просто нужно аналог для поиска в Google поблизости (так как их стоимость слишком высока для производства)

вопросов:

1) какой API предпочтительнее для этого? приветствуются примеры

2) нужны ли мне собственные данные для поиска или в данных для этого есть встроенная дата?

Ответы [ 2 ]

1 голос
/ 17 марта 2020

API 10000 * Mapbox Tilequery позволяет вам сделать именно это. Здесь - пошаговое руководство, объясняющее, как работать с этим API, а эта площадка API позволяет вам экспериментировать с API. Данные, запрашиваемые API, определяются набором плиток, передаваемым в качестве параметра в ваш запрос API. Как отмечено в связанной документации, учебном пособии и игровой площадке, вы можете использовать существующие наборы плиток Mapbox или создать свой собственный набор плиток с пользовательскими данными, в зависимости от вашего варианта использования.

Обратите внимание, что в зависимости от структуры лежащих в основе набора данных, которые вы используете, вам может потребоваться дополнительная работа для преобразования функции, возвращаемой API Tilequery, в имя POI. Например, рассмотрим тело ответа для запроса API ниже, в котором используется набор по умолчанию mapbox.mapbox-streets-v8 tileset:

https://api.mapbox.com/v4/mapbox.mapbox-streets-v8/tilequery/-93.1204,44.9472.json?radius=25&limit=5&dedupe&access_token=YOUR_MAPBOX_ACCESS_TOKEN

Одна конкретная функция, возвращаемая телом ответа:

{
  "type": "Feature",
  "id": 4,
  "geometry": {
  "type": "Point",
  "coordinates": [
    -93.12041537130386,
    44.947199821761615
  ]
  },
  "properties": {
    "extrude": "true",
    "height": 3,
    "min_height": 0,
    "type": "house",
    "underground": "false",
    "tilequery": {
      "distance": 1.2132887872688276,
      "geometry": "polygon",
      "layer": "building"
    }
  }
}

Хотя здесь нет имени POI, вы можете использовать возвращенные координаты вместе с конечной точкой API обратного геокодирования Mapbox 1017 *, чтобы получить имена и другие соответствующие свойства POI для POI, расположенного по указанной координате.

0 голосов
/ 01 апреля 2020

разговор с поддержкой Mapbox

Привет, Артемий,

Это Алекс из службы поддержки Mapbox, рад помочь!

Вам захочется использовать API Mapbox Tilequery. Опция, которую вы хотите использовать, это радиус. Обратите внимание, что в запросах будут использоваться плитки с максимальным увеличением набора плиток, и они будут включать только пересекающуюся плитку плюс восемь окружающих плиток при поиске ближайших объектов. Это означает, что если ваш набор плиток имеет максимальный экстент z20, максимальный радиус, который вы можете искать, составляет всего несколько метров. Вот площадка API, с которой вы можете протестировать API.

Надеюсь, это было полезно!


Привет, Алекс,

спасибо за быстрый ответ, еще один вопрос:

запрос:

https://api.mapbox.com/v4/mapbox.mapbox-streets-v8/tilequery/55.9414,54.7295.json?radius=25&limit=50&dedupe&geometry=point&access_token=YOUR_MAPBOX_ACCESS_TOKEN

ответ:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "id": 8,
      "geometry": {
        "type": "Point",
        "coordinates": [
          55.94845533370972,
          54.72732387401962
        ]
      },
      "properties": {
        "house_num": "32",
        "tilequery": {
          "distance": 8.949637333832088,
          "geometry": "point",
          "layer": "housenum_label"
        }
      }
    },
    {
      "type": "Feature",
      "id": 23629792230,
      "geometry": {
        "type": "Point",
        "coordinates": [
          55.948566645383835,
          54.72761119224691
        ]
      },
      "properties": {
        "class": "general",
        "filterrank": 4,
        "maki": "marker",
        "name": "Башинформсвязь",
        "name_script": "Cyrillic",
        "sizerank": 16,
        "type": "Telecommunication",
        "tilequery": {
          "distance": 23.898768437893523,
          "geometry": "point",
          "layer": "poi_label"
        }
      }
    }
  ]
}

вопрос: Я понимаю, что могу найти информацию о местах, которые я получил в ответе, используя API обратного геокодирования, но есть ли другой подход сделать это? В идеале я хотел бы получить имена poi из одного запроса tilquery, потому что в случае использования двух API (tilquery + геокодирование) мне придется запрашивать 4-5 запросов вместо только одного (только беспокойство, потому что это влияет на стоимость).


Привет, Артемий,

В API Tilequery есть параметр, называемый слоями, который можно использовать для нацеливания на определенный c слой вашего стиля.

https://api.mapbox.com/v4/mapbox.mapbox-streets-v8/tilequery/55.9414,54.7295.json?radius=25&limit=50&dedupe&geometry=point&layers=poi_label&access_token=

, который получает этот ответ:

{  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "id": 32316157590,
      "geometry": {
        "type": "Point",
        "coordinates": [
          55.94142526388168,
          54.7295828683082
        ]
      },
      "properties": {
        "category_en": "Supermarket",
        "category_zh-Hans": "超市",
        "class": "food_and_drink_stores",
        "filterrank": 1,
        "maki": "grocery",
        "name": "Магнит",
        "name_script": "Cyrillic",
        "sizerank": 16,
        "type": "Supermarket",
        "tilequery": {
          "distance": 9.367370433680872,
          "geometry": "point",
          "layer": "poi_label"
        }
      }
    }
  ]
}

Вы можете взять этот объект ответа и вернуть всю информацию из POI. Свойство name - это имя POI. Были ли другие свойства, которые вы искали из обратного геокодирования, которые не возвращались запросом плитки? Для вас было бы полезно поделиться полным примером рабочего процесса с использованием как мозаичного запроса, так и обратного геокодирования, а также узнать больше о вашем конкретном случае использования и о том, как эта операция мозаичного запроса / обратного геокодирования вписывается в рабочий процесс вашего более крупного приложения.


Привет, Алекс, запрос

(без метки poi, поскольку он не находит несколько баров, я знаю. Но если вы добавите эту метку, вы увидите только один результат): https://api.mapbox.com/v4/mapbox.mapbox-streets-v8/tilequery/55.9485,54.7275.json?radius=14&limit=50&dedupe&access_token=YOUR_MAPBOX_ACCESS_TOKEN запрос

ответ:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "id": 5,
      "geometry": {
        "type": "Point",
        "coordinates": [
          55.9485,
          54.7275
        ]
      },
      "properties": {
        "extrude": "true",
        "height": 15,
        "min_height": 0,
        "type": "building",
        "underground": "false",
        "tilequery": {
          "distance": 0,
          "geometry": "polygon",
          "layer": "building"
        }
      }
    },
    {
      "type": "Feature",
      "id": 1297495121,
      "geometry": {
        "type": "Point",
        "coordinates": [
          55.94833781213748,
          54.727526546045794
        ]
      },
      "properties": {
        "class": "path",
        "iso_3166_1": "RU",
        "iso_3166_2": "RU-BA",
        "len": 4450,
        "oneway": "false",
        "structure": "none",
        "surface": "paved",
        "type": "footway",
        "tilequery": {
          "distance": 10.859473551200084,
          "geometry": "linestring",
          "layer": "road"
        }
      }
    },
    {
      "type": "Feature",
      "id": 23629792230,
      "geometry": {
        "type": "Point",
        "coordinates": [
          55.948566645383835,
          54.72761119224691
        ]
      },
      "properties": {
        "class": "general",
        "filterrank": 4,
        "maki": "marker",
        "name": "Башинформсвязь",
        "name_script": "Cyrillic",
        "sizerank": 16,
        "type": "Telecommunication",
        "tilequery": {
          "distance": 13.10152056398561,
          "geometry": "point",
          "layer": "poi_label"
        }
      }
    },
    {
      "type": "Feature",
      "id": 7,
      "geometry": {
        "type": "Point",
        "coordinates": [
          55.94869895433047,
          54.7274698331467
        ]
      },
      "properties": {
        "extrude": "true",
        "height": 3,
        "min_height": 0,
        "type": "building",
        "underground": "false",
        "tilequery": {
          "distance": 13.251093067012334,
          "geometry": "polygon",
          "layer": "building"
        }
      }
    }
  ]
}

Если мы декодируем первую пару координат (55.9485, 54.7275), используя обратное геокодирование (https://docs.mapbox.com/search-playground), мы получаем Smoky People , ул. Ленина, 32, Уфа, Республика Башкирия 450077, Россия и, если мы расшифруем все пары, мы сможем найти больше кафе и баров (poi's).


Эй, Артемии,

Причиной различных результатов являются источники запросов.

API Tilequery ищет вещи, которые есть в нашем наборе плиток Mapbox Streets v8 (который использует наш стиль Mapbox Streets v11). Данные в этом наборе плиток в основном поступают из OpenStreetMap. Если на карте отсутствуют или устарели места, это прекрасная возможность помочь нам улучшить нашу карту! Если вы хотите что-то добавить или отредактировать, зайдите на openstreetmap.org, создайте учетную запись и внесите улучшения напрямую. Для начала вам будет предложено go в интерактивном учебном пособии. Здесь также есть более подробная информация для расширенного редактирования: https://labs.mapbox.com/mapping. Набор плиток Mapbox Streets регулярно обновляется по мере того, как объекты редактируются или добавляются на карту, что означает, что если вы отредактируете OpenStreetMap, вы в конечном итоге увидите, что ваши изменения будут отражены на карте Mapbox.

API геокодирования содержит источники данных от правительств, проектов открытых данных и частных компаний. В некоторых случаях результаты API геокодирования могут отличаться от данных Mapbox Streets или OpenStreetMap. Посмотрите эту документацию о том, как геокодирование работает в Mapbox.

Я думаю, что лучший способ уменьшить количество вызовов API, которые вы делаете, - это выбрать один API, либо обратное геокодирование, либо Tilequery, и придерживаться его. С OpenStreetMaps, как бы скучно это ни звучало, у вас есть возможность добавлять любые POI, которые, как вы знаете, отсутствуют, или делать перекрестные ссылки на другие источники, чтобы добавлять POI на карту, что сделает место видимым на карте, а также появится в вашем tilequery. Благодаря API геокодирования, из-за природы некоторых источников и лицензий, не все места, которые вы можете искать, видны на карте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...