iOS
...
Data Objects
Optimisation des Geoqueries avec ParseSwift SDK pour iOS
9 min
geoqueries introduction nous utilisons le terme geoqueries pour désigner le type de requêtes dont les conditions impliquent des champs de type parsegeopoint parsegeopoint il est recommandé d'utiliser la structure parsegeopoint parsegeopoint pour stocker des données de localisation géographique dans une base de données back4app le parseswift sdk parseswift sdk fournit un ensemble de méthodes qui nous permet de requêter des données selon des conditions appliquées sur des données de type parsegeopoint parsegeopoint prérequis pour compléter ce tutoriel, vous aurez besoin de une application créée sur back4app une application ios de base pour tester les requêtes objectif comprendre comment requêter des données en utilisant des conditions sur des données de localisation géographique 1 revue rapide sur la query\<u> classe toute requête effectuée sur une base de données back4app se fait via la classe générique query\<u> query\<u> le paramètre générique u u (conforme au parseobject parseobject protocole) est le type de données des objets que nous essayons de récupérer de la base de données étant donné un type de données comme myobject myobject , nous récupérons ces objets d'une base de données back4app de la manière suivante 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 } vous pouvez en savoir plus sur la query\<u> query\<u> classe ici dans la documentation officielle https //github com/parse community/parse swift 2 enregistrer des données sur back4app avant de commencer à exécuter des requêtes, nous devrions stocker quelques données d'exemple sur une base de données back4app en suivant le guide de démarrage rapide https //www back4app com/docs/ios/parse swift sdk/install sdk , vous pouvez configurer et lier votre application ios d'exemple à votre base de données back4app pour ce guide, nous allons stocker des informations sur les villes nous utilisons la structure suivante pour organiser les informations d'une ville 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 } maintenant, nous procédons à stocker les données d'échantillon cette étape peut être mise en œuvre en utilisant swift ou directement depuis la console https //www youtube com/watch?v=nvwryrzbcma sur la plateforme 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 interroger les données trier les résultats avec les données d'exemple sauvegardées, nous pouvons commencer à effectuer différents types de requêtes pour notre premier exemple, nous allons sélectionner toutes les villes et les trier en fonction de leur distance par rapport à un point géographique de référence nous mettons en œuvre cette requête en passant une contrainte à l' query\<city> query\<city> objet la méthode near(key\ geopoint ) near(key\ geopoint ) disponible via le parseswift sdk parseswift sdk nous permet de construire une telle contrainte comme arguments, nous passons le nom du champ (généralement appelé key key ) contenant le geopoint geopoint de référence 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 } sélectionner des résultats dans une région donnée supposons que nous voulons sélectionner des villes dans une certaine région nous pouvons y parvenir avec une contrainte créée par la méthode withinkilometers(key\ geopoint\ distance ) withinkilometers(key\ geopoint\ distance ) en arguments, nous passons le nom du champ contenant la localisation de la ville, le centre de la région (un parsegeopoint parsegeopoint de type de données) et la distance maximale (en km ) qu'une ville peut être de ce centre de région pour sélectionner toutes les villes qui sont à au plus 3000km de kingston jamaïque, nous pouvons le faire de la manière suivante 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 } de plus, lorsque la distance est donnée en miles au lieu de kilomètres, nous pouvons utiliser le withinmiles(key\ geopoint\ distance\ sorted ) withinmiles(key\ geopoint\ distance\ sorted ) méthode une méthode moins courante, withinradians(key\ geopoint\ distance\ sorted ) withinradians(key\ geopoint\ distance\ sorted ) , est également disponible si la distance est donnée en radians son utilisation est très similaire aux méthodes précédentes sélectionner des résultats dans un polygone donné dans l'exemple précédent, nous avons sélectionné des villes dans une région représentée par une région circulaire dans le cas où nous devons avoir une forme non circulaire pour la région, le parseswift sdk parseswift sdk nous permet de construire de telles régions à partir de leurs sommets maintenant, l'objectif de cet exemple est de sélectionner des villes à l'intérieur d'un polygone à cinq sommets ces sommets sont exprimés en utilisant le parsegeopoint parsegeopoint struct une fois que nous avons créé les sommets, nous instancions un parsepolygon parsepolygon ce polygone est ensuite passé à la withinpolygon(key\ polygon ) withinpolygon(key\ polygon ) méthode (fournie par le parseswift sdk parseswift sdk ) pour construire la contrainte qui nous permettra de sélectionner des villes à l'intérieur de ce polygone 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 } conclusion de nos jours, effectuer des opérations sur des données de localisation pour offrir des services personnalisés est très important back4app, avec le parseswift sdk parseswift sdk facilite la mise en œuvre de ce type d'opérations