Skip to content
本页目录

4.第一个图新地球Python插件

本插件的核心是完成对图新地球PythonAPI的调用及整个插件开发过程的掌握。

通过在图新地球上添加一个指定经纬度的标注来达成上述目的:

此测试插件的实现效果,无对话框界面,点击运行,在地图上添加一个图标

4.1新建插件

打开图新地球桌面端(V4.5.0以上版本),点击【Python插件】下的【新建插件】按钮

  • 键入插件名称“FirstDemo”(建议名称可以见名知意)
  • 选择插件类别“数据处理”(目前有数据处理、分析、业务三个类型,欢迎提出需要的类别给官方)
  • 键入插件描述“这是一个测试的demo,通过代码的形式添加一个点标注到图新地球”
  • 键入插件标签“示例,demo”
  • 选择该插件的图新地球桌面端最低可用版本“V4.5.0”
  • 选择该插件的图新地球桌面端最高可用版本“不限(向上兼容)”(只要没有结构上的大升级,撰写的插件都是可以向后兼容的)
  • 选择插件保存目录“D:\pyprj\添加点标注”

点击【创建】会自动调用PyCharm打开当前新建的项目,如果自动打开失败,请使用PyCharm手动打开对应的项目路径。

image-20230822092424377

PyCharm打开工程后的代码如下:

python
#引入调试库,配置环境后,请将下面注释打开
#import pydevd_pycharm
#设定调试跟踪参数,配置环境后,请将下面注释打开
#pydevd_pycharm.settrace('localhost', port=6666, stdoutToServer=True, stderrToServer=True)

#引入图新地图API
from TXEarthAPI import *

#定义run方法,程序的默认执行入口,方法名称及定义不可修改,否则插件无法正常启动
def run(app):
    #定义三维地球对象
    global globe
    #获取三维地球对象
    globe = TXGlobeControl(app)

4.2撰写业务代码

此处插件的核心业务是在地图的指定位置添加一个标注(Marker)。

逻辑梳理:

  • 添加Marker需要通过图层(Layer)进行添加
  • 得到Layer需要通过添加图层来得到
  • 添加图层需要获取三维地球(地图引擎)Globe
  • Globe对象,插件代码已自动得到

代码撰写逻辑:

  • 添加图层,得到图层对象
  • 定义标注Marker对象,设定位置,文字等属性
  • 添加标注到图层
  • 保存图层

具体代码如下:

python
#引入调试库,配置环境后,请将下面注释打开
#import pydevd_pycharm
#设定调试跟踪参数,配置环境后,请将下面注释打开
#pydevd_pycharm.settrace('localhost', port=6666, stdoutToServer=True, stderrToServer=True)

#引入图新地图API
from TXEarthAPI import *

#定义run方法,程序的默认执行入口,方法名称及定义不可修改,否则插件无法正常启动
def run(app):
    #定义三维地球对象
    global globe
    #获取三维地球对象
    globe = TXGlobeControl(app)
    # 添加一个图层,并得到图层对象
    current_layer = globe.AddLayer("D:/test.kml")
    # 定义一个标注Marker对象
    marker = TXGeoMarker()
    # 定义一个坐标对象TXPoint(中科图新公司所在地:中科院地理信息产业基地)
    position = TXPoint(120.4282760777,31.3251696184, 0)
    # 设定标注的位置
    marker.SetPosition(position)
    # 设定标注的显示文字
    marker.SetText("中科图新(苏州)科技有限公司")
    # 设定标注的名称,一般和显示文字保持一致。
    marker.SetName("中科图新(苏州)科技有限公司")
    # 添加标注到图层
    current_layer.AddMarker(marker)
    # 刷新三维地球,用于确保添加的数据能在地图上显示出来
    globe.Refresh()
    # 保存图层
    current_layer.Save()

4.3调试插件

Python是解释性语言,调试过程就是执行代码时的信息输出。信息输出的方式主要有:

  1. 日志输出:执行过程中的信息直接写出日志,一般会带上时间,信息相对会比较全
  2. 信息弹框:应用程序执行过程中,弹出信息框
  3. IDE控制台输出:不同的IDE工具略有区别,图新地球PythonAPI是通过pyqt进行python代码的解释执行,要直接在IDE控制台输入日志信息,需要IDE能够捕获到pyqt的信息输出。

下面会对三种调试方式做具体的介绍

图新地球PythonAPI撰写的插件,必定包含一个run方法,此方法会作为图新地球解释执行python语言的主方法。无需主动调用

image.png

4.3.1 日志输出调试模式

此模式不需要配置,只需要编码的时候对于关键信息,可疑位置进行信息输出即可。调试版和正式版代码只需要设定信息输出的级别即可,无需额外的代码修改。 良好的编码习惯,必定包含日志输出,便于异常出现时的排查,不论是否配置分布调试,都建议增加此项。

对于日志输出,示例中使用的是python自带的loging库,官方参考文档如下: https://docs.python.org/zh-cn/2/howto/logging.html 调试方法: 选择main主文件

img

右侧出现正在调试的插件名称:

img

点击插件名称,进入到调试状态。

示例代码及效果如下:

python
#引入调试库,配置环境后,请将下面注释打开
#import pydevd_pycharm
#设定调试跟踪参数,配置环境后,请将下面注释打开
#pydevd_pycharm.settrace('localhost', port=6666, stdoutToServer=True, stderrToServer=True)

#引入图新地图API
from TXEarthAPI import *
import logging
# 配置日志输出的模板:时间-文件名称[line:行号]-日志级别:消息
# 示例:2023-08-28 15:15:51,532 - main.py[line:13] - INFO: 开始执行run方法
logging.basicConfig(format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s', filename='log.txt',level=logging.INFO)

#定义run方法,程序的默认执行入口,方法名称及定义不可修改,否则插件无法正常启动
def run(app):
    # 在插件入口的run函数里面开始进行日志输出
    logging.info('开始执行run方法')
    #定义三维地球对象
    global globe
    #获取三维地球对象
    globe = TXGlobeControl(app)

    logging.info('成功获取globe对象')
    # 添加一个图层,并得到图层对象,如果kml对象不存在,则系统会自动创建一个空的kml图层
    current_layer = globe.AddLayer("D:/test.kml")
    # 直接打印一个Layer类型的变量
    logging.info(current_layer)

    # 定义一个标注Marker对象
    marker = TXGeoMarker()
    # 定义一个坐标对象TXPoint(中科图新公司所在地:中科院地理信息产业基地)
    position = TXPoint(120.4282760777,31.3251696184, 0)
    # 设定标注的位置
    marker.SetPosition(position)
    # 设定标注的显示文字
    marker.SetText("中科图新(苏州)科技有限公司")
    # 设定标注的名称,一般和显示文字保持一致。
    marker.SetName("中科图新(苏州)科技有限公司")
    # 添加标注到图层
    current_layer.AddMarker(marker)
    # 刷新三维地球,用于确保添加的数据能在地图上显示出来
    globe.Refresh()
    # 保存图层
    current_layer.Save()

实际日志效果:

image.png

注意:插件模式下,日志输出的信息配置中,filename,可以是绝对路径,也可以是相对路径,如果是下面的相对路径,日志文件是在图新地球目录下的,如图:

python
logging.basicConfig(format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s', filename='log.txt',level=logging.INFO)`

image.png

4.3.2 信息弹框的调试模式

此模式不需要配置,只需要编码的时候对于关键信息,可疑位置进行信息输出即可。调试完成删除掉即可。

此模式会形成执行等待,需要手动点击确认关闭信息弹出后,代码继续执行,循环内部慎重使用该模式进行信息输出

此模式需要引用Tkinter库,Tkinter是Python原生自带的GUI库,安装的时候是可选项。

具体调试模式,同4.3.1 日志输出模式

示例代码及效果如下:

python
#引入调试库,配置环境后,请将下面注释打开
#import pydevd_pycharm
#设定调试跟踪参数,配置环境后,请将下面注释打开
#pydevd_pycharm.settrace('localhost', port=6666, stdoutToServer=True, stderrToServer=True)

#引入图新地图API
from TXEarthAPI import *
from tkinter import messagebox

#定义run方法,程序的默认执行入口,方法名称及定义不可修改,否则插件无法正常启动
def run(app):
    #定义三维地球对象
    global globe
    #获取三维地球对象
    globe = TXGlobeControl(app)

    # 添加一个图层,并得到图层对象,如果kml对象不存在,则系统会自动创建一个空的kml图层
    current_layer = globe.AddLayer("D:/test3.kml")
    # 查看layer对象是否初始化成功
    messagebox.showwarning("提醒", current_layer)

    # 定义一个标注Marker对象
    marker = TXGeoMarker()
    # 定义一个坐标对象TXPoint(中科图新公司所在地:中科院地理信息产业基地)
    position = TXPoint(120.4282760777,31.3251696184, 0)
    # 设定标注的位置
    marker.SetPosition(position)
    # 设定标注的显示文字
    marker.SetText("中科图新(苏州)科技有限公司")
    # 设定标注的名称,一般和显示文字保持一致。
    marker.SetName("中科图新(苏州)科技有限公司")
    # 添加标注到图层
    current_layer.AddMarker(marker)
    # 刷新三维地球,用于确保添加的数据能在地图上显示出来
    globe.Refresh()
    # 保存图层
    current_layer.Save()

image.png

4.3.3 IDE控制台按步调试-pycharm

pydevd-pycharm原理上是一个远程调试工具,通过服务的形式接收日志输出,并显示到控制台。 具体配置过程如下:

首先确保已配置调试环境pydevd-pycharm,具体配置请参考PyCharm和图新地球联合调试

确保代码里面的调试代码已取消注释,如下图

img

1.点击【调试】按钮,等待链接

img

2.图新地球调试

选择main主文件,参考4.3.1

img

右侧出现正在调试的插件名称:

img

点击插件名称,进入到调试状态。

img

此时可一步步的进行调试了。

4.4打包插件

前提条件:代码已调试通过,没问题了,或者自己是复制的已经测试过的代码,则可以直接对插件打包进行安装运行。

1.删除或者注释掉调试代码(经过调试的代码我们无需再保留调试信息了。),如下:

python
#引入调试库,配置环境后,请将下面注释打开
#import pydevd_pycharm
#设定调试跟踪参数,配置环境后,请将下面注释打开
#pydevd_pycharm.settrace('localhost', port=6666, stdoutToServer=True, stderrToServer=True)

#引入图新地图API
from TXEarthAPI import *

#定义run方法,程序的默认执行入口,方法名称及定义不可修改,否则插件无法正常启动
def run(app):
    #定义三维地球对象
    global globe
    #获取三维地球对象
    globe = TXGlobeControl(app)
    # 添加一个图层,并得到图层对象
    current_layer = globe.AddLayer("D:/test.kml")
    # 定义一个标注Marker对象
    marker = TXGeoMarker()
    # 定义一个坐标对象TXPoint
    position = TXPoint(120.4282760777,31.3251696184, 0)
    # 设定标注的位置
    marker.SetPosition(position)
    # 设定标注的名称
    marker.SetText("中科图新(苏州)科技有限公司")
    # 设定标注的名称,一般和显示文字保持一致。
    marker.SetName("中科图新(苏州)科技有限公司")
    # 添加标注到图层
    current_layer.AddMarker(marker)
    # 刷新三维地球,用于确保添加的数据能在地图上显示出来
    globe.Refresh()
    # 保存图层
    current_layer.Save()

2.配置插件按钮图标:

如果想要自定义插件按钮的图标,可以打开插件目录下的icon文件夹,替换里面同名的插件图标即可。 格式:png,大小:30*30

3.打包插件为zip

img

4.5安装插件

在图新地球桌面端中,找到【python插件】菜单下的【插件管理器】

img

点击安装插件,选择打包好的zip即可。

一旦安装成功,后续软件重启,插件也不会消失。

4.6 卸载插件

当前的安装主要用于本地测试,尚未提供完整的卸载功能,如需卸载,请致用户目录下删除对应的插件即可【C:\Users\用户名\AppData\Roaming\LocaSpace\Python\Plugins】