MapInfo Pro用户长期以来一直使用MapBasic脚本语言来自动化任务、构建自定义应用程序、创建Pro的特定领域自定义、将Pro与其他工具集成等。
MapBasic主要是一种编译语言,这对非程序员来说有点障碍。
我们确实有MapBasic窗口,它允许MapBasic语句和代码直接执行(“解释”),这非常有用。然而,与编译的MapBasic相比,它确实有许多限制,例如不支持控制语句,并且不可调试。最近,我们一直在改进解释MapBasic,甚至通过新的SQL窗口扩展它的使用。我们将继续这样做。
MapBasic一直是Pro在我们的用户中取得成功的关键之一。
那么,为什么是Python?
这篇文章将解释2019.1的理由、方向和内容。接下来的文章将展示如何使用Python以及如何入门。
这是怎么一回事?
Python也是一种解释性脚本和编程语言,在所有领域都有广泛的支持和使用。
学习起来又快又容易。
从Python.org网站:https://www.python.org/
任何其他语言的经验丰富的程序员都可以很快学会Python,初学者发现干净的语法和缩进结构很容易学习。
Python是一种功能齐全的语言,用于从编写Pro等应用程序到创建网站,再到数据科学分析和可视化的所有方面。因此,有许多可用的库和资源可以帮助您。Python.org是开始学习更多知识的好地方。
大多数大学毕业后从事任何计算机课程工作,甚至GIS的学生都已经接触过Python。
有一种更强大、更广为人知、更常用的Pro脚本语言可以调试,这将帮助许多现有用户,并有望吸引更多用户。这是对MapBasic向前移动的补充。
从Pro 17.03版本开始,我们启用了在Pro中使用Python创建插件或应用程序的功能。虽然这是一个很好的第一步,我们确实收到了一些兴趣,但除了经验丰富的python开发人员之外,这实际上太难设置了。
我们为MapInfo Pro 2019.1做了什么?
从Pro 2019.1开始,我们正在努力使Python成为Pro中的一流脚本语言。我们还使通过Python创建外接程序变得更加容易。
首先,Python 3.7现在已与Pro一起安装。它是一个可选组件,因此如果您不需要它,可以通过自定义安装将其关闭。(如果是这样的话,现在就停止阅读…)
Pro默认安装几个众所周知的Python库,如numpy、scipy、seaborn、panda、matplotlib、osgeo/gdal、ptvsd、mi_py_debugger。可以根据需要添加和删除其他模块。
在Pro中运行python代码
现在,您可以通过“运行程序”对话框打开并运行python文件(*.py)。这使用了mapbasic语句“run application”file.py。它也可以从mapbasic窗口或编译的mbx中调用。
在未编译MapBasic的情况下创建外接程序
现在,您可以仅使用Python创建外接程序。外接程序与脚本的不同之处在于,它保持加载状态,并且可以添加ui项,如功能区、上下文菜单和停靠窗口。请注意,stock.mbx是在后台自动生成的。
注册基于Python的外接程序
现在,您可以注册并自动加载.py文件加载项。
调试脚本和加载项
python脚本和加载项都可以调试。我们建议并解释如何使用免费的Visual Studio代码应用程序进行此操作。
Python控制台
您可以使用任何Python IDE来开发代码,但我们通过MapInfo Marketplace提供了一个小型Python控制台,以帮助交互式编辑和运行小型Python脚本。它支持语法高亮显示和智能感知。
访问Pro的对象模型
除了MapBasic语句之外,MapInfo Pro还有一个向MapBasic和公开的对象模型。NET开发人员可以轻松地自定义功能区、添加上下文菜单、创建停靠窗口、映射小工具栏等。它还有许多事件,当用户或Pro执行诸如打开工作区或表、进行选择、运行命令等操作时,您可以得到通知。
通过使用Python.NET实现中,我们能够非常容易地将整个对象模型公开给Python代码,甚至支持intellisense。ExtensibilityReference是一个记录对象模型的帮助文件,现在与Pro一起安装(除了与MapBasic一起安装)。发行说明中的Python信息已集成到ExtensionReference中。
随着我们继续扩展对象模型,它将有助于MapBasic。NET和Python脚本/开发人员。
通过Python打开Native和NativeX表
Python安装中包括Osgeo,它包含GDAL——一个众所周知的用于读取和写入地理空间数据的开源库。我们包含了一个名为EFAL的新gdal驱动程序,它是公开的,可以读写Native和NativeX表,这使得与其他python或第三方工具的交互更加容易。
Startup.py
如果发现startup.py文件在全局作用域设置中执行。类似于startup.wor的查找方式。
Python入门
MapInfo Marketplace还提供了一款名为“PythonQuickStart”的应用程序,其中包含一些示例代码和一些关于在Pro中开始使用Python的参考信息。现在它是可用的,但没有我们想要的样品数量。我们将在不久的将来对其进行改进和更新。
Python脚本的快速示例
这是迄今为止我们在MapInfoPro中使用Python的原因和内容的总结。
下面是一个自动化脚本示例:
这是我们正在讨论的那种自动化的一个很好的例子。
如果您需要帮助,请私信给我。
花了大约一个小时使用MapInfo Marketplace中PythonQuickStart插件附带的一些示例数据创建了这个。
它在一组列上创建一个范围主题,并根据列名将其导出为jpg文件。
我使用MapBasic窗口将主题语句和保存窗口作为语句进行回显,然后将它们添加到我的Python脚本中。
Here is the script:
### Description: Shows how to automate the export of multiple themes to jpg
### Category: Mapping
import os
import time
try:
# open workspace with our map
modulePath = get_current_module_path()
table = os.path.abspath(os.path.dirname(modulePath) + r"\..\Data\Demographic_exampleX.TAB")
do('open table "{}" as demographic'.format(table))
# create list of columns to them on
themeColumns = [
'Age_0_4_P',
'Age_5_9_P',
'Age_10_14_P',
'Age_15_19_P',
'Age_20_24_P',
'Age_25_29_P',
'Age_30_34_P',
'Age_35_39_P',
'Age_40_44_P',
'Age_45_49_P',
'Age_50_54_P',
'Age_55_59_P',
'Age_60_64_P',
'Age_65_69_P',
'Age_70_74_P',
'Age_75_79_P',
'Age_80_84_P',
'Age_85_89_P'
'Age_90_94_P',
'Age_95_99_P',
'Age_100_yr_over_P',
'Age_Total'
]
for col in themeColumns:
# open map window and zoom
do('map from demographic width 4 units "in" height 4 units "in" floating')
do('set map window frontwindow() zoom entire')
# create the thematic
do('shade window frontwindow() 1 with {} ranges apply all use color Brush (2,16777168,16777215) 0: 10 Brush (2,16777168,16777215) Pen (1,2,0) ,10: 16 Brush (2,11591824,16777215) Pen (1,2,0) ,16: 21 Brush (2,5296240,16777215) Pen (1,2,0) ,21: 30 Brush (2,2146448,16777215) Pen (1,2,0) ,30: 80 Brush (2,27552,16777215) Pen (1,2,0) default Brush (2,16777215,16777215) Pen (1,2,0) # use 1 round 0.1 inflect off Brush (2,16744640,16777215) at 3 by 1 color 1 # '.format(col))
# export map to jpg using column name
dir = os.path.join(os.path.dirname(modulePath),'Output')
if not os.path.exists(dir):
os.mkdir(dir)
file = r'{}\{}.jpg'.format(dir,col)
do('Save Window frontwindow() As "{}" Type "JPEG" Width 4 Units "in" Height 4 Units "in" Resolution 120'.format(file))
# close the map window
do('close window frontwindow()')
# clean up
do('close table demographic')
except Exception as e:
print("Error: {}".format(e.__cause__))
这是文件资源管理器中输出的图片:
只要付出一点额外的努力,我们就可以将地图放入带有标题、图例、比例尺等的布局中,并将其导出为图像或.pdf。