Статьи

Геолокация с MBaaS на Android


Наличие интеллектуальных устройств, которые постоянно осведомлены о географическом расположении, дает много преимуществ, а также новых проблем для разработчиков мобильных приложений. Разработчики не только находят, что данные часто должны эффективно храниться вместе со связанными данными о местоположении, но также необходимо выполнять быстрые и точные «гео-ориентированные» запросы для получения нужных объектов (например, при обновлении вида карты). В этой статье я представлю функцию геолокации, которую мы разработали здесь, на
Kii, чтобы упростить вам жизнь, когда вы работаете со связанными данными о местоположении. Благодаря геолокации геоданные становятся первоклассным гражданином нашей платформы с возможностью поддержки расширенных гео-запросов.

На самом деле, связать местоположения с вашими данными и выполнить гео-запросы легко. Вам просто нужно ознакомиться с двумя основными элементами: GeoPoint и GeoQuery . GeoPoint в основном пара широты и долготы величин , которые вы можете свободно ассоциировать с объектом Кии в качестве атрибута. А GeoQuery — это то, что позволяет запрашивать объекты на основе этих атрибутов GeoPoint (например, создавать запросы типа «какие объекты находятся в данной прямоугольной области?» ( Предложение GeoBox ) или «какие объекты находятся в радиусе 10 км от заданного»). точка? «( пункт GeoDistance ).

Давайте создадим пример сценария, чтобы проиллюстрировать, что вы можете делать с Kii Geolocation (вскоре мы предоставим пример приложения). Представьте, что ваше приложение позволяет пользователям сканировать купоны, которые они могут использовать позже в определенных магазинах. Приложение может хранить место, где был отсканирован купон, и местоположение магазина, в котором он был погашен (как GeoPoint ). Затем эта информация используется приложением для отображения карты с местоположениями, где пользователь сканировал и / или погашал купоны.

Экраны приложения выглядят примерно так:

 

Как мы можем сохранить объект Coupon с данными о местоположении? Вы можете связать данные о местоположении, просто заполнив атрибуты GeoPoint . Для этого примера мы связываем два GeoPoint атрибуты купона: « viewedAt » и « redeemedAt »:

KiiObject coupon = KiiUser.getCurrentUser().bucket("Coupons").object();
GeoPoint viewedAt = new GeoPoint(35.667983, 139.739356);
GeoPoint redeemedAt = new GeoPoint(34.342123, 139.335355);

// associate geo point with KiiObject
coupon.set("viewedAt", viewedAt);
coupon.set("redeemedAt", redeemedAt);
try {
  coupon.save();
} catch (IOException ioe) {
  // check fail reason
} catch (AppException ae) {
  // check fail reason.
}

Когда пришло время извлечь атрибуты GeoPoint из уже заполненного объекта, вы просто должны сделать что-то вроде этого:

// The fields "viewedAt" and "redeemedAt" have GeoPoint values
GeoPoint viewedAt = coupon.getGeoPoint("viewedAt");
GeoPoint redeemedAt = coupon.getGeoPoint("redeemedAt");
double viewedLat = viewedAt.getLatitude();
double viewedLon = viewedAt.getLongitude();

А теперь самое лучшее: отправка географических запросов, выполняемых над объектами в Kii Cloud . Давайте придерживаться предложенного сценария и покажем фрагмент кода, который отвечает на следующий запрос: «найти все купоны, которые были просмотрены в ограничительной рамке и погашены не более чем на 1 км определенного магазина» (предположим, что ограничивающая рамка является текущей видимая область экрана карты):

// Prepare the target bucket to be queried.
KiiBucket bucket = KiiUser.getCurrentUser().bucket("Coupons");
GeoPoint storeLocation = new GeoPoint(35.52105, 139.699402);

try {
  // Define GeoBox with NorthEast and SouthWest points.
  VisibleRegion vr = mMap.getProjection().getVisibleRegion();
  GeoPoint sw = new GeoPoint(
      vr.latLngBounds.southwest.latitude, 
      vr.latLngBounds.southwest.longitude);
  GeoPoint ne = new GeoPoint(
      vr.latLngBounds.northeast.latitude, 
      vr.latLngBounds.northeast.longitude);
  KiiClause clause1 = KiiClause.geoBox("viewedAt", ne, sw);
  KiiClause clause2 = KiiClause.geoDistance("redeemedAt", storeLocation, 1000);
  KiiQuery query = new KiiQuery(KiiClause.and(clause1, clause2));;

  // Execute GeoBox query.
  KiiQueryResult result = bucket.query(query);

  // Parsing the result will follow...

} catch (IOException ioe) {
  // check fail reason
} catch (AppException e) {
  // check fail reason.
}

Как видите, Kii GeoQuery достаточно умны, чтобы понимать ограничивающие рамки и расстояния до GeoPoint (с возможностью использовать несколько GeoPoint как часть запросов). И что действительно является плюсом, так это то, что вы можете прикрепить к вашим объектам столько географических атрибутов, сколько вы хотите, и иметь сложные гео-запросы, которые основаны на них (вы не ограничены одним связанным GeoPoint на объект !!).

Вы можете получить более подробную информацию о нашей функции геолокации в нашей документации .

Оставайтесь с нами для реализации Geolocation на iOS (в ближайшие несколько недель …)