iOS
...
Data Objects
Геозапросы в ParseSwift SDK для мобильных разработчиков
9 мин
геозапросы введение мы используем термин геозапросы для обозначения типа запросов, условия которых включают parsegeopoint parsegeopoint тип полей рекомендуется использовать parsegeopoint parsegeopoint структуру для хранения данных о географическом местоположении в базе данных back4app parseswift sdk parseswift sdk предоставляет набор методов, которые позволяют нам запрашивать данные в соответствии с условиями, применяемыми к parsegeopoint parsegeopoint типу данных предварительные требования для завершения этого учебника вам потребуется приложение созданное на back4app базовое ios приложение для тестирования запросов цель понять, как запрашивать данные, используя условия на основе географических данных 1 быстрый обзор класса query\<u> любой запрос, выполненный в базе данных back4app, осуществляется через обобщенный класс query\<u> query\<u> обобщенный параметр u u (соответствующий протоколу parseobject parseobject ) является типом данных объектов, которые мы пытаемся извлечь из базы данных дано тип данных, такой как myobject myobject , мы извлекаем эти объекты из базы данных back4app следующим образом 1 import parseswift 2 3 struct myobject parseobject { 4 5 } 6 7 let query = myobject query() 8 9 // executes the query asynchronously 10 query find { result in 11 // handle the result (of type result<\[myobject], parseerror>) 12 } вы можете узнать больше о классе query\<u> query\<u> здесь в официальной документации https //github com/parse community/parse swift 2 сохраните некоторые данные на back4app прежде чем мы начнем выполнять запросы, мы должны сохранить некоторые образцы данных в базе данных back4app следуя руководству по быстрому старту https //www back4app com/docs/ios/parse swift sdk/install sdk , вы можете настроить и связать свое образцовое ios приложение с вашей базой данных back4app в этом руководстве мы будем хранить информацию о городах мы используем следующую структуру для организации информации о городе 1 import parseswift 2 3 struct city parseobject { 4 5 6 var name string? // city's name 7 var location parsegeopoint? // it will store the city's coordinate on earth 8 } теперь мы переходим к сохранению образца данных этот шаг можно реализовать с помощью swift или непосредственно из консоли вашего приложения на платформе back4app //after setting up your xcode project, calling the following method should save some sample data on your back4app database 1 import parseswift 2 3 func setupsampledata() { 4 do { 5 // montevideo uruguay 6 = try city( 7 name "montevideo", 8 location parsegeopoint(coordinate cllocationcoordinate2d(latitude 34 85553195363169, longitude 56 207280375137955)) 9 ) save() 10 11 // brasília brazil 12 = try city( 13 name "brasília", 14 location parsegeopoint(coordinate cllocationcoordinate2d(latitude 15 79485821477289, longitude 47 88391074690196)) 15 ) save() 16 17 // bogotá colombia 18 = try city( 19 name "bogotá", 20 location parsegeopoint(coordinate cllocationcoordinate2d(latitude 4 69139880891712, longitude 74 06936691331047)) 21 ) save() 22 23 // mexico city mexico 24 = try city( 25 name "mexico city", 26 location parsegeopoint(coordinate cllocationcoordinate2d(latitude 19 400977162618933, longitude 99 13311378164776)) 27 ) save() 28 29 // washington, d c united states 30 = try city( 31 name "washington, d c ", 32 location parsegeopoint(coordinate cllocationcoordinate2d(latitude 38 930727220189944, longitude 77 04626261880388)) 33 ) save() 34 35 // ottawa canada 36 = try city( 37 name "ottawa", 38 location parsegeopoint(latitude 45 41102167733425, longitude 75 695414598736) 39 ) save() 40 } catch let error as parseerror { 41 print("\[parseswift error]", error message) 42 } catch { 43 print("\[error]", error localizeddescription) 44 } 45 } back4app's console //a quick way to insert elements on your back4app database is via the console located in your app’s api section once you are there, you can start running javascript code to save the sample data 1 // add city objects and create table 2 // note how geopoints are created, passing latitude and longitude as arguments 3 // montevideo 4 city = new parse object('city'); 5 city set('name', 'montevideo uruguay'); 6 city set('location', new parse geopoint( 34 85553195363169, 56 207280375137955)); 7 await city save(); 8 9 // brasília 10 city = new parse object('city'); 11 city set('name', 'brasília brazil'); 12 city set('location', new parse geopoint( 15 79485821477289, 47 88391074690196)); 13 await city save(); 14 15 // bogotá 16 city = new parse object('city'); 17 city set('name', 'bogotá colombia'); 18 city set('location', new parse geopoint(4 69139880891712, 74 06936691331047)); 19 await city save(); 20 21 // mexico city 22 city = new parse object('city'); 23 city set('name', 'mexico city mexico'); 24 city set('location', new parse geopoint(19 400977162618933, 99 13311378164776)); 25 await city save(); 26 27 // washington, d c 28 city = new parse object('city'); 29 city set('name', 'washington, d c usa'); 30 city set('location', new parse geopoint(38 930727220189944, 77 04626261880388)); 31 await city save(); 32 33 // ottawa 34 city = new parse object('city'); 35 city set('name', 'ottawa canada'); 36 city set('location', new parse geopoint(45 41102167733425, 75 695414598736)); 37 await city save(); 3 запрос данных сортировка результатов с сохраненными образцами данных мы можем начать выполнять различные типы запросов в нашем первом примере мы выберем все города и отсортируем их в зависимости от того, насколько далеко они находятся от эталонной геоточки мы реализуем этот запрос, передавая ограничение в query\<city> query\<city> объект метод near(key\ geopoint ) near(key\ geopoint ) доступен через parseswift sdk parseswift sdk позволяет нам построить такое ограничение в качестве аргументов мы передаем имя поля (обычно называемое key key ) содержащего эталонный geopoint geopoint 1 // the reference geopoint will be kingston city jamaica 2 guard let kingstongeopoint = try? parsegeopoint(latitude 18 018086950599134, longitude 76 79894232253473) else { return } 3 4 let query = city query(near(key "location", geopoint kingstongeopoint)) // the method near(key\ geopoint ) returns the constraint needed to sort the query 5 6 let sortedcities \[city]? = try? query find() // executes the query synchronosuly and returns an array containing the cities properly sorted 7 8 query find { result in // executes the query asynchronosuly and returns a result<\[city], parseerror> type object to handle the results 9 switch result { 10 case success(let cities) 11 // cities = \[bogotá, washington dc, mexico city, ottawa, brasília, montevideo] 12 case failure(let error) 13 // handle the error if something happened 14 } 15 } выбор результатов в заданном регионе предположим, мы хотим выбрать города в определенном регионе мы можем достичь этого с помощью ограничения, созданного методом withinkilometers(key\ geopoint\ distance ) withinkilometers(key\ geopoint\ distance ) в качестве аргументов мы передаем имя поля, содержащее местоположение города, центр региона ( parsegeopoint parsegeopoint типа данных) и максимальное расстояние (в км ) на которое город может находиться от центра этого региона чтобы выбрать все города, которые находятся на расстоянии не более 3000км от кингстона ямайка, мы можем сделать это следующим образом 1 let distance double = 3000 // km 2 guard let kingstongeopoint = try? parsegeopoint(latitude 18 018086950599134, longitude 76 79894232253473) else { return } 3 4 let query = city query(withinkilometers(key "location", geopoint kingstongeopoint, distance distance)) 5 // the method withinkilometers(key\ geopoint\ distance ) returns the constraint we need for this case 6 7 let sortedcities \[city]? = try? query find() // executes the query synchronosuly and returns an array containing the cities we are looking for (bogotá, washington dc and mexico city in this case) 8 9 query find { result in // executes the query asynchronosuly and returns a result<\[city], parseerror> type object to handle the results 10 switch result { 11 case success(let cities) 12 // cities = \[bogotá, washington dc, mexico city] 13 case failure(let error) 14 // handle the error if something happened 15 } 16 } кроме того, когда расстояние указано в милях вместо километров, мы можем использовать метод withinmiles(key\ geopoint\ distance\ sorted ) withinmiles(key\ geopoint\ distance\ sorted ) менее распространенный метод, withinradians(key\ geopoint\ distance\ sorted ) withinradians(key\ geopoint\ distance\ sorted ) , также доступен, если расстояние указано в радианах его использование очень похоже на предыдущие методы выбор результатов в заданном многоугольнике в предыдущем примере мы выбрали города в регионе, представленном круговой областью в случае, если нам требуется иметь не круговую форму для региона, parseswift sdk parseswift sdk позволяет нам конструировать такие регионы из их вершин теперь цель этого примера выбрать города в пределах пятиугольника с пятью вершинами эти вершины выражаются с помощью parsegeopoint parsegeopoint структуры как только мы создали вершины, мы создаем parsepolygon parsepolygon этот многоугольник затем передается в метод withinpolygon(key\ polygon ) withinpolygon(key\ polygon ) (предоставленный parseswift sdk parseswift sdk ) для построения ограничения, которое позволит нам выбрать города в пределах этого многоугольника 1 // the polygon where the selected cities are 2 let polygon parsepolygon? = { 3 do { 4 // we first instantiate the polygon vertices 5 let geopoint1 = try parsegeopoint(latitude 15 822238344514378, longitude 72 42845934415942) 6 let geopoint2 = try parsegeopoint(latitude 0 7433770196268968, longitude 97 44765968406668) 7 let geopoint3 = try parsegeopoint(latitude 59 997149373299166, longitude 76 52969196322749) 8 let geopoint4 = try parsegeopoint(latitude 9 488786415007201, longitude 18 346101586021952) 9 let geopoint5 = try parsegeopoint(latitude 15 414859532811047, longitude 60 00625459569375) 10 11 // next we compose the polygon 12 return try parsepolygon(\[geopoint1, geopoint2, geopoint3, geopoint4, geopoint5]) 13 } catch let error as parseerror { 14 print("failed to instantiate vertices \\(error message)") 15 return nil 16 } catch { 17 print("failed to instantiate vertices \\(error localizeddescription)") 18 return nil 19 } 20 }() 21 22 guard let safepolygon = polygon else { return } 23 24 let query = city query(withinpolygon(key "location", polygon safepolygon)) 25 // withinpolygon(key\ polygon ) returns the required constraint to apply on the query 26 27 let cities = try? query find() // executes the query synchronously 28 29 query find { result in // executes the query asynchronously and returns a result of type result<\[], parseerror> 30 // handle the result 31 } заключение в настоящее время выполнение операций с данными о местоположении для предложения индивидуальных услуг очень важно back4app вместе с parseswift sdk parseswift sdk упрощает реализацию таких операций