Maison >Java >javaDidacticiel >Test de positionnement GPS Android (avec rendus et exemples)

Test de positionnement GPS Android (avec rendus et exemples)

高洛峰
高洛峰original
2017-01-07 14:52:312261parcourir

Aujourd'hui, en raison de besoins professionnels, j'ai sorti un programme de test GPS que j'avais écrit auparavant et je l'ai révisé. Ce programme a un peu d'histoire. Je l'ai écrit en 2011, peu de temps après avoir appris le développement Android, et il était considéré comme un travail expérimental. Maintenant, le travail l'exige, je dois donc le retirer et le réparer. Dans le même temps, j'ai découvert que je ne connaissais pas grand-chose au service GPS d'Android, j'ai donc lu quelques informations sur le service GPS aujourd'hui et enregistré les points de connaissances pertinents.

Je crée des logiciels embarqués liés au GPS depuis plusieurs années, donc lorsqu'il s'agit de créer un programme pour tester le module de positionnement GPS, ma première réaction est de lire les données du module GPS via le port série , puis analysez le format NMEA des données GPS. NMEA est un format de données standardisé qui est utilisé non seulement dans le GPS, mais également dans d'autres communications industrielles. En analysant les données pertinentes puis en les affichant, une fonction de test de positionnement GPS de base est complétée.

Après vérification, j'ai découvert qu'il n'est pas nécessaire de lire l'analyse des données NMEA pour effectuer des services de positionnement liés au GPS sur Android. Android a déjà fourni les services pertinents et il vous suffit d'appeler l'API. . Je ne sais pas si je devrais me sentir heureux ou confus à ce sujet. (Android fournit également une interface de lecture NMEA, qui sera abordée ci-dessous)

1. Service de positionnement Android
Jetons d'abord un coup d'œil au support fourni par Android pour les services de positionnement :

Android GPS定位测试(附效果图和示例)

Les services de localisation Android sont tous situés sous localisation. Il y a des instructions pertinentes ci-dessus, je ne les analyserai donc pas en détail ici. Une chose qui doit être mentionnée
est : GpsStatus.NmeaListener. La déclaration officielle est qu'il peut lire les données NMEA, mais mon test ici a révélé qu'aucune donnée NMEA n'a été lue. Après avoir consulté certaines informations, il est indiqué que Google n'implémente pas la fonction de retour de données au niveau inférieur. Si vous avez le temps, vous devez vérifier le code source.

2. Positionnement LocationManager

//获取定位服务
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
//判断是否已经打开GPS模块
if (locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) 
{
  //GPS模块打开,可以定位操作      
}
// 通过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);

3. Écouteur GpsStatus
Les étapes de configuration initiales du service de positionnement sont indiquées ci-dessus, mais nous savons tous que les satellites GPS diffusent régulièrement. Les données, c'est-à-dire les données GPS des satellites, seront reçues régulièrement. Nous ne pouvons pas demander activement de données aux satellites et ne pouvons recevoir que passivement des données. (Le Beidou 2 chinois peut envoyer des messages satellite aux satellites) Par conséquent, nous devons enregistrer un auditeur pour traiter les données renvoyées par le satellite.

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

4. Obtenez les satellites recherchés

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)
     {  
         //定位结束   
     }
}

Ce qui précède consiste à obtenir le nombre de satellites recherchés à partir de la valeur d'état, principalement via status.getSatellites(). L'objet GpsSatellite obtenu est
enregistré dans une file d'attente pour un rafraîchissement ultérieur de l'interface. Ce qui précède consiste à obtenir l'écouteur d'état GPS. En plus de l'état GPS, nous devons également surveiller un service
qui est : LocationListener, un écouteur de positionnement qui surveille les changements de localisation. Ceci est très important pour les applications fournissant des services de localisation.

5. Écouteur LocationListener

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)       {    
            }
        }
    };

Le rappel d'écoute de localisation est une méthode utilisée pour rappeler automatiquement lorsque la position GPS change. Nous pouvons obtenir les données GPS actuelles à partir d'ici. De plus, nous pouvons obtenir les informations de localisation GPS, notamment la longitude et la latitude, la vitesse, l'altitude et d'autres informations grâce au paramètre de localisation fourni par la fonction de rappel.

6. Obtenir des informations de localisation géographique (latitude et longitude, nombre de satellites, altitude, état de positionnement)

//location对象是从上面定位服务回调函数的参数获取。
mLatitude = location.getLatitude();   // 经度
mLongitude = location.getLongitude();  // 纬度
mAltitude = location.getAltitude();   //海拔
mSpeed = location.getSpeed();       //速度
mBearing = location.getBearing();    //方向

7. Obtenir des informations satellite spécifiées (angle directionnel, angle d'altitude, signal-). rapport signal/bruit)

//temgGpsSatellite就是我们上面保存的搜索到的卫星
//方向角
float azimuth = temgGpsSatellite.getAzimuth();
//高度角
float elevation = temgGpsSatellite.getElevation();
//信噪比
float snr = temgGpsSatellite.getSnr();

En utilisant l'angle de direction et l'angle d'altitude, nous pouvons dessiner une figure bidimensionnelle pour indiquer la position du satellite sur la terre, et le rapport signal/bruit a un effet plus important. Le logiciel général de test de positionnement par satellite fournit un diagramme d'état du rapport signal/bruit, représentatif de la capacité de recherche d'étoiles du module GPS.


8. Dessinez une carte de position satellite en deux dimensions
Voici le rendu du test GPS que j'ai effectué :

Android GPS定位测试(附效果图和示例)

Ce qui suit est une méthode de calcul de la position du satellite sur la carte bidimensionnelle basée sur l'angle de direction et l'angle d'altitude. Le point vert sur le côté gauche du rendu ci-dessus représente la position du satellite.

L'histogramme du rapport signal/bruit à droite représente la capacité de réception du signal du satellite.

//根据方向角和高度角计算出,卫星显示的位置
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就是你需要绘画卫星图的起始坐标

La peinture du rapport signal/bruit n'est qu'une conversion d'unité, donc je ne donnerai pas le code ici.

9. Résumé :
Android nous fournit des services de localisation très pratiques, principalement via GpsStatus, LocationManager et GpsSatellite pour mettre en œuvre les services et la surveillance associés.

Cependant, je pense personnellement qu'il serait très pratique si les données NMEA pouvaient être lues directement. Au moins pour certaines applications, plus d'informations peuvent être obtenues.


Pour plus d'articles sur les tests de positionnement GPS Android (avec rendus et exemples), veuillez faire attention au site Web PHP chinois !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn