2014-03-31 2 views
1

, 나는 액세스 할 위치의 두 가지 방법으로 시도했습니다 내 장치에서 같은 시간에 표시하는 것보다 훨씬 덜 정확 :구글지도 앱이 내 응용 프로그램에서

를 A)을 locationManager 및 GPS_PROVIDER 사용 . 정확도가 50 이하인 경우 처리 할 위치를 수락합니다. 앱은 위치 정보를 받지만 대부분의 시간에는 위치 정보가 제공되지 않습니다. Google지도를 사용하여 시작하면 내 위치 정보가 내 앱보다 정확하고 정확합니다. 위치를들을 수

시작 :

// in service class, function to start listening for locations. 
// class implements android.location.LocationListener interface 
this.locman = (LocationManager) getApplicationContext().getSystemService(LOCATION_SERVICE); 
if(!this.locman.isProviderEnabled(LocationManager.GPS_PROVIDER)){ 
    Log.d("","GPS is not enabled"); 
}else{ 
    this.locman.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); 
    this.onLocationChanged(this.locman.getLastKnownLocation(LocationManager.GPS_PROVIDER)); 
} 
onLocationChanged 기능의

android.location.LocationListener 구현 : 매니페스트

@Override 
public void onLocationChanged(Location location) 
{ 
    ... showing provided Location on the map 
} 

다음은이 관련된 소스의 일부입니다 파일 :

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 

이것은 상대적으로 빈번한 업데이트를 줄 수 있지만 때로는 큰 차이가 있습니다. 충분한 위성과 연결하는 것이 문제 일 수 있다고 생각하지만, 동시에 Google지도를 열면 완벽하게 작동합니다. 위치 업데이트 사이에 시간 차이가 없으며 여기에있는 것보다 더 정확합니다.

Google Play API에 정밀도를 향상시키는 내부 보간/예측/기타가있을 수 있으므로 LocationClient 및 LocationRequest를 대신 사용해야한다고 생각했습니다.

b) LocationClient 및 LocationRequest와 함께 GooglePlay API 사용. Google Play SDK를 설치했으며 Google의 샘플 앱을 사용해 보았습니다. onConnected의

// in service class, function to start listening for locations. 
// class implements com.google.android.gms.location.LocationListener, 
// com.google.android.gms.common.ConnectionResult.OnConnectionFailedListener and 
// com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks interface 
this.locclient = new LocationClient(this.getApplicationContext(),this,this); 
this.locclient.connect(); 

구현 : - onConnected가 호출되는 동안,에 도착하지

@Override 
public void onConnected(Bundle dataBundle) 
{ 
    LocationRequest req = LocationRequest.create(); 
    req.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    req.setInterval(2000); // 2 sec 
    req.setFastestInterval(16); // 60 fps 
    this.locclient.requestLocationUpdates(req, this); 
} 

그리고 물론

이 onConnectionFailed 및 onDisconnected 구현 및 breakpointed 여기이 관련 내 코드입니다. com.google.android.gms.location.LocationListener의

구현 :이 경우

@Override 
public void onLocationChanged(Location location) 
{ 
    ... showing provided Location on the map 
} 

, 나는 그러나 200m 이상의 등에 떨어져, 즉시 업데이트를.

필사적으로 Google Play에있는 MyLocation 앱을 사용해 보았는데 동일한 오프셋이 표시되었습니다!

동시에 Google지도를 사용하면 5-6m와 같은 절대 정확도가 표시됩니다.

중요 공지 사항 : 저는 중국 상해에 있습니다. 이것이 어떤 식 으로든 관련이 있는지 확실하지 않습니다.

Google지도와 Google의 자체 위치 서비스 예제 (google_play_services/samples/maps /에서 제공되는 MyLocationDemoActivity.java) 사이에 어떻게 큰 차이가있을 수 있습니까 ?? Google Play 서비스 샘플 코드와 함께 제공되는 Google의지도 데모는 내 실제 위치와 동일한 오프셋 (~ 200m) 거리를 보여 주며 동시에 Google지도 앱은 정확한 위치를 보여줍니다.

개발 플랫폼으로 Nexus 4를 사용하고 있습니다.

컴파일러는 ADT (Eclipse)입니다. 모든 최신 정보.

정말 빨리 돌파구를 기대합니다 !!! 미리 감사드립니다!

P.

위치 요청에 대한 설정으로 LocationRequest.PRIORITY_NO_POWER를 사용하려고 시도했습니다. 다른 앱이 요청한 경우에만 내 앱이 위치 업데이트를 받도록했습니다. 그런 다음 Google지도를 시작하고 내 앱으로 다시 전환했습니다. 그것은 즉시 위치를 받았다. 내가 시험해보기 위해 long/lat를 http://maps.googleapis.com/maps/api/staticmap?center=31.229179,121.422615&zoom=16&format=png&sensor=false&size=640x640&maptype=roadmap에 복사했는데 동일한 오프셋을 보여줍니다. 휴대 전화의 Google지도에서 정확한 위치를 표시합니다.

Google지도의 오프셋이 가능합니까? 또는 long/lat 오프셋을 받았습니까?

+0

내가 해결할 수있는 유일한 해결 방법은 long/lat 오프셋 보정을 추가하는 것이 었습니다. 최소한 상하이에서 테스트 할 수있는 위치는 다음과 같습니다. double long_off = 0.004535; double lat_off = -0.001779; 나는 실내 (커피 숍 등)뿐만 아니라 광장 (거리, 광장)에서 (alot) 주위를 산책하여 이것을 테스트했습니다. 앱에서받은 long/lat에이 오프셋을 추가하면 http : //maps.googleapis.com/maps/api/staticmap .......에서지도를 열고 올바른 위치를 볼 수 있습니다. 그러나 이것은 실제 해결책과는 거리가 있습니다. – Sinisa

답변

0

저는 아직 답변을 드릴만큼 충분한 평판을 얻지 못했습니다.

이것은 중국 GPS 오프셋 문제와 관련이있을 가능성이 큽니다. 중국 정부는 일부 시나리오 ("국가 보안 무언가")에서 정확한 GPS 데이터를 기록하지 못하게하고 Apple/Google과 같은 업체가 현지 법을 준수하도록 강요합니다. http://www.sinosplice.com/life/archives/2013/07/16/a-more-complete-ios-solution-to-the-china-gps-offset-problem

+0

의견을 주셔서 감사합니다. 흥미로운 점은 Apple지도가 Google지도뿐만 아니라 제대로 작동하는지입니다. 어쨌든 Baidu, Google 및 동일한 GPS 위치에 대한 다른 출처의지도를 비교하고 중국의 원하는 도시에 대한 오프셋을 계산하는 방법을 찾은 제작 도구를 만들었습니다. 오프셋이 모든 도시에서 동일하지는 않지만 재미있는 점은 다양합니다. 그래서 일시적인 해결 방법으로 앱에로드 된 보정 오프셋이있는 일종의 스프레드 시트가 있습니다. – Sinisa

+0

나는 정부가 구글/애플에게 구글의 희망과 일치하는 애플 리케이션을 유지하는 대신에 사용하는 것과 비슷한 데이터 세트를 구글/애플에 제공한다고 생각한다. 나는 너 자신을위한 정확한 단일 장소를주는 것이 좋지만 무언가를 읽었다. 그러나 당신이 걸어 다니거나 운전 한 곳의 정확한 "경로"를 기록하는 것은 허용되지 않는다. 아니면 그런 식으로. – peedee

0

위의 대답으로, 오프셋 때문에 중국 정부의 규제입니다 : 여기

는 주제에 대한 좋은 정보가있는 링크입니다. 그러나 사람들은 적어도 GoogleMaps와 HEREMaps에 의해 사용 된 변형을 관리했습니다. C#으로 작성된 here입니다. 이것을 사용하면 실제 좌표를 최대 20 미터 오류가있는 변환 된 좌표로 변환 할 수 있습니다. 또한보다 정확한 구현이 있습니다.

소프트웨어를 수정하지 않으려면 this을 기반으로하는 것을 사용할 수 있습니다. LocationManager를 사용하는 모든 응용 프로그램의 좌표를 변환하는 것은 내 간단한 Xposed 모듈입니다.