찾다
Javajava지도 시간Android GPS 포지셔닝 테스트(렌더링 및 예제 포함)

오늘은 업무상 예전에 작성했던 GPS 테스트 프로그램을 꺼내서 수정했습니다. 이 프로그램은 역사가 좀 있는 편인데, 안드로이드 개발을 배운 지 얼마 되지 않은 2011년에 썼는데, 실험적인 작품으로 여겨졌죠. 이제 작업에 필요한 부분이라 다시 꺼내서 수리해야겠습니다. 그러다가 안드로이드의 GPS 서비스에 대해 잘 모른다는 것을 알게 되어서 오늘 GPS 서비스에 대한 정보를 좀 읽고 관련 지식 포인트를 기록해 봤습니다.

저는 수년간 GPS 관련 임베디드 소프트웨어를 만들어 왔기 때문에 GPS 측위 모듈을 테스트하는 프로그램을 만들 때 가장 먼저 하는 반응은 직렬 포트를 통해 GPS 모듈의 데이터를 읽는 것입니다. , GPS 형식 데이터의 NMEA를 분석합니다. NMEA는 GPS뿐만 아니라 기타 산업 통신에도 사용되는 표준화된 데이터 형식입니다. 관련 데이터를 분석한 후 표시함으로써 기본적인 GPS 위치 확인 테스트 기능이 완성됩니다.

1. Android 포지셔닝 서비스

먼저 포지셔닝 서비스에 대해 Android에서 제공하는 지원을 살펴보겠습니다.


Android GPS定位测试(附效果图和示例)안드로이드 위치 서비스는 모두 위치 아래에 위치해 있으니 여기서는 자세히 분석하지 않겠습니다. 언급해야 할 한 가지

는 다음과 같습니다. GpsStatus.NmeaListener. 공식적인 설명은 NMEA 데이터를 읽을 수 있다는 것이지만 여기서 테스트한 결과 NMEA 데이터가 읽히지 않은 것으로 나타났습니다. 일부 정보를 상담한 결과 Google은 하위 수준에서 데이터 피드백 기능을 구현하지 않는다고 합니다. 시간나시면 소스코드도 확인해 보시기 바랍니다.


2. LocationManager 포지셔닝

//获取定位服务
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
//判断是否已经打开GPS模块
if (locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) 
{
  //GPS模块打开,可以定位操作      
}
3. GpsStatus 리스너
// 通过GPS定位
String LocateType= locationManager.GPS_PROVIDER;
Location location = locationManager.getLastKnownLocation(LocateType);
// 设置监听器,设置自动更新间隔这里设置1000ms,移动距离:0米。
locationManager.requestLocationUpdates(provider, 1000, 0, locationListener);
// 设置状态监听回调函数。statusListener是监听的回调函数。
locationManager.addGpsStatusListener(statusListener); 
//另外给出 通过network定位设置
String LocateType= locationManager.NETWORK_PROVIDER;
Location location = locationManager.getLastKnownLocation(LocateType);
포지셔닝 서비스의 초기 설정 단계는 위에 나와 있지만 GPS 위성은 정기적으로 방송된다는 것을 모두 알고 있습니다. 데이터, 즉 위성의 GPS 데이터가 정기적으로 수신됩니다. 우리는 위성으로부터 데이터를 적극적으로 요청할 수 없으며 수동적으로 데이터를 수신할 수만 있습니다. (중국의 Beidou 2호는 위성 메시지를 위성으로 보낼 수 있습니다.) 따라서 위성에서 반환된 데이터를 처리하려면 수신기를 등록해야 합니다.


4. 검색된 위성 가져오기
private final GpsStatus.Listener statusListener = new GpsStatus.Listener() 
{
    public void onGpsStatusChanged(int event) 
  {
      // GPS状态变化时的回调,获取当前状态
      GpsStatus status = locationManager.getGpsStatus(null);
    //自己编写的方法,获取卫星状态相关数据
       GetGPSStatus(event, status);
    }
};

위는 주로 status.getSatellites()를 통해 상태 값에서 검색된 위성 수를 가져오는 것입니다. 획득한 GpsSatellite 개체는
private void GetGPSStatus(int event, GpsStatus status) 
{
    Log.d(TAG, "enter the updateGpsStatus()");
    if (status == null) 
    {
    } 
   else if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS) 
    {
     //获取最大的卫星数(这个只是一个预设值)
        int maxSatellites = status.getMaxSatellites();
        Iterator<GpsSatellite> it = status.getSatellites().iterator();
        numSatelliteList.clear();
     //记录实际的卫星数目
        int count = 0;
        while (it.hasNext() && count <= maxSatellites) 
        {
       //保存卫星的数据到一个队列,用于刷新界面
            GpsSatellite s = it.next();
            numSatelliteList.add(s);
            count++;

            Log.d(TAG, "updateGpsStatus----count="+count);
        }
        mSatelliteNum = numSatelliteList.size();
     }
     else if(event==GpsStatus.GPS_EVENT_STARTED)
     {  
         //定位启动   
     }
     else if(event==GpsStatus.GPS_EVENT_STOPPED)
     {  
         //定位结束   
     }
}
나중에 인터페이스를 새로 고칠 수 있도록 대기열에 저장됩니다. 위의 내용은 GPS 상태 리스너를 얻는 것입니다.

위치 변경을 모니터링하는 위치 지정 리스너도 모니터링해야 합니다. 이는 위치 서비스를 제공하는 애플리케이션에 매우 중요합니다.

5. LocationListener 리스너

위치 청취 콜백은 GPS 위치가 변경될 때 자동으로 콜백하는 데 사용되는 방법입니다. 또한 콜백 함수에서 제공하는 위치 매개변수를 통해 경도와 위도, 속도, 고도 및 기타 정보를 포함한 GPS 위치 정보를 얻을 수 있습니다.
private final LocationListener locationListener = new LocationListener() 
{
        public void onLocationChanged(Location location) 
     {
            //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
            updateToNewLocation(location);            
            Log.d(TAG, "LocationListener  onLocationChanged");
        }
        public void onProviderDisabled(String provider) 
     {
            //Provider被disable时触发此函数,比如GPS被关闭
            Log.d(TAG, "LocationListener  onProviderDisabled");
        }
        public void onProviderEnabled(String provider) 
     {
            // Provider被enable时触发此函数,比如GPS被打开
            Log.d(TAG, "LocationListener  onProviderEnabled");
        }
        public void onStatusChanged(String provider, int status, Bundle extras) 
     {
            Log.d(TAG, "LocationListener  onStatusChanged");
            // Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
            if (status == LocationProvider.OUT_OF_SERVICE || status == LocationProvider.TEMPORARILY_UNAVAILABLE)       {    
            }
        }
    };

6. 지리적 위치 정보 획득(위도 및 경도, 위성 수, 고도, 위치 상태)

7. 특정 위성 정보 획득 - 대잡음비)
//location对象是从上面定位服务回调函数的参数获取。
mLatitude = location.getLatitude();   // 经度
mLongitude = location.getLongitude();  // 纬度
mAltitude = location.getAltitude();   //海拔
mSpeed = location.getSpeed();       //速度
mBearing = location.getBearing();    //方向

방향각과 고도각을 이용하여 지구상의 위성의 위치를 ​​나타내는 2차원 도형을 그릴 수 있으며, 신호대잡음비는 더 큰 효과. 일반 위성 위치 확인 테스트 소프트웨어는 GPS 모듈의 별 검색 기능을 나타내는 신호 대 잡음비의 상태 다이어그램을 제공합니다.
//temgGpsSatellite就是我们上面保存的搜索到的卫星
//方向角
float azimuth = temgGpsSatellite.getAzimuth();
//高度角
float elevation = temgGpsSatellite.getElevation();
//信噪比
float snr = temgGpsSatellite.getSnr();


8. 2차원 위성 위치 지도 그리기

다음은 제가 했던 GPS 테스트 렌더링입니다.


Android GPS定位测试(附效果图和示例)다음은 방향각과 고도각을 기준으로 2차원 위성지도에서 위치를 계산하는 방법이다. 위 렌더링의 왼쪽에 있는 녹색 점은 위성 위치를 나타낸다.

오른쪽의 신호 대 잡음비 히스토그램은 위성의 신호 수신 능력을 나타냅니다.

신호 대 잡음비 그림은 단위 변환일 뿐이므로 여기서는 코드를 제공하지 않겠습니다.
//根据方向角和高度角计算出,卫星显示的位置
Point point = new Point();
int x = mEarthHeartX; //左边地球圆形的圆心位置X坐标
int y = mEarthHeartY; //左边地球圆形的圆心位置Y坐标                       
int r = mEarthR;
x+=(int)((r*elevation*Math.sin(Math.PI*azimuth/180)/90));
y-=(int)((r*elevation*Math.cos(Math.PI*azimuth/180)/90));
point.x = x;
point.y = y;
//point就是你需要绘画卫星图的起始坐标

9. 요약:

Android는 주로 GpsStatus, LocationManager 및 GpsSatellite를 통해 관련 서비스 및 모니터링을 구현하는 등 매우 편리한 위치 서비스를 제공합니다.


그러나 개인적으로 NMEA 데이터를 직접 읽을 수 있다면 적어도 일부 애플리케이션에서는 더 많은 정보를 얻을 수 있다면 매우 편리할 것이라고 생각합니다.


더 많은 Android GPS 위치 확인 테스트(렌더링 및 예제 포함) 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
JVM은 운영 체제 API의 차이를 어떻게 처리합니까?JVM은 운영 체제 API의 차이를 어떻게 처리합니까?Apr 27, 2025 am 12:18 AM

JVM은 JNI (JavanativeInterface) 및 Java 표준 라이브러리를 통한 운영 체제 API 차이를 처리합니다. 1. JNI는 Java 코드가 로컬 코드를 호출하고 운영 체제 API와 직접 상호 작용할 수 있습니다. 2. Java Standard Library는 통합 API를 제공하며,이 API는 내부적으로 다른 운영 체제 API에 매핑되어 코드가 플랫폼에서 실행되도록합니다.

Java 9에 도입 된 모듈성은 플랫폼 독립성에 어떤 영향을 미칩니 까?Java 9에 도입 된 모듈성은 플랫폼 독립성에 어떤 영향을 미칩니 까?Apr 27, 2025 am 12:15 AM

modularityDoesNotDirectHeftJava'splatformincendence.java'splatformincendenceIngeasted whejvm, butModularItyInfluencesApplicationStructureAndmanagement, deploymentandDuffictionBecomeMoreferficaliticiboliticalWI

바이트 코드 란 무엇이며 Java의 플랫폼 독립성과 어떤 관련이 있습니까?바이트 코드 란 무엇이며 Java의 플랫폼 독립성과 어떤 관련이 있습니까?Apr 27, 2025 am 12:06 AM

bytecodeinjavaistheintermediaterepresentation attenablesplatformincendence.1) javacodeiscompiledintobytecodestoredin.2) thejvminterpretsorcompilesthisbytecodeintomachinecodeartruntime, theCodeTorUnanynanynovice를 허용합니다

Java가 플랫폼 독립 언어로 간주되는 이유는 무엇입니까?Java가 플랫폼 독립 언어로 간주되는 이유는 무엇입니까?Apr 27, 2025 am 12:03 AM

javaachievesplatformincendenceThoughthegroughthejavavirtualMachine (JVM), theexecutesByTecodeonAnyDeviceWitHajvm.1) javacodeiscompiledintobytecode.2) thejvm-mmectretsandexecutesThisteCodeIntomachineCificinStructions, 허용

그래픽 사용자 인터페이스 (GUI)는 Java의 플랫폼 독립성에 대한 과제를 어떻게 제시 할 수 있습니까?그래픽 사용자 인터페이스 (GUI)는 Java의 플랫폼 독립성에 대한 과제를 어떻게 제시 할 수 있습니까?Apr 27, 2025 am 12:02 AM

Javagui 개발의 플랫폼 독립성은 과제에 직면하지만 Swing, Javafx, Unifying Locance, Performance Optimization, 타사 라이브러리 및 크로스 플랫폼 테스트를 사용하여 처리 할 수 ​​있습니다. Javagui Development는 교차 플랫폼 일관성을 제공하는 것을 목표로하는 AWT 및 Swing에 의존하지만 실제 효과는 운영 체제마다 다릅니다. 솔루션은 다음과 같습니다. 1) Swing 및 Javafx 사용 GUI 툴킷으로 사용; 2) UIMANAGER.SETLOOKANDFEEL ()을 통해 외관을 통합합니다. 3) 다른 플랫폼에 맞게 성능을 최적화합니다. 4) apachepivot 또는 SWT와 같은 타사 라이브러리 사용; 5) 일관성을 보장하기 위해 크로스 플랫폼 테스트를 수행하십시오.

Java 개발의 어떤 측면이 플랫폼 의존적입니까?Java 개발의 어떤 측면이 플랫폼 의존적입니까?Apr 26, 2025 am 12:19 AM

javadevelopmentisnotentirelyplatform-IndectionentDuetoSeveralFactors.1) JVMVARIATIONSAFFERFFERFORMANDBEHAVIORACROSSDIFFERENTOS.2) nativelibrariesViajniintrictionPlatform-specificiss.3) filepathsandsystempropertiesdifferbetweenplatectry. 4)

다른 플랫폼에서 Java 코드를 실행할 때 성능 차이가 있습니까? 왜?다른 플랫폼에서 Java 코드를 실행할 때 성능 차이가 있습니까? 왜?Apr 26, 2025 am 12:15 AM

Java 코드는 다른 플랫폼에서 실행할 때 성능 차이가 있습니다. 1) JVM의 구현 및 최적화 전략은 OracleJDK 및 OpenJDK와 같이 다릅니다. 2) 메모리 관리 및 스레드 스케줄링과 같은 운영 체제의 특성도 성능에 영향을 미칩니다. 3) 적절한 JVM을 선택하여 JVM 매개 변수 및 코드 최적화를 조정하여 성능을 향상시킬 수 있습니다.

Java의 플랫폼 독립성의 몇 가지 한계는 무엇입니까?Java의 플랫폼 독립성의 몇 가지 한계는 무엇입니까?Apr 26, 2025 am 12:10 AM

Java'SplatformIndenceHASLIMITATIONSINTERFORMANTOWORHEAD, 버전 컴포팅 가능성, 도전 과제, 플랫폼-특이 적 식품, 및 JVMINSTALLATION/MAYMENDENT.ThesefacteThe "WriteOnce, Runanywhere"

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!