iOS
...
Data Objects
Geodatenabfragen mit ParseSwift SDK: Technische Implementierung
9 min
geoabfragen einführung wir verwenden den begriff geoabfragen um die art von abfragen zu bezeichnen, bei denen ihre bedingungen parsegeopoint parsegeopoint felder betreffen es wird empfohlen, die parsegeopoint parsegeopoint struktur zu verwenden, um geografische standortdaten in einer back4app datenbank zu speichern das parseswift sdk parseswift sdk bietet eine reihe von methoden, die es uns ermöglichen, daten gemäß den bedingungen abzufragen, die auf parsegeopoint parsegeopoint datentypen angewendet werden voraussetzungen um dieses tutorial abzuschließen, benötigen sie eine app die auf back4app erstellt wurde eine grundlegende ios app zum testen von abfragen ziel um zu verstehen, wie man daten mithilfe von bedingungen zu geografischen standortdaten abfragt 1 schnelle übersicht über die query\<u> klasse jede abfrage, die auf einer back4app datenbank durchgeführt wird, erfolgt über die generische klasse query\<u> query\<u> der generische parameter u u (der dem parseobject parseobject protokoll entspricht) ist der datentyp der objekte, die wir aus der datenbank abrufen möchten gegeben einen datentyp wie myobject myobject , rufen wir diese objekte aus einer back4app datenbank auf folgende weise ab 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 } sie können mehr über die query\<u> query\<u> klasse hier in der offiziellen dokumentation https //github com/parse community/parse swift 2 speichern sie einige daten auf back4app bevor wir beginnen, abfragen auszuführen, sollten wir einige beispieldaten in einer back4app datenbank speichern indem sie dem schnellstart https //www back4app com/docs/ios/parse swift sdk/install sdk leitfaden folgen, können sie ihre beispiel ios app mit ihrer back4app datenbank konfigurieren und verknüpfen in diesem leitfaden werden wir informationen über städte speichern wir verwenden die folgende struktur, um die informationen einer stadt zu organisieren 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 } jetzt fahren wir fort, die beispieldaten zu speichern dieser schritt kann mit swift oder direkt über die konsole https //www youtube com/watch?v=nvwryrzbcma auf der back4app plattform durchgeführt werden //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 abfrage der daten sortierung der ergebnisse mit den gespeicherten beispieldaten können wir beginnen, verschiedene abfragetypen durchzuführen für unser erstes beispiel wählen wir alle städte aus und sortieren sie je nachdem, wie weit sie von einem referenz geopunkt entfernt sind wir implementieren diese abfrage, indem wir eine einschränkung an das query\<city> query\<city> objekt übergeben die methode near(key\ geopoint ) near(key\ geopoint ) ist über das parseswift sdk parseswift sdk verfügbar und ermöglicht es uns, eine solche einschränkung zu konstruieren als argumente übergeben wir den namen des feldes (gewöhnlich als key key ) bezeichnet, das den referenz geopoint geopoint enthält 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 } auswahl von ergebnissen innerhalb einer bestimmten region angenommen, wir möchten städte innerhalb einer bestimmten region auswählen wir können dies mit einer einschränkung erreichen, die durch die methode withinkilometers(key\ geopoint\ distance ) withinkilometers(key\ geopoint\ distance ) als argumente übergeben wir den namen des feldes, das den standort der stadt enthält, das zentrum der region (ein parsegeopoint parsegeopoint datentyp) und die maximale entfernung (in km ) zu der eine stadt von diesem zentrum der region entfernt sein kann um alle städte auszuwählen, die höchstens 3000km von kingston jamaika entfernt sind, können wir es auf folgende weise tun 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 } zusätzlich, wenn die entfernung in meilen anstelle von kilometern angegeben wird, können wir die withinmiles(key\ geopoint\ distance\ sorted ) withinmiles(key\ geopoint\ distance\ sorted ) methode verwenden eine weniger gebräuchliche methode, withinradians(key\ geopoint\ distance\ sorted ) withinradians(key\ geopoint\ distance\ sorted ) , ist ebenfalls verfügbar, wenn die entfernung in bogenmaß angegeben wird ihre verwendung ist sehr ähnlich zu den vorherigen methoden auswahl von ergebnissen innerhalb eines gegebenen polygons im vorherigen beispiel haben wir städte innerhalb einer region ausgewählt, die durch eine kreisförmige region dargestellt wird falls wir eine nicht kreisförmige form für die region benötigen, erlaubt uns die parseswift sdk parseswift sdk solche regionen aus ihren eckpunkten zu konstruieren das ziel dieses beispiels ist es, städte innerhalb eines fünf eck polygons auszuwählen diese eckpunkte werden mit der parsegeopoint parsegeopoint struktur ausgedrückt sobald wir die eckpunkte erstellt haben, instanziieren wir ein parsepolygon parsepolygon dieses polygon wird dann an die withinpolygon(key\ polygon ) withinpolygon(key\ polygon ) methode (bereitgestellt von der parseswift sdk parseswift sdk ) übergeben, um die einschränkung zu erstellen, die es uns ermöglicht, städte innerhalb dieses polygons auszuwählen 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 } fazit heutzutage ist es sehr wichtig, operationen mit standortdaten durchzuführen, um maßgeschneiderte dienste anzubieten back4app zusammen mit dem parseswift sdk parseswift sdk macht es einfach, solche arten von operationen zu implementieren