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,即可工作正常。

使用 nginx+Tilestache 构建瓦片地图

之前有介绍 “使用tilestache构建瓦片地图服务器”,在我们的服务器上使用一段时间后,发现用其作为server,稳定性有一定问题。因此就考虑使用nginx直接提供静态地图文件,而只使用tilestache来生产瓦片。tilestache的瓦片缓存是按照一定的目录规则来实现的,即在url中表现为/layername/level/x/y.png,而在磁盘上存储的方式为/layername/level/umask/x/umask/y.png,所以需要进行rewrite转向。网上搜索后发现已经有人解决了这个问题:

http://andyfiedler.com/blog/using-nginx-to-proxy-tilestache-180/

 

在服务器上,按照上述的修改,即可满足实际需求。

 

使用tilestache构建瓦片地图服务器

Tilestache是一款开源的瓦片地图服务器,其安装和使用较简单,但官方的文档感觉还是偏简单了些。在这儿记录一下最近安装和使用tilestache的方法。

1、 安装

在Ubuntu服务器上安装tilestache还是比较简单的:

sudo apt-get install tilestache python-pil python-gdal

tilestache默认并没有绑定python-pil和python-gdal两个库,若开始只是安装了tilestache,后面可能可能会出现返回空白地图的问题。

2. 使用

tilestache使用时要构建一个cfg的配置文件,同时若采用mapnik来进行渲染,还必须提供每个对应图层的渲染配置文件。

一个简要的配置文件示例如下:

{
  "cache": {
    "name": "Disk",
    "path": "cache/"
  },
  "layers":
  {
   "landuse2005":
        {
        "provider":{"name":"mapnik","mapfile":"landuse2005.xml"}, "projection": "spherical mercator",
        "preview":   {        "lat": 33.4,       "lon": 97.3,        "zoom": 15      }
        },
    "roads":
   {
        "provider":{"name":"proxy","url":"http://tile.openstreetmap.org/{Z}/{X}/{Y}.png"},
	"preview":   {        "lat": 33.4,       "lon": 97.3,        "zoom": 15      }
    }
  }
}

示例中有两个图层,landuse2005采用mapnik进行渲染,roads采用OSM的瓦片并直接进行代理。mapnik的渲染文件入门不易,可以采用tilemill来生成处理。

3. 预制瓦片

上述图层的landuse2005应该预先生成,用户访问时才能提高速度。tilestache同时也提供了一个程序来生成:

tilestache-seed -b 31.8 89.3 36.3 102.3 -c tilestache.cfg -l landuse2005 10 11 12 13 14 15

4. 启动

最简单的方法就是使用tilestache-server来启动对应的服务:

tilestache-server -c tilestache.cfg -i 192.168.13.13

参数比较简单,-i就是要绑定的网络接口,然后用浏览器访问:

http://192.168.13.13:8080/landuse2005/preview.html

 

 

利用shell命令合并分县土地利用数据为一个shape File

为了制图服务的需求,需要将分县的土地利用arcinfo coverage数据合并为一个shape File。
用ogrinfo查看一个县的数据简要信息:
ogrinfo -so id04632323 PAL
Had to open data source read-only.
INFO: Open of `id04632323'
using driver `AVCBin' successful.

Layer name: PAL
Geometry: Polygon
Feature Count: 4065
Extent: (-831725.500000, 2525475.000000) - (-704241.375000, 2614980.250000)
Layer SRS WKT:
PROJCS["unnamed",
GEOGCS["Unknown datum based upon the Krassowsky 1940 ellipsoid",
DATUM["Not_specified_based_on_Krassowsky_1940_ellipsoid",
SPHEROID["Krassowsky 1940",6378245,298.3,
AUTHORITY["EPSG","7024"]],
AUTHORITY["EPSG","6024"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4024"]],
PROJECTION["Albers_Conic_Equal_Area"],
PARAMETER["standard_parallel_1",25],
PARAMETER["standard_parallel_2",47],
PARAMETER["latitude_of_center",12],
PARAMETER["longitude_of_center",110],
PARAMETER["false_easting",0],
PARAMETER["false_northing",0],
UNIT["METERS",1]]
ArcIds: IntegerList (0.0)
AREA: Real (12.3)
PERIMETER: Real (12.3)
ID04632323#: Integer (5.0)
ID04632323-ID: Integer (5.0)

用QGIS打开后,可以发现其ID04632323-ID字段是土地利用的分类代码。而要将这些分县的数据合并,则需要利用ogr2ogr来合并生成。
主要问题:
1. 需要重命名字段,如将这个分类代码重命名为一个共用的名称,比如code。
2. 目录名和分类代码字段名相关,但需要进行大小写转换。
3. 还需要将每个县的目录名称保存到对应的数据库中。

在bash中,大小写转换可以用这个函数,将变量$i转换为大写:
${i^^}

ogr2ogr可以用sql选项来提取不同的字段并重命名:
select AREA as area,PERIMETER AS perimeter,ID04632323-ID as code from PAL
但在测试中,发现其不认这种写法,需要将其用单引号来括起来:
select AREA as area,PERIMETER AS perimeter,‘ID04632323-ID’ as code from PAL

而目录名称也可以通过变量的方式传递到sql中来。

最终命令脚本,要注意其中的引号和转义:
for i in id*;do
ogr2ogr -update -append -sql "select AREA as area,PERIMETER AS perimeter,'${i^^}-ID' as code,\"$i\" as county FROM PAL" landuse.shp $i;
done

ubuntu 14.04下安装和使用ESRI ArcExplorer 9.3.1

ESRI ArcExplorer是一个免费的空间数据浏览软件,也支持LINUX系统(基于JAVA)。

在ubuntu 14.04下安装ESRI ArcExplorer还需要一定的修改,首先需要安装java,openjdk也可以使用,但需要使用6.0版,7.0版执行有问题。

1. 从esri网站上下载linux版本,并解压缩
2. 安装
chmod +x SetupArcExplorer
sudo ./SetupArcExplorer

我选择安装在/usr/local/目录下,即安装在/usr/local/arcgis下,注意在安装过程中,会向JAVA_HOME目录拷贝lib/ext目录,这个目录可以将其移动arcexplorer的自身目录下:
sudo mv /usr/lib/jvm/default-java/lib/ext /usr/local/arcgis/ArcExplorer/lib/

修改/usr/local/arcgis/ArcExplroer/ArcExplorer.sh:
#!/bin/sh
JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk-amd64; export JAVA_HOME
AEJHOME=/usr/local/arcgis/ArcExplorer; export AEJHOME
case `uname` in
Solaris) LD_LIBRARY_PATH=/usr/local/arcgis/ArcExplorer/lib:$LD_LIBRARY_PATH; $
SunOS) LD_LIBRARY_PATH=/usr/local/arcgis/ArcExplorer/lib:$LD_LIBRARY_PATH; e$
HP-UX) SHLIB_PATH=-/usr/local/arcgis/ArcExplorer/lib:$SHLIB_PATH; export SH$
AIX) LIBPATH=/usr/local/arcgis/ArcExplorer/lib:$LIBPATH; export LIBPATH;;
Linux) LD_LIBRARY_PATH=/usr/local/arcgis/ArcExplorer/lib:$LD_LIBRARY_PATH; ex$
*)
esac
PATH=/usr/local/arcgis/ArcExplorer/bin:$PATH; export PATH
/usr/local/arcgis/ArcExplorer/bin/aejava

主要是第二行,添加了JAVA_HOME的定义。

修改/usr/local/arcgis/ArcExplorer/bin/aejava,倒数第二行,即:
JARHOME=/usr/local/arcgis/ArcExplorer/lib/ext

这样应该就可以运行了:
/usr/loca/arcgis/ArcExplorer/ArcExplorer.sh

最好在/usr/local/bin/下创建一个符号连接:
sudo ln -s /usr/local/arcgis/ArcExplorer/ArcExplorer.sh /usr/local/bin/arcexplorer
这样就可以在shell中随时启动了。

参考:Ubuntu下安装ArcExplorer9.3

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)

改变geonetwork的用户加密方式

geonetwork默认的用户密码加密方法是SHA1,但别的多数都是用的MD5,因此需要修改这个算法。

you just have to update the files :
/src/org/fao/geonet/services/login/Login.java
/src/org/fao/geonet/services/user/PwUpdate.java
/src/org/fao/geonet/services/user/Update.java
/src/org/fao/geonet/services/util/MainUtil.java

经过测试,只需要修改前面3个文件,修改完成后,直接运行ant生效。
注意其中的Util.scramble函数应该是处理SHA1加密算法的,可以去除,然后在SQL语句中直接添加为MD5函数就可以了。

参考:
1 http://www.nabble.com/set-pass-without-encryption-algorithms-or-CRYPT,-MD5-algorithm-td19666430.html