Home NestJs와 MongoDB로 위치정보 사용하기
Post
Cancel

NestJs와 MongoDB로 위치정보 사용하기

NestJs와 MongoDB로 위치정보 사용하기

🎊 시작하기 전에…

NestJS와 MongoDB를 TypeORM을 이용해서 위치정보를 활용 방법을 적은 글입니다.

1️⃣ 스키마 정의

1
2
3
4
5
6
7
8
export class Location {
  constructor(type: string, coordinates: number[]) {
    this.type = type;
    this.coordinates = coordinates;
  }
  type: string;
  coordinates: number[];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Entity()
export class Store {
  @ObjectIdColumn()
  id: number;

  @Column()
  title: string;

  @Column()
  category: string;

  @Column({ length: 512, unique: true })
  address: string;

  @Column({ type: 'point' })
  location: Location; 

  @Column()
  x: number;

  @Column()
  y: number;
}

코드가 상당히 길지만, 중요한 부분만 요약하면, 위치 정보를 저장하는 location은 object type으로 두어야하는데, mongoDB에서 위치 정보가 저장될 때

1
{"type": "Point", "coordinates": [126.8990639, 33.4397954]}

와 같이 저장이 되므로 위 형태를 객체로 만들어서 엔티티에서 사용을 하면 된다.

2️⃣ 주변 위치 찾기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
this.storeRepository
      .find({
        where: {
          $and: [
            {
              location: {
                $geoWithin: {
                  $centerSphere: [
                    [Number(lon), Number(lat)],
                    Number(distance) / 6378.1,
                  ],
                },
              },
            },
          ],
        },
      })
      .catch(() => {
        throw new BadRequestException('Parameter Value Not Found');
      });

위 코드에서 storeRepository는 TypeORM의 EntityRepository를 이용해서 만들어진 Repository이다.

위치 기반 검색에서 centerSphere라는 방법으로 기준 위치 [Number(lon), Number(lat)]와 거리차이 Number(distance) / 6378.1 (KM단위)로 값을 넣어주면 된다.

6378.1은 지구 둘레이다.

This post is licensed under CC BY 4.0 by the author.