如何在Python中获得精确的android gps定位?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (3)
  • 关注 (0)
  • 查看 (2597)

我尝试用Python获取我的Android手机的GPS位置(使用QPython3应用程序)但似乎Android中有几个LocationProviders:

  • gps:纯gps位置,缓慢,耗能,但非常准确,正是我需要的。
  • 网络: gps和wifi /小区定位的混合,更快,但不太准确
  • 被动:像上面一样但完全不使用gps

问题: 当我运行我的脚本(下面)时,我只得到“网络”提供的位置,这个位置不够准确。

但我找不到强制特定LocationProvider的方法。

代码:

# import needed modules
import android
import time
import sys, select, os #for loop exit

#Initiate android-module
droid = android.Android()

#notify me
droid.makeToast("fetching GPS data")

print("start gps-sensor...")
droid.startLocating()

while True:
    #exit loop hook
    if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
        line = input()
        print("exit endless loop...")
        break

    #wait for location-event
    event = droid.eventWaitFor('location',10000).result
    if event['name'] == "location":
        try:
            #try to get gps location data
            timestamp = repr(event['data']['gps']['time'])
            longitude = repr(event['data']['gps']['longitude'])
            latitude = repr(event['data']['gps']['latitude'])
            altitude = repr(event['data']['gps']['altitude'])
            speed = repr(event['data']['gps']['speed'])
            accuracy = repr(event['data']['gps']['accuracy'])
            loctype = "gps"
        except KeyError:
            #if no gps data, get the network location instead (inaccurate)
            timestamp = repr(event['data']['network']['time'])
            longitude = repr(event['data']['network']['longitude'])
            latitude = repr(event['data']['network']['latitude'])
            altitude = repr(event['data']['network']['altitude'])
            speed = repr(event['data']['network']['speed'])
            accuracy = repr(event['data']['network']['accuracy'])
            loctype = "net"

        data = loctype + ";" + timestamp + ";" + longitude + ";" + latitude + ";" + altitude + ";" + speed + ";" + accuracy

    print(data) #logging
    time.sleep(5) #wait for 5 seconds

print("stop gps-sensor...")
droid.stopLocating()

样本输出(假坐标):

net;1429704519675;37.235065;-115.811117;0;0;23
net;1429704519675;37.235065;-115.811117;0;0;23
net;1429704519675;37.235065;-115.811117;0;0;23

总结: 如何使用Python在Android中获得精确的GPS位置?

在此先感谢大家!

提问于
用户回答回答于

今天我试着做这样的事情,我遇到了一个类似的问题。我一次又一次地得到同样的输出。长话短说,我发现了这个。把这个放在循环的底部应该可以解决这个问题。

droid.ventClearBuffer()

如果你查看最初的POST示例输出,将注意到时间戳都是相同的。清除缓冲区将重置“Location”事件返回的对象。

用户回答回答于

是不是有一行应是“if event['name'] != 'location':” ?

但我在Android 的‘Qpython3' 上尝试上述,显示这一行“‘NoneType' object is not subscriptable"

请问有谁知道为什么吗?谢谢

用户回答回答于

我也有同样的问题。如果你想要将gps作为位置提供程序,可以这样做。

import android, time
droid = android.Android()
droid.startLocating()
print('reading GPS ...')
event=droid.eventWaitFor('location', 10000)
while 1:
    try :
        provider = event.result['data']['gps']['provider']
        if provider == 'gps':
            lat = str(event['data']['gps']['latitude'])
            lng = str(event['data']['gps']['longitude'])
            latlng = 'lat: ' + lat + ' lng: ' + lng
            print(latlng)
            break
       else: continue
   except KeyError:
       continue

扫码关注云+社区

领取腾讯云代金券