Поиск по местоположению: конкретный адрес или местный бизнес

Я создаю приложение для определения местоположения для iOS. В настоящее время у меня есть панель поиска, которую можно использовать для поиска местных предприятий (например, пиццы, заправочной станции, банка). Текст панели поиска добавляется в качестве параметра к URL-адресу и передается в Yahoo Local API. Я хотел бы использовать ту же панель поиска для поиска конкретных адресов, но это не функция API. Я думаю, что я должен либо:

А) Создайте какую-нибудь функцию, которая сможет различать общий поиск по бизнесу и поиск по определенному местоположению. Отправляйте бизнес-запросы в API и отправляйте поиск адресов в CLGeocoder.

Б) Найдите более универсальный API.

C) Сделать что-то еще, что я еще не рассматривал.

Я мог бы добавить отдельное поле поиска и использовать его для адресного поиска, но мне интересно, можно ли это сделать из той же панели поиска. Если кто-то может дать какой-либо совет или указать мне в правильном направлении, я был бы признателен. Спасибо.


person Gabriel Ortega    schedule 10.04.2012    source источник


Ответы (2)


Вам, вероятно, будет трудно выполнить A, поскольку адреса и POI представляют собой строки довольно произвольной формы, особенно когда они сгенерированы человеком. Я бы скорее рекомендовал добавить какой-то переключатель, который пользователь может переключать для поиска предприятий или адресов.

Для B вы можете взглянуть на API карт Google, если он отвечает вашим потребностям. Это кажется довольно универсальным в отношении входных параметров.

person Matej Bukovinski    schedule 10.04.2012
comment
Maps API — хорошая идея, за исключением того, что вы должны отображать карту Google для пользователя в соответствии с TOS. Просто кое-что, о чем нужно знать, так как я не уверен, делает ли это Габриэль или нет. - person Matt; 10.04.2012
comment
Спасибо за ответ. Я пошел дальше и реализовал класс, использующий API геокодирования Google Maps. Это работает очень хорошо до сих пор. Я просто пытаюсь понять, как сортировать результаты, чтобы отображать только самые близкие к местоположению пользователя. Например, 22 Churchill Drive дает мне результаты от Арканзаса до Массачусетса. Я понимаю, что чем больше информации вы предоставляете, тем точнее геокодирование, но я не вижу необходимости возвращать результаты, которые находятся на расстоянии более 1000 миль. - person Gabriel Ortega; 13.04.2012
comment
Кстати, Матей. Спасибо за идею переключения. Это определенно вариант, если я слишком зацикливаюсь на всей этой единой панели поиска местоположения. - person Gabriel Ortega; 13.04.2012

+1 за интересный вопрос. Это определенно вопрос дизайна программирования, но также и вопрос UX.

Я думаю, что вы можете сделать все это в одной области. Я работаю в компании SmartyStreets, где мы анализируем и обрабатываем адреса. Вот несколько вещей, которые я узнал из опыта, связанных с вашим вопросом:

  • Не используйте регулярные выражения для разбора или определения адресов. Это слишком сложно. Как сказал Матей, адреса бывают разных форм. «Строки произвольной формы» могут быть любыми. Возникает соблазн использовать регулярное выражение, но есть более умный способ.
  • Очень немногие API-интерфейсы местоположения/адреса действительно обеспечивают ценность и результаты, которые вы ищете, по крайней мере, в соответствии с их TOS. Например, Google, Yahoo! и другие требуют отображения карты и не разрешают автоматические запросы (например, ни один пользователь не инициирует запрос).
  • Большинство API выполняют только аппроксимацию адреса, а не проверку адреса. Таким образом, результаты, которые вы получаете, в лучшем случае являются догадками. Google умеет угадывать, но результаты могут выглядеть правдоподобными, хотя на самом деле таковыми не являются. Я видел это много, и это укусило меня. API-интерфейсы геолокации/геокодирования имеют свое место, но они также имеют свои ограничения.

Итак, пример: пользователь вводит либо POI, либо адрес в это текстовое поле. Вы не уверены, какой из них или оба. И если вы знали, существует ли точка интереса или адрес? Я не знаю (недорогого) API, который бы выполнял обе функции одновременно — я видел примеры корпоративного уровня, но… наверное, слишком много денег за слишком много денег. Вот более простой подход, который я бы попробовал.

  1. Найдите сертифицированный CASS сервис для проверки адреса. API LiveAddress SmartyStreets (другая демонстрация на главной странице) является одним из таких сервисов (недорогим, даже бесплатным для небольших объемов использования). Хотя API не анализирует однострочные адреса напрямую, очень легко использовать этот алгоритмрабочий пример здесь) — в Objective C это еще проще, потому что вам не нужно возиться с JSONP, как в Javascript.

  2. Если LiveAddress или аналогичный сервис (я призываю вас провести некоторое исследование и сообщить мне, если у вас возникнут дополнительные вопросы — я буду рад помочь) возвращает какие-либо результаты, строка была адресом. Имейте в виду, что некоторые службы, сертифицированные CASS, также будут возвращать поддельные адреса или догадки, и их трудно/невозможно отличить друг от друга. LiveAddress будет возвращать только действительные адреса. Таким образом, если LiveAddress возвращает результат (обычно первый, используя описанный выше алгоритм), строка определенно представляет собой адрес или POI, за которым следует адрес. (И да, LiveAddress геокодирует каждый адрес.)

  3. Если результаты не были возвращены, то это была точка интереса/название компании. Если ваше приложение соответствует TOS Google или Yahoo, запросите их API, потому что они умеют угадывать и находить более общие совпадения в подобных вещах.

Еще один вариант — сначала запросить Maps API, а затем с адресом (если он есть), который он возвращает, отправить его через LiveAddress, чтобы убедиться, что он существует, и узнать о нем больше.

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

person Matt    schedule 10.04.2012
comment
Спасибо за ответ. Отличная информация здесь. Я думаю, что я собираюсь следовать курсу, который заключается в том, чтобы сначала использовать API геокодирования (Google Maps). Если это не даст никаких результатов, я могу отправить тот же запрос в локальный бизнес-API (Yahoo Local или Google Places). Так, например, если пользователь вводит пиццу, это должно провалиться при поиске геокодирования, а затем будет передано в бизнес-API и даст результаты. - person Gabriel Ortega; 13.04.2012
comment
Ok. Это, вероятно, будет эффективно. Если вы думаете, опубликуйте здесь свои результаты, когда вы это реализовали и попробовали; Мне любопытно посмотреть, насколько хорошо это работает. Просто имейте в виду, однако, что если пользователь вводит адрес, вы не будете уверены, действительно ли этот адрес существует, таким образом отбрасывая координаты. - person Matt; 14.04.2012
comment
Вот в чем загвоздка. Я действительно полагаюсь на лучшее предположение API. Я только что закончил тест, и пока это работает. У меня есть класс для адресного поиска и поиска местного бизнеса. Если адресный поиск терпит неудачу, он передает строку запроса в локальный бизнес-поиск. Теперь я уверен, что это не полное доказательство. Если вы ищете аэропорт JFK, вы получите аэропорт и все, что с ним связано (парковка JFK, шаттл JFK, котлеты из говядины JFK). Я буду продолжать возиться с этим, но у меня есть ощущение, что я могу пойти на переключатель, который предложил Матей. - person Gabriel Ortega; 14.04.2012