안드로이드 앱에서 Parse 이용한 고급 GeoPoint 쿼리 방법
지오쿼리
소개
이 가이드에서는 Android 애플리케이션에서 Parse를 사용하여 GeoPoint 쿼리를 수행하는 방법을 배웁니다.
이 튜토리얼은 compileSdk = 30로 생성된 Android Studio Arctic Fox -2020.3.1에서 만든 앱을 사용합니다.minSdk = 23 및 targetSdk = 30
언제든지 이 튜토리얼로 구축된 전체 Android 프로젝트에 대한 액세스를 Github 리포지토리에서 확인할 수 있습니다.
목표
Back4App에 저장된 지오포인트와 Android 지리 위치를 사용하여 지오쿼리를 수행합니다.
우리가 달성할 목표의 미리보기는 다음과 같습니다:

전제 조건
이 튜토리얼을 완료하려면 다음이 필요합니다:
- Back4App에서 생성된 앱.
- Back4App에 연결된 안드로이드 앱.
시작해봅시다!
다음 단계 전에, 우리는 Back4App을(를) 우리의 애플리케이션에 연결해야 합니다. appId와 clientKey를 Back4App에서 string.xml 파일에 저장한 후, Parse를 우리의 App.java 또는 App.kt 파일에서 초기화해야 합니다. 새 Parse 앱 튜토리얼을(를) 따라가세요, 만약 Parse를(을) 당신의 앱에 초기화하는 방법을 모른다면.
또는 위에 공유한 github 링크에서 프로젝트를 다운로드하고 appId와 clientKey 부분만 수정할 수 있습니다.
1 - Back4App에 데이터 저장하기
이 단계에서는, 우리는 Parse가 제공하는 JS 콘솔과 자바스크립트 코드를 사용하여 클래스를 생성하고, 이 클래스에 대한 쿼리를 생성할 것입니다.
클래스를 생성해 보겠습니다. 이 클래스는 이 가이드에서 우리의 쿼리 대상이 될 것입니다. Parse JS 콘솔에서는 JavaScript 코드를 직접 실행하여 JS SDK 명령을 사용하여 애플리케이션 데이터베이스 내용을 쿼리하고 업데이트할 수 있습니다. 아래 코드를 JS 콘솔에서 실행하고 Back4App에 데이터를 삽입하세요.
대시보드에서 JS 콘솔이 어떻게 보이는지 확인해 보세요:

다음 예제 내용을 사용하여 City 클래스를 생성하세요:
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();
38
39 console.log('Success!');2 - Android 앱에서 데이터 쿼리하기
이제 클래스에 데이터가 채워졌으므로, GeoPoint 쿼리를 수행할 수 있습니다. 자메이카 킹스턴(위도 18.01808695059913, 경도 -76.79894232253473)에서 가장 가까운 City 결과를 정렬해 보겠습니다. ParseQuery.whereNear 메서드를 사용합니다:
1 ParseQuery<ParseObject> query = new ParseQuery<>("City");
2 query.whereNear("location",new ParseGeoPoint(18.018086, -76.798942));
3 query.findInBackground((objects, e) -> {
4 if (e==null){
5 initData(objects);
6 } else {
7 Toast.makeText(MainActivity.this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
8 }
9 });이제 ParseQuery.whereWithinKilometers, 메서드를 사용하여 쿼리를 수행해 보겠습니다. 이 메서드는 GeoPoint 필드가 최대 거리 내에 위치한 모든 결과를 검색합니다. 킹스턴을 다시 참조로 사용하고 거리 제한은 3000km로 설정하겠습니다.
1 ParseQuery<ParseObject> query = new ParseQuery<>("City");
2 query.whereWithinKilometers("location",new ParseGeoPoint(18.018086, -76.798942),3000);
3 query.findInBackground((objects, e) -> {
4 if (e==null){
5 initData(objects);
6 } else {
7 Toast.makeText(MainActivity.this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
8 }
9 });또 다른 유용한 쿼리 메서드는 ParseQuery.whereWithinPolygon, 이 메서드는 GeoPoint 필드 값이 지정된 다각형 내에 있는 결과를 쿼리합니다. 이 다각형은 최소 세 개의 GeoPoints로 구성된 배열로 이루어져 있습니다. 다각형 경로가 열려 있으면 Parse가 마지막 점과 첫 번째 점을 연결하여 자동으로 닫습니다. 이 예제에서는 대략적으로 남미 대륙을 포함하는 간단한 다각형을 사용하며, 이는 바다에 있는 5개의 먼 GeoPoints로 구성됩니다.
1 ParseQuery<ParseObject> query = new ParseQuery<>("City");
2
3 ParseGeoPoint geoPoint1 = new ParseGeoPoint(15.822238344514378, -72.42845934415942);
4 ParseGeoPoint geoPoint2 = new ParseGeoPoint(-0.7433770196268968, -97.44765968406668);
5 ParseGeoPoint geoPoint3 = new ParseGeoPoint(-59.997149373299166, -76.52969196322749);
6 ParseGeoPoint geoPoint4 = new ParseGeoPoint(-9.488786415007201, -18.346101586021952);
7 ParseGeoPoint geoPoint5 = new ParseGeoPoint(15.414859532811047, -60.00625459569375);
8 ParseGeoPoint geoPoint6 = new ParseGeoPoint(41.015137, 28.97953);
9
10 List<ParseGeoPoint> list = new ArrayList<>();
11 list.add(geoPoint1);
12 list.add(geoPoint2);
13 list.add(geoPoint3);
14 list.add(geoPoint4);
15 list.add(geoPoint5);
16 list.add(geoPoint6);
17 query.whereWithinPolygon("location",list);
18
19 query.findInBackground((objects, e) -> {
20 if (e==null){
21 initData(objects);
22 } else {
23 Toast.makeText(MainActivity.this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
24 }
25 });완료되었습니다!
이 가이드를 마치면, Parse에서 GeoPoint 데이터 쿼리가 어떻게 작동하는지와 Android 앱에서 Back4App으로 이를 수행하는 방법을 배웠습니다. 다음 가이드에서는 Parse에서 사용자를 생성하고 관리하는 방법을 확인할 것입니다.