iOS
...
Data Objects
Consultas com ParseGeoPoint no ParseSwift SDK
9 min
geoqueries introdução usamos o termo geoqueries para nos referir ao tipo de consultas cujas condições envolvem parsegeopoint parsegeopoint campos do tipo é recomendável usar a parsegeopoint parsegeopoint estrutura para armazenar dados de localização geográfica em um banco de dados back4app o parseswift sdk parseswift sdk fornece um conjunto de métodos que nos permite consultar dados de acordo com as condições aplicadas em parsegeopoint parsegeopoint tipo de dado pré requisitos para completar este tutorial, você precisará um app criado no back4app um app ios básico para testar consultas objetivo entender como consultar dados usando condições sobre dados de localização geográfica 1 revisão rápida sobre a classe query\<u> qualquer consulta realizada em um banco de dados back4app é feita através da classe genérica query\<u> query\<u> o parâmetro genérico u u (conforme o protocolo parseobject parseobject ) é o tipo de dado dos objetos que estamos tentando recuperar do banco de dados dado um tipo de dado como myobject myobject , recuperamos esses objetos de um banco de dados back4app da seguinte maneira 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 } você pode ler mais sobre a query\<u> query\<u> classe aqui na documentação oficial https //github com/parse community/parse swift 2 salvar alguns dados no back4app antes de começarmos a executar consultas, devemos armazenar alguns dados de exemplo em um banco de dados back4app seguindo o guia rápido https //www back4app com/docs/ios/parse swift sdk/install sdk , você pode configurar e vincular seu aplicativo ios de exemplo ao seu banco de dados back4app para este guia, armazenaremos informações sobre cidades usamos a seguinte estrutura para organizar as informações de uma cidade 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 } agora, vamos proceder para armazenar os dados de amostra este passo pode ser implementado usando swift ou diretamente do console https //www youtube com/watch?v=nvwryrzbcma da sua aplicação na plataforma 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 consultar os dados classificando os resultados com os dados de exemplo salvos, podemos começar a realizar diferentes tipos de consulta para nosso primeiro exemplo, selecionaremos todas as cidades e as classificaremos dependendo de quão longe estão de um geoponto de referência implementamos essa consulta passando uma restrição para o query\<city> query\<city> objeto o método near(key\ geopoint ) near(key\ geopoint ) disponível via o parseswift sdk parseswift sdk nos permite construir tal restrição como argumentos, passamos o nome do campo (geralmente referido como key key ) contendo a referência 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 } selecionando resultados dentro de uma região específica suponha que queremos selecionar cidades dentro de uma certa região podemos alcançar isso com uma restrição criada pelo método withinkilometers(key\ geopoint\ distance ) withinkilometers(key\ geopoint\ distance ) como argumentos, passamos o nome do campo que contém a localização da cidade, o centro da região (um parsegeopoint parsegeopoint do tipo de dado) e a distância máxima (em km ) que uma cidade pode estar do centro dessa região para selecionar todas as cidades que estão a no máximo 3000km de kingston jamaica, podemos fazer isso da seguinte maneira 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 } além disso, quando a distância é dada em milhas em vez de quilômetros, podemos usar o withinmiles(key\ geopoint\ distance\ sorted ) withinmiles(key\ geopoint\ distance\ sorted ) método um método menos comum, withinradians(key\ geopoint\ distance\ sorted ) withinradians(key\ geopoint\ distance\ sorted ) , também está disponível se a distância for dada em radianos seu uso é muito semelhante aos métodos anteriores selecionando resultados dentro de um polígono no exemplo anterior, selecionamos cidades dentro de uma região representada por uma região circular caso precisemos ter uma forma não circular para a região, o parseswift sdk parseswift sdk nos permite construir tais regiões a partir de seus vértices agora, o objetivo deste exemplo é selecionar cidades dentro de um polígono de cinco vértices esses vértices são expressos usando o parsegeopoint parsegeopoint struct uma vez que criamos os vértices, instanciamos um parsepolygon parsepolygon este polígono é então passado para o withinpolygon(key\ polygon ) withinpolygon(key\ polygon ) método (fornecido pelo parseswift sdk parseswift sdk ) para construir a restrição que nos permitirá selecionar cidades dentro deste polígono 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 } conclusão hoje em dia, realizar operações em dados de localização para oferecer serviços personalizados é muito importante o back4app, junto com o parseswift sdk parseswift sdk torna fácil implementar esse tipo de operações