麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

QGIS如何获取用户的当前位置?

最近小编在使用各种互联网地图的时候发现,基本都可以打开地图软件后自动定位到用户的位置,而作为专业的GIS软件,QGIS这类工具中好像并没有内置此类功能,于是小编决定想办法实现这个小功能。

实现原理

关于设备的定位,小编在之前的文章中分享过,简单的总结一下,技术路线有两类:

  1. 使用 GPS 设备,获取经纬度信息
  2. 使用IP定位

小编测试了几次在QGIS中调用一直没有成功,本文先介绍使用IP地址获取位置的方法,关于IP定位可以参考小编之前的文章:

QGIS Python API 实现

有了技术路线,后面的过程就是写代码了。主要分三步:

  1. 获取用户IP地址
  2. 获取IP地址对应的位置信息
  3. 将位置信息添加到地图上,并缩放

代码如下:

from qgis.PyQt.QtWidgets import QMessageBox
from qgis.core import QgsProject, QgsVectorLayer, QgsFeature, QgsGeometry, QgsPointXY, QgsCoordinateReferenceSystem
import requests

def locate_by_ip():
    try:
        # 获取当前IP地址
        ip_response = requests.get('https://api.ipify.org?format=json', timeout=5)
        ip_address = ip_response.json()['ip']

        # 通过IP获取地理位置信息
        geo_response = requests.get(f'http://ip-api.com/json/{ip_address}')
        geo_data = geo_response.json()

        if geo_data['status'] == 'success':
            lat = geo_data['lat']
            lon = geo_data['lon']
            city = geo_data['city']
            country = geo_data['country']

            # 创建临时图层显示位置
            layer_name = f"IP_Location_{ip_address}"
            layer = QgsVectorLayer("Point?crs=EPSG:4326", layer_name, "memory")
            provider = layer.dataProvider()

            # 创建点要素
            feature = QgsFeature()
            feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(lon, lat)))
            provider.addFeature(feature)

            # 添加到地图
            QgsProject.instance().addMapLayer(layer)

            # 创建标记并定位视图
            canvas = iface.mapCanvas()
            canvas.setCenter(QgsPointXY(lon, lat))
            canvas.zoomScale(100000)  # 适当缩放级别

            # 显示信息
            QMessageBox.information(iface.mainWindow(), "位置定位", 
                                   f"IP地址: {ip_address}\n"
                                   f"位置: {city}, {country}\n"
                                   f"经纬度: {lat:.4f}, {lon:.4f}")
        else:
            QMessageBox.warning(iface.mainWindow(), "错误", "无法获取位置信息")

    except Exception as e:
        QMessageBox.critical(iface.mainWindow(), "错误", f"发生错误: {str(e)}")

# 执行函数
locate_by_ip()

打开Python Console,并新建一个文件,并交将上万的文件复制到文件中。

运行该文件,即可实现获取当前位置的功能,效果如图:

总结

是不是感觉有点奇怪,是的,定位到USA去了,这是因为小编没有找到国内可以免费使用的IP定位的API,后续小编优化一下,本期只介绍实现简单的实现方法。后续通过GPS的定位方案,小编会继续更新。

相关阅读

麻辣GIS-Sailor

作者:

GIS爱好者,学GIS,更爱玩GIS。

声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子
没有下文

留言板(小编看到第一时间回复)