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