QGIS3.6在MAC中打开文件夹速度奇慢

忘记从QGIS3哪个版本开始,在MAC中打开目录对话框就速度奇慢,导致我一开始都是直接将文件的绝对路径直接键入进来,避免打开文件对话框。搜索发现,此bug已有用户汇报了,且给出了一个解决方法:

在系统偏好设置->安全性与隐私->隐私->辅助功能中,将QGIS3.6的选项给去掉即可。

参考:https://gis.stackexchange.com/questions/310280/qgis-very-slow-when-browsing-files-on-macos

全国县市边界数据的处理(1M2017版)

全国地理信息资源目录服务系统上可以下载最新版本(2017年,1:1百万比例尺)的全国各要素基础数据,具体包括:

  • 共77幅DLG数据集,包括全国陆地范围以及台湾岛、海南岛、钓鱼岛、南海诸岛在内的主要岛屿及其临近海域。
  • 包括水系、居民地及设施、公路铁路、行政边界、地名等5个数据集12个数据层。

我们现在就需要其中的行政边界数据,本来以为下载后可以很方便的使用(有点想当然了),经过一番艰苦的处理后,数据终于是可用状态了。

在mac系统下进行了数据处理,使用了gdal/ogr、QGIS3,主要处理过程记录如下。

  1. 将下载下来的77副gdb数据,全部解压到一个目录中,比如1M2017目录,并在其中建立一个shp子目录。
  2. 在shell下,使用ogr2ogr命令,将所有gdb文件转换为一个大的shape文件,注意需要将其中的NAME字段编码转换为UTF8编码(官方是GBK编码)。
  3. 使用ogr2ogr,对合并后的BOUA(面状边界数据)文件根据PAC字段进行再次图形合并(因为默认的分幅会保留大量的正方形),生成output1.shp文件。
  4. output1.shp文件包含了大量了国外数据、海洋数据,这些数据可以通过ogr2ogr再次剔除,即设置PAC字段>100000且不等于250100,然后生成output2.shp文件。
  5. 仔细观察output2.shp文件,发现其中存在大量的拓扑错误(分幅边线的交叉遗留),在QGIS3中使用v.clean工具进行错误检查和处理,生成output3.shp文件。
  6. 对output3.shp文件进行人工错误检查(可借助QGIS3的图形检查工具check validity辅助检查),使用编辑工具(以及高级数字化工具)进行错误修复,主要使用节点编辑工具(删除节点)、多边形合并工具、多边形part删除工具等,最终生成全国(含港澳台)的县级边界数据集boua_cnty.shp。
  7. 使用QGIS3在boua_cnty数据中添加一个虚拟字段pac_city,并将其值定义为floor(PAC/100),然后对其执行dissolve操作,若需要将直辖市也当做一个独立城市边界,则需要单独处理一下四个直辖市的属性(将县区进行合并,主要是天津和重庆),形成全国市级边界数据集boua_city.shp文件。
for i in `ls -d *.gdb`;do ogr2ogr -f "ESRI Shapefile" -lco ENCODING=UTF-8  -append  shp $i;done
ogr2ogr -f "ESRI Shapefile" output1.shp -lco ENCODING=UTF-8 -dialect sqlite -sql "select st_union(geometry) as geometry,PAC,NAME from 'BOUA' group by PAC,NAME order by PAC,NAME" shp/BOUA.shp
ogr2ogr -f "ESRI Shapefile" output2.shp -lco ENCODING=UTF-8 -where "PAC>100000 and PAC<>250100" output1.shp

但这样生成的城市边界仅包括陆地边界,对于内陆型城市,在使用中问题不大,但对于沿海城市,则很多人类活动轨迹可能会超出陆地边界(比如舟山),因此还需要一个融合近海边界的城市边界。手头上有一个2012年版本的含海洋边界的城市边界数据,需要将其海洋边界数据融合到新的全国边界数据集中。

处理过程为:

  1. 对含有海洋边界的数据集bou2012,和最新全国城市边界数据集boua_city,执行difference操作,在QGIS3进行编辑,删除内陆边界中有差异的部分,在沿海边界删除海洋中的小岛(内多边形),同时添加一个虚拟字段pac_city(和boua_city中的字段相同),最终生成海洋城市边界数据集。
  2. 将boua_city数据集和上一步中生成的海洋城市边界数据集执行union操作。
  3. 对union后的数据集,根据pac_city字段执行dissolve操作。
  4. 人工检查最终生成的数据集。

因数据问题,此数据集中不含港澳台的海洋边界。

Window环境下qgis standalone程序开发环境设定

本文假定:
1. 采用qgis官方发布的安装程序(如QGIS-OSGeo4W-2.18.13-1-Setup-x86.exe安装包)
2. 使用默认的安装位置,即C:\Program Files\QGIS 2.18,如指定到其他目录,请修改对应的设定。
3. 假定示例数据目录为D:\QGIS\数据\

第一:设定环境变量

SET OSGEO4W_ROOT=C:\Program Files\QGIS 2.18
SET QGIS_PREFIX=%OSGEO4W_ROOT%\apps\qgis
SET PATH=%QGIS_PREFIX%\bin;%OSGEO4W_ROOT%\bin
SET PYTHONPATH=%QGIS_PREFIX%\python;%OSGEO4W_ROOT%\apps\Python27
SET PYTHONHOME=%OSGEO4W_ROOT%\apps\Python27
SET GDAL_DATA=%OSGEO4W_ROOT%\share\gdal

即在cmd下执行上述命令,若路径不一致,请自行修改。

第二:运行一个样例

# -*- coding: utf-8 -*-
import os,os.path,sys

from qgis.gui import *
from qgis.core import *
from PyQt4 import QtGui

app = QtGui.QApplication([])
QgsApplication.setPrefixPath(os.environ['QGIS_PREFIX'],True)
QgsApplication.initQgis()

main_win = QtGui.QMainWindow()
frame = QtGui.QFrame(main_win)
main_win.setCentralWidget(frame)
grid_layout = QtGui.QGridLayout(frame)

map_canvas=QgsMapCanvas()
grid_layout.addWidget(map_canvas)
map_canvas.setCanvasColor(QtGui.QColor(255,255,255))
layer=QgsVectorLayer(ur'D:\qgis\数据\bou2_4p.shp','border','ogr')

QgsMapLayerRegistry.instance().addMapLayer(layer)
canvas_layer=QgsMapCanvasLayer(layer)
map_canvas.setLayerSet([canvas_layer])
map_canvas.zoomToFullExtent()

main_win.show()
# Need the following statement if running as a script
app.exec_()

可在前述cmd环境下运行python,将此代码粘贴进来运行。

第三,说明:
layer=QgsVectorLayer(ur'D:\qgis\数据\bou2_4p.shp','border','ogr')
这个语句,如目录名称中不含中文,则路径前的u可以移除。当然,也可以这样写:
layer=QgsVectorLayer(u'D:\\qgis\\数据\\bou2_4p.shp','border','ogr')
同时,建议在python下逐行执行来理解代码。

遭遇QGIS的一个crash bug:control feature rendering order

“Control feature rendering order”是QGIS一个很好的特性,特别是在点位密集的时候,若要根据不同属性展示重要性程度的时候。
但在点位数据量较大的时候,会引起QGIS崩溃。之前也遇到了一次,但当时是想办法绕过了(让点位按照真实世界的尺寸进行绘制,从而避免重叠问题)。这次遇到同样的问题,就仔细测试了一下,看看到底是什么问题。
1. 是否是数据格式的问题
原始数据是csv格式,尝试将其转换为shape file以及导入到postgis数据库。发现依旧是崩溃。

2. 是否是数据排序的问题
将原始数据按照期望的顺序进行事先排序,在不选择control feature rendering order时,绘图结果是满足需求了。但选择此绘图特性后,结果依旧。

3. 是否是数据大小的问题
将原始数据逐步缩小数据量,发现在3.05万行-3.1万行之间是个分水岭(大约1M数据量)。3.05万行不崩溃,3.1万行崩溃。说明此问题和内存相关?

4. 是否版本的影响?
尝试了2.18-0,2.18-2两个版本,以及mac sierra 10.12.2, 10.12.3两个版本,不影响测试结果。

5. 是否受操作系统的影响?
在virtualbox虚拟机里的ubuntu 16.04,QGIS 2.14版本,虽然很慢,但不崩溃。

尝试将此bug汇报给qgis开发组,但找了很久file bug的地方,最终发现还需要osgeo的账号,幸亏很久之前注册过账号,找回密码后提交了:

http://hub.qgis.org/issues/16025

BTW:祝新年快乐!

QGIS中TimeManager的一个问题修复

在QGIS中使用TimeManager时遇到一个问题,即满足时空要素要求后,时空数据展示不出来。点击数据的layer查看发现其对应的sql语句大概是:
dbname='citybigdata' host=localhost port=5432 sslmode=disable key='id' srid=4326 type=Point table="qqheat"."milocal" (geom) sql=cast("ts" as character) < '2016-11-09 21:05:00' AND cast("ts" as character) >= '2016-11-09 21:00:00'
将类似的语句直接在psql中发现执行的时候有问题,无法返回结果。但将语句修改一下即可解决:
dbname='citybigdata' host=localhost port=5432 sslmode=disable key='id' srid=4326 type=Point table="qqheat"."milocal" (geom) sql=cast("ts" as text) < '2016-11-09 21:05:00' AND cast("ts" as text) >= '2016-11-09 21:00:00'
即将其中的character改成text即可。
为了使插件工作正常,就需要修改timemanager的代码,使用grep工具找到该代码的位置:

cd .qgis2/python/plugins/timemanger
grep -rnw ‘.’ -e ‘character’

发现是如下代码的问题:

./.git/hooks/pre-commit.sample:26:# printable range starts at the space character and ends with tilde.
./CONTRIBUTING.md:13:* Go to http://www.loc.gov/standards/iso639-2/php/code_list.php and find the 2-character ISO 639-1
./docs/Doxyfile:586:# This tag can be used to specify the character encoding of the source files
./query_builder.py:9:STRINGCAST_FORMAT = ‘cast(“{}” as character) {} \'{}\’ AND cast(“{}” as character) >= \'{}\’ ‘
./query_builder.py:56: return ‘ cast(“{}” as character) LIKE \’%BC\”.format(attr)
./query_builder.py:63: return ‘ cast(“{}” as character) LIKE \’%AD\”.format(attr)
./query_builder.py:79: return ” ‘{}’ {} cast(\”{}\” as character) “.format(val, comparison, col)
./query_builder.py:87: return ” ‘{}’ {} cast(\”{}\” as character) “.format(val, comparison, col)

将具体的代码修改,然后重启qgis,即可工作正常。

QGIS中的标注问题

开始用QGIS调用标注功能(label)时,发现若是multipolygon,则会显示多个相同的标注,导致显示混乱。后来在搜索中发现:

Why does QGIS show too many labels per feature?

使用新的label功能(即在工具条中的标注,而不是在layer-属性中的标注)后则不会产生问题。

感觉旧功能应该彻底移走,在邮件列表中也有相应的计划:

[Qgis-user] Single label on multipart polygon

估计在2.0版本中会实现吧。

QGIS中使用TMS背景数据

在做专题图的时候,经常需要使用一些背景地图(通常是地形地貌数据),而这些背景数据准备起来还特别麻烦:

1. 多数数据有可能涉密,导致很难获取(即使是之前的1:400万地形图,现在网上公开的数据也找不到了!)

2. 数据获取后在配色、标注等方面还需要仔细考虑,也是比较难的。

因此就想到能否利用网上这些公开的地图商的数据作为背景数据,比如google maps、openstreetmap等。

首先想到的WMS服务,QGIS自身支持WMS服务,网上搜索了一些对应的WMS服务提供商,发现最大的问题:速度太慢,而且现在可用的WMS服务也很少。无意中看到TMS服务(tile map server):

发现gdal支持这个,利用一个xml文件就可以将其封装为一个图像文件,可以直接在QGIS中打开,最重要的是速度很快!

openstreetmap的封装xml,参考OSM Help

<GDAL_WMS>
    <Service name="TMS">
        <ServerUrl>http://tile.openstreetmap.org/${z}/${x}/${y}.png</ServerUrl>
    </Service>
    <DataWindow>
        <UpperLeftX>-20037508.34</UpperLeftX>
        <UpperLeftY>20037508.34</UpperLeftY>
        <LowerRightX>20037508.34</LowerRightX>
        <LowerRightY>-20037508.34</LowerRightY>
        <TileLevel>18</TileLevel>
        <TileCountX>1</TileCountX>
        <TileCountY>1</TileCountY>
        <YOrigin>top</YOrigin>
    </DataWindow>
    <Projection>EPSG:900913</Projection>
    <BlockSizeX>256</BlockSizeX>
    <BlockSizeY>256</BlockSizeY>
    <BandsCount>3</BandsCount>
    <Cache />
</GDAL_WMS>

google maps的tms封装文件:

<GDAL_WMS>
<!-- Data is subject to term of use detailed at http://code.google.com/intl/nl/apis/maps/terms.html and
     http://www.google.com/intl/en_ALL/help/terms_maps.html -->

    <Service name="TMS">
        <ServerUrl>http://mt.google.com/vt/lyrs=m&amp;x=${x}&amp;y=${y}&amp;z=${z}</ServerUrl> <!-- Map -->
        <!-- <ServerUrl>http://mt.google.com/vt/lyrs=s&amp;x=${x}&amp;y=${y}&amp;z=${z}</ServerUrl> --> <!-- Satellite -->
        <!-- <ServerUrl>http://mt.google.com/vt/lyrs=y&amp;x=${x}&amp;y=${y}&amp;z=${z}</ServerUrl> --> <!-- Hybrid -->
        <!-- <ServerUrl>http://mt.google.com/vt/lyrs=t&amp;x=${x}&amp;y=${y}&amp;z=${z}</ServerUrl> --> <!-- Terrain -->
        <!-- <ServerUrl>http://mt.google.com/vt/lyrs=p&amp;x=${x}&amp;y=${y}&amp;z=${z}</ServerUrl> --> <!-- Terrain, Streets and Water  -->
    </Service>
    <DataWindow>
        <UpperLeftX>-20037508.34</UpperLeftX>
        <UpperLeftY>20037508.34</UpperLeftY>
        <LowerRightX>20037508.34</LowerRightX>
        <LowerRightY>-20037508.34</LowerRightY>
        <TileLevel>20</TileLevel>
        <TileCountX>1</TileCountX>
        <TileCountY>1</TileCountY>
        <YOrigin>top</YOrigin>
    </DataWindow>
    <Projection>EPSG:900913</Projection>
    <BlockSizeX>256</BlockSizeX>
    <BlockSizeY>256</BlockSizeY>
    <BandsCount>3</BandsCount>
    <MaxConnections>5</MaxConnections>
    <Cache/>
</GDAL_WMS>

同时,在使用TMS服务,如同此blog所言,也要注意其存在如下问题:

1. TMS是分辨率固定的图片文件组合起来的瓦片式图像,因此其图像不能无极缩放(在QGIS感觉是无极缩放,其实不是)

2. Google Maps & OSM 的TMS服务,其投影方式是固定的,投影代码是EPSG:900913(Mercator)

qgis 0.8.1 版本发布

参考:
http://qgis.org/content/view/143/99/

It is our great pleasure to announce the immediate availability of Quantum GIS (QGIS) Version 0.8.1. The release includes numerous bug fixes and stability improvements to the 0.8 code base. QGIS is available is source form, and will be available as binary executables for Microsoft Windows, Mac OS X, and GNU/Linux. All versions can be obtained from our download page. If the version for your platform is not available please check back in a day or two as some packages are still being built. Many thanks to all the developers who worked so hard to make this release a reality.

新特性:

Whats New in 0.8.1
Version 0.8.1 is primarily a bug fix release. Some of the changes include:

* Numerous bug fixes
* Improvements in how segment lengths appear in the measure tool. The current segment length is shown/updated in the list of segments
* Improvement to zoom-in speed for rasters
* Improve line/area measuring behaviour when the user has been informed that they are probably using the wrong projection for the map canvas
* Added tooltips to the scale and coordinate position displays in the status bar
* Removed ugly console on WIN32 when not debugging
* Added icons to all GRASS tools. All GRASS tools are now on the toolbar
* New GRASS modules added to the GRASS toolbox
* The GRASS plugin is now fully internationalized
* Launcher plugin added to core plugins

下载:http://download.qgis.org/qgis/

在QGIS中设置动态投影

QGIS如何自定义投影?如何设置动态投影?
因为一个朋友想在QGIS实现中国地图的显示,如普通教科书上的地图显示方式。

从国家基础地理数据中心下载来的中国行政区划的shp文件,到底应该选择哪种project,才能使它显示如我们常见的中国地图?

通常这种小比例尺地图在中国的投影都是使用的是albers等积投影。而投影的具体参数是:

中央经线105
标准纬线是27和45

而在QGIS中是采用proj4的投影参数定义方式的,就可以这样写:

+proj=aea +lat_1=27n +lat_2=45n +lon_0=105e +x_0=0 +y_0=0 +ellps=clrk66

具体要如何操作呢?
继续阅读“在QGIS中设置动态投影”

qgis-0.8 svn的DEBIAN安装

参考:http://wlxblog.westgis.ac.cn/195/
拷贝qgis-0.7.4的debian目录,按照下面的diff进行修改
debian/control

5c5
< Build-Depends: debhelper (>= 4.0.0), libgdal1-1.3.1-dev (>= 1.2.6-1), libqt4-dev , libcfitsio-dev (>= 2.460-1), libpq-dev | postgresql-dev, libhdf4g-dev (>= 4.1r4-17), libungif4-dev (>= 4.1.0b1-6), unixodbc-dev (>= 2.2.4-6), libxerces27-dev (>= 2.1.0-5), libjasper-1.701-dev (>= 1.701.0-2), libtiff4-dev (>= 3.6.1-1.1), netcdfg-dev (>= 3.5.0-7.1), libgeos-dev (>= 2.0.1-1), dpatch, libgrass-dev (>= 6.0.0-1), libsqlite3-dev, libgsl0-dev, proj, libexpat1-dev

> Build-Depends: debhelper (>= 4.0.0), libgdal1-1.3.1-dev (>= 1.2.6-1), libqt3-mt-dev (>= 3:3.2.1-6), libqt3-compat-headers (>= 3:3.2.3-2), libcfitsio-dev (>= 2.460-1), libpq-dev | postgresql-dev, libhdf4g-dev (>= 4.1r4-17), libungif4-dev (>= 4.1.0b1-6), unixodbc-dev (>= 2.2.4-6), libxerces26-dev (>= 2.1.0-5), libjasper-1.701-dev (>= 1.701.0-2), libtiff4-dev (>= 3.6.1-1.1), netcdfg-dev (>= 3.5.0-7.1), libgeos-dev (>= 2.0.1-1), dpatch, libgrass-dev (>= 6.0.0-1), libsqlite3-dev, libgsl0-dev, proj, libexpat1-dev
26,27c26,27
< Depends: qgis (= ${Source-Version}), libgdal1-1.3.1-dev (>= 1.2.6-1), libqt4-dev , , libcfitsio-dev (>= 2.460-1), libpq-dev | postgresql-dev, libhdf4g-dev (>= 4.1r4-17), libungif4-dev (>= 4.1.0b1-6), unixodbc-dev (>= 2.2.4-6), libxerces27-dev (>= 2.1.0-5), libjasper-1.701-dev (>= 1.701.0-2), libtiff4-dev (>= 3.6.1-1.1), netcdfg-dev (>= 3.5.0-7.1), libgeos-dev (>= 2.0.1-1), libgrass-dev (>= 6.0.0-1), libsqlite3-dev, libgsl0-dev, proj, libexpat1-dev
< Suggests: qt4-designer --- > Depends: qgis (= ${Source-Version}), libgdal1-dev (>= 1.2.6-1), libqt3-mt-dev (>= 3:3.2.1-6), libqt3-compat-headers (>= 3:3.2.3-2), libcfitsio-dev (>= 2.460-1), libpq-dev | postgresql-dev, libhdf4g-dev (>= 4.1r4-17), libungif4-dev (>= 4.1.0b1-6), unixodbc-dev (>= 2.2.4-6), libxerces26-dev (>= 2.1.0-5), libjasper-1.701-dev (>= 1.701.0-2), libtiff4-dev (>= 3.6.1-1.1), netcdfg-dev (>= 3.5.0-7.1), libgeos-dev (>= 2.0.1-1), libgrass-dev (>= 6.0.0-1), libsqlite3-dev, libgsl0-dev, proj, libexpat1-dev
> Suggests: qt3-designer
38c38
< Depends: qgis (= ${Source-Version}), libgdal1-1.3.1-grass (>= 1.2.6-0)

> Depends: qgis (= ${Source-Version}), libgdal1-grass (>= 1.2.6-0)

debian/qgis-dev.install

17a18
> usr/lib/qgis/designer/*.*a

debian/qgis.install

0a1
> usr/bin/gridmaker
2c3
< usr/lib/libqgis_*.so.* --- > usr/lib/libqgis.so.*
15a17
> usr/lib/qgis/designer/*.so

debian/rules

35c35
< --with-qtdir=/usr/share/qt4 \ --- > –with-qtdir=/usr/share/qt3 \