GPS Map Making (in Python) (1)

이민철·2022년 1월 29일
1

GPSMap

목록 보기
1/3

Google Cloud Platform 에서 Maps Static API를 사용하여 제작하려한다.

GoogleMap Static API

https://oceancoding.blogspot.com/2020/06/google-map-python.html
이 포스트를 참고하여 만들려고 한다.

테스트 결과는 잘나온다.

GPS값을 입력해도 위치가 잘 나타난다.

  • 파이썬 GUI를 사용하지 않고 실시간으로 보는 API가 있을 수 있지만 사용법도 어려울 뿐 아니라 내가 원하는 프로그램을 만들어 낼 수 없다.

  • 실시간으로 움직이는 데이터의 위치를 계속 request하여 받아오기에는 많은 어려움이 있을 것으로 예상이 된다.

  • Google Map 데이터를 불러오는 방식이 URI의 이미지를 불러오는 방식이라서 실시간으로 이미지를 불러오는데는 문제가 있다.


내가 만들고자하는 기능을 정리해 보면

  1. 이미지의 임의의 점을 클릭하였을 때 그 위치의 정확한 GPS(위도, 경도)값이 출력되도록 하기
  2. 점을 여러개 찍어 WayPoint Queue 만들기
  3. IMU, GPS 데이터를 받아와서 화살표로 위치와 방향을 표시하기

결국 해결해야할 문제는 이미지를 클릭하였을 때 그 위치의 GPS값 불러오기와 이미지 위에 새로운 마커를 추가하는 것이다.

PyQt5을 사용하여 이 기능을 모두 막힘없이 수행할 수 있을지가 의문이다.....

Program Algorithm

프로그램을 제작하기 전에 알고리즘을 구성하는게 우선이다.

1. 이미지 위의 임의의 점의 GPS데이터 알아내기

  1. 기준이 되는 GPS를 center로 하는 맵을 불러온다.
  2. 이미지에서 특정 점을 클릭하였을 때 기준점과 떨어진 위치 (x, y) 데이터를 얻는다. 이 데이터의 단위는 pixel단위로 될 것이다.
  3. 척축을 사용하여 미터 단위의 실제 거리를 구해낼 수 있다.
  4. Flat2LLA 방법을 사용하여 클릭한 점의 GPS값을 구한다.

MapSize = 20 을 기준으로
X : 1pixel 당 0.095468m
Y : 1pixel 당 0.095534m

위와 같은 결과가 나왔다.

LLh2Flat.py

  • 두 개의 위도 경도 데이터를 입력하면 E, W 방향으로 떨어진 거리를 반환한다.
import math
def LLh2Flat(start_p, present_p): #change coordinate (start_p : 현재 좌표, present_p : 목적지 좌표)
    start_p = [math.radians(start_p[0]), math.radians(start_p[1])]
    present_p = [math.radians(present_p[0]), math.radians(present_p[1])]
    print(start_p,present_p)
    re = 6378137
    rp = 6356752.314245
    e = 0.0818
    RN = re/math.sqrt(1-e*e*math.sin(start_p[0])*math.sin(start_p[0]))
    RM = RN * (1-e*e) / math.sqrt(1-e*e *
                                  math.sin(start_p[0])*math.sin(start_p[0])) 
    Nned = (present_p[0] - start_p[0])/math.atan2(1, RM)
    Ened = (present_p[1] - start_p[1])/math.atan2(1, RN*math.cos(start_p[0]))
    return [Ened, Nned]
Input : startLat, startLon, finalLat, finalLon 
Output : X, Y

Flat2LLh.py

  • 현재 Lat, Lon 데이터와 E, W 방향으로의 이동거리를 입력하면 그 위치의 Lat, Lon 값이 반환된다.
import math
def Flat2LLh(start_p, x,y):
    start_p = [math.radians(start_p[0]), math.radians(start_p[1])]
    re = 6378137
    rp = 6356752.314245
    e = 0.0818
    RN = re/math.sqrt(1-e*e*math.sin(start_p[0])*math.sin(start_p[0]))
    RM = RN * (1-e*e) / math.sqrt(1-e*e *
                                  math.sin(start_p[0])*math.sin(start_p[0])) 
    Lat = math.degrees(y * math.atan2(1, RM) + start_p[0])
    Lon = math.degrees(x * math.atan2(1, RN*math.cos(start_p[0])) + start_p[1])
    return [Lat,Lon]
Input : startLat, startLon, X, Y, 
Output : finalLat, finalLon

Flat2LLh 코드를 얻기 위해 구글링을 몇 시간동안 했지만 답은 없었고
LLh2Flat 코드를 이용하여 새로운 코드를 만들어 냈다.

테스트 결과 99.99% 일치한다.

이제 알고리즘이 완성되었고 GUI로의 구현만이 남았다.

이제 마우스를 클릭하였을 때 마우스의 위치 데이터만 알아내면 클릭한 위치의 GPS 데이터를 알아낼 수 있다.

미해결 문제

PyQt5를 처음 접해보는 입장에서 GUI를 자유롭게 다루는 것은 쉽지 않았고 어떤 기능이 있는지 몰라서 정체기가 왔다...

  • PyQt5에서 창의 MainWindow에서는 마우스 좌표가 불러와지는데 QPixmap인 이미지 파일 위에서는 이유는 모르겠지만 마우스 좌표를 불러올 수 없다.

  • PyQt5에는 위에 쓰기 기능이 없는 듯하다 x, y 개념만 있고 높이의 개념이 없어서 위에 화살표를 추가하는 것이 불가능 할 듯하다.....

  • 결국 파이썬 GUI를 사용하는데는 문제가 있고 유니티를 활용하면 해결할 수 있을 것 같다.

0개의 댓글