遭遇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

具体要如何操作呢?
Continue reading “在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 \

qgis 0.8svn版本的debian式安装

前面已经用checkinstall制作了qgis 0.8svn版本的deb包,现在或许我们可以用更加debian化的方式来进行打包:
首先更新代码:
svn up
然后从www.debian.org或debian gis下载qgis 0.7.4的DEBIAN包,解开,然后拷贝其中的debian目录到qgis 0.8svn目录下。
进行修改:

1. 删除patches下的两个文件,这两个patch已经都没有用了,或许不删除也没有关系,打包时并没有调用。
2. 修改control文件,调整qt3为qt4,调整对应的软件包,包括gdal等。
3. 修改rules文件,调整对应的编译参数,或者添加你想使用的参数。
4. 修改三个*.install文件,调整其中对应的目录以及相应的文件,注意不要漏或重复。

然后打包:
dch -i
dpkg-buildpackage -rfakeroot

qgis-0.5.0在debian下的编译

qgis-0.5.0在debian下的安装需要修改以下编译文件。

debian下的qt3是放在/usr/include/qt3的目录下(qt-3.3)
1. install qt3

apt-get install libqt3-dev
apt-get install libqt3-mt-dev
apt-get install libqt3-compat-headers
apt-get install automake1.8

2.modify configure
search qglobal.h
把几个qt的地方换成qt3
3.modify acinclude.m4
同2操作
好象还有一个.sh文件需要修改,$QTDIR变量好象没传进来,直接改为绝对路径就可以了。
4. install

./configure –with-qtdir=/usr –with-postgresql=/usr/local/pgsql/bin
make
make install