Google Cloud Platform 에서 Maps Static API를 사용하여 제작하려한다.
https://oceancoding.blogspot.com/2020/06/google-map-python.html
이 포스트를 참고하여 만들려고 한다.
테스트 결과는 잘나온다.
GPS값을 입력해도 위치가 잘 나타난다.
파이썬 GUI를 사용하지 않고 실시간으로 보는 API가 있을 수 있지만 사용법도 어려울 뿐 아니라 내가 원하는 프로그램을 만들어 낼 수 없다.
실시간으로 움직이는 데이터의 위치를 계속 request하여 받아오기에는 많은 어려움이 있을 것으로 예상이 된다.
Google Map 데이터를 불러오는 방식이 URI의 이미지를 불러오는 방식이라서 실시간으로 이미지를 불러오는데는 문제가 있다.
내가 만들고자하는 기능을 정리해 보면
- 이미지의 임의의 점을 클릭하였을 때 그 위치의 정확한 GPS(위도, 경도)값이 출력되도록 하기
- 점을 여러개 찍어 WayPoint Queue 만들기
- IMU, GPS 데이터를 받아와서 화살표로 위치와 방향을 표시하기
결국 해결해야할 문제는 이미지를 클릭하였을 때 그 위치의 GPS값 불러오기와 이미지 위에 새로운 마커를 추가하는 것이다.
PyQt5을 사용하여 이 기능을 모두 막힘없이 수행할 수 있을지가 의문이다.....
프로그램을 제작하기 전에 알고리즘을 구성하는게 우선이다.
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를 사용하는데는 문제가 있고 유니티를 활용하면 해결할 수 있을 것 같다.