#
apache gzip 配置 2009-08-31 10:38:15 标签:apache 配置 gzip 版权声明:原创作品,谢绝转载!否则将追究法律责任。 1、conf/httpd.conf 1) 去掉#LoadModule headers_module modules/mod_headers.so前面的注释#, 2) 添加LoadModule deflate_module modules/mod_deflate.so, 3) 去掉#Include conf/extra/httpd-vhosts.conf前面的注释#。 2、conf/extra/httpd-vhosts.conf 在VirtualHost中添加 <Location "/"> SetOutputFilter DEFLATE BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary Header append Vary User-Agent env=!dont-vary </Location> 例如: <VirtualHost *:80> DocumentRoot "D:/Apache2.2/htdocs/wef" <Location "/"> SetOutputFilter DEFLATE BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary Header append Vary User-Agent env=!dont-vary </Location> </VirtualHost> 注:我使用的apache版本为2.2.13。
编辑qt.conf 添加如下信息 [Paths] Pluggins=plugins 拷贝qt/bin/plugins到当前目录
1.static方法可以不要参数,和C/C++,java里面的静态函数相似 2.普通对象函数至少需要一个self参数,该参数命名可以是‘self’,也可以是其他。代表类实例对象 3.class方法至少需要一个cls参数,该参数命名可以是‘cls’,也可以是其他。代表类对象
找了台快速的公网机器来做 演示(网通线路访问还是很慢): http://wallizard.vicp.net/maps/test/test_map.html http://wallizard.vicp.net:8080/
提供ftp下载 swmap.demo.2010.11.20.7zftp://122.227.135.172:8502 user: mapdown passwd: mapdown demo包含c/s,b/s功能和全国地图数据,共170M左右,可以直接架设起一台wms地图服务器
swMap提供基础的Gis发布功能,目前swMap提供c/s,b/s两种服务功能,b/s也就是webgis,
apache+openlayers+swGisServer服务器构成了webgis的地图支持体系。
c/s模式现仅提供基于Qt的C++开发接口,c/s模式可以是本地渲染地图(可用于单机导航,支持win32,wince,linux),也可以rpc方式访问地图服务器,之间采用特殊的通信协议。 演示: http://wallizard.vicp.net/maps/test/test_map.html 这是adsl主机,上行出口比较窄,所以显示地图会慢很多
Demo下载:http://wallizard.vicp.net/maps/swmap.demo.2010.11.20.7z demo包含c/s,b/s功能和全国地图数据,共170M左右,可以直接架设起一台wms地图服务器
系统结构:
1. c/s 配置: 1.1 单机模式: a.) 修改swBox/swbox.xml参数 EnableTileCache = false cachethreads = 3 asyncRender = true b.) 运行swBox/swbox.exe 1.2 Rpc模式(地图与客户应用分离) a.) 修改swbox.xml参数 EnableTileCache = true cachethreads = 3 asyncRender = true 增加<tileservers/>的子条目 <server>TileServer:tcp -h localhost -p 5000</server> -h 地图服务器主机地址 ; -p 服务端口。根据实际情况可以配置多个TileServer来提高并发能力 b.)修改Tileserver.xml realRender = true 确保 scales与 swbox.xml的scales保持一致,中间以空格区分 c.)运行TileServer.exe -rpcservice localhost:5000 可以并行启动多个TileServer,同一台主机以端口号区分 d.)运行 swbox.exe 2.b/s 配置 2.1 解压apache2.2.pack_maps.rar到c:\apache2.2.pack 2.2 安装apache2.2 执行C:\apache2.2.pack\http-install.bat 执行C:\apache2.2.pack\http-start.bat 2.3 安装GisServer 编辑tileservers.txt ,增加服务器信息,例如: localhost:5000,localhost:5001 执行wms_start.bat ,服务器默认启动在8000端口开始侦听 2.4 运行 TileServer.exe -rpcservice localhost:5000 为提高并发能力多启动几个Tileserver,并添加到swGisServer的tileservers.txt文件内 swGisServer和TileServer都可以以n x n的方式配置来提高整体 系统的吞吐能力 2.5 修改 c:/apache2.2.pack/web-root/test/test_map.html内的wms服务器的指向,将http://wallizard.vicp.net:8000/wms替换成GisServer运行主机的地址和端口 打开浏览器访问http://localhost:9000/test/test_map.html 3.块缓存 块缓存技术就是预先将全国的地理区域划分成网格按缩放级别绘制并存储起来,待请求到达时直接读取图块并返回(wms,Rpc). 当然这种是最高效的方法 ,但往往时间和空间是相背的,缓存的话虽然能降低对机器的性能要求,但会大大占用存储空间。 缓存技术可以用低配置高带宽的主机提供集群的地图服务。 Tileserver/spliteTiles.py 产生网格缓冲任务,Tileserver.exe -mapcreate 可以进行地图网格预存的工作 4.风格定制: swMap地图当配置成实时模式(非缓存)时,修改mapsld.xml就可以立刻生效绘制效果,但是要重新启动 tileserver服务进程 。 <win7下的微软雅黑字体显示效果颇佳> 5.运行环境: windows xp,2003,win7 安装vc运行环境包 vcredist_x86.exe win7环境下微软雅黑字体 vistaFont_CHS.exe 全国地图数据
bbox 计算中心点 size 组合bbox计算显示精度,根据经度计算网格编号 x,y和缩放级别 有了这些参数通过TileServer(Rpc)请求网格图块 TileServer可以配置成网格文件读取或者是RealRender实时绘制 TileServer判断bbox如果跨越两个网格,且不是实时绘制的话,必须完成两个网格图像的拼接,这样便能实现openlayers的resolution不一定要求跟后端一样的,当然TileServer在产生网格时还是需要去寻找一个最接近的缩放级别(实时绘制没有这个操作)
1 ################################# 2 # swMap Test 3 # scott 4 # 2010.11.19 5 # wallizard.vicp.net sw2us.com 6 ################################# 7 #simplest http server 8 # expose image 9 # 10 11 import BaseHTTPServer,SocketServer,SimpleHTTPServer 12 import time,sys,os,os.path 13 14 15 class MyThreadServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer): pass 16 17 ''' 18 HTTP/1.1 200 OK 19 Cache-Control: private, max-age=30 20 Content-Type: text/html; charset=utf-8 21 Content-Encoding: gzip 22 Expires: Mon, 25 May 2009 03:20:33 GMT 23 Last-Modified: Mon, 25 May 2009 03:20:03 GMT 24 Vary: Accept-Encoding 25 Server: Microsoft-IIS/7.0 26 X-AspNet-Version: 2.0.50727 27 X-Powered-By: ASP.NET 28 Date: Mon, 25 May 2009 03:20:02 GMT 29 Content-Length: 12173 30 ''' 31 ''' 32 Pragma:no-cache 33 Cache-Control:no-cache 34 ''' 35 36 class MyHander(SimpleHTTPServer.SimpleHTTPRequestHandler): 37 def __init__(self,request, client_address, server): 38 SimpleHTTPServer.SimpleHTTPRequestHandler.__init__(self,request, client_address, server) 39 40 def do_GET(self): 41 print self.headers 42 43 f= open('d:/nono.gif','rb') 44 image = f.read() 45 f.close() 46 47 self.send_response(200) 48 self.send_header( 'Server','swMapServer') 49 now = self.date_time_string(time.time()) 50 self.send_header('Date',now) 51 self.send_header('Content-Type','image/gif') 52 self.send_header('Content-Length',len(image)) 53 self.end_headers() 54 55 self.wfile.write(image) 56 57 def run(server_class=MyThreadServer,handler_class=MyHander): 58 server_address = ('', 8000) 59 httpd = server_class(server_address, handler_class) 60 print 'serve on ',server_address 61 httpd.serve_forever() 62 63 64 run()
TileCache从去年开始使用已经有一段时间了,之前是为了配合GeoServer来产生缓存网格块,之后在3-8月份处于停滞状态,到9月份身体开始恢复就重新启动swMap工程,彻底抛弃了GeoServer(效率和安装运行环境不能满足要求)。在使用geoServer期间,采用Tilecache产生了千万的tile图块,默认是存放在文件系统,产生的Tile在备份迁移的时候令我寒心,那么多的文件拷贝每次都要耗费4,5个小时,考虑到这种情况,我自己编写了TileCache的Store Backend,将Tilecache产生的Tile存储进PostGresDB,这样我只要备份DB就可以了。 随即而来的是放弃Geoserver,自己重新开发地图渲染服务器,使用了QT令我效果满意,那再使用那一套GeoServer的东西就不合时宜了,TileCache也是需要绑定Apache+mod_python才能工作,简直太累最了,配置个环境还是不太容易,想想自己只是想提供一个WMS的服务罢了何必那么麻烦呢。 地图服务器也有了,产生CacheTiles也开发了自动化的工具,将全国不同显示比例的图块按256x256规格分别放入多个文件,这样备份起来就快速多了。 之前看过TileCache的代码,那时候只是为了编写一个新的Cache Store backend,现在重新回过头来,我决定抛弃apache,语言还是用python,之前做一个酒店广告投放系统时开发过一个Http代理服务器,所以轻车熟路了,保留其Http服务功能,加上TileCache的WMS服务代码,一个swMap的WMS 服务器就可以诞生了。 端详了一会儿TileCache,发现是多么的简单,几乎不用多修改什么地方就可以完成。 由于我的swMap服务程序提供了预先缓存和实时绘制地图的功能,所以通过Http可以以两种模式进行,当然实时模式是用于调试地图层SLD时派上大用场。 实时绘制的时候我的WMS服务器通过Ice连接到swMap服务器,当缓存访问时我的WMS服务器直接从本地Tile文件中读取,那时多么舒服的事情哪!
1. 修改httpserver+tilecache,使 swMap具有WMS功能,支持openlayers访问 2. 继续增加swBox功能,诸如: 测距、围栏、自定义用户兴趣点、面积计算 3. 缓冲全国图tile到缓存文件,最低比例1:2000,由于是全国性的预先绘制工作,会消耗很大的磁盘空间和处理时间,估计3台4核的PC连续1个星期工作时间 4. 开发基于swBox的基本应用,增加POI搜寻和MapGrab功能(用户可以指定地理范围产生指定显示精度的大幅图像,比如可以抓取1:4000的整个上海城区图到一个jpg文件) 5. 增加矢量运算操作进行道路匹配 6. 增加GPS简易的定位功能,多个移动对象之间的位置拓扑关机的操作,支持轨迹回放和导出功能 7. swBox增加Wince版本
GIS中的计算几何
GIS是一个图形系统,必然会涉及到几何学的理论应用,比如,图形可视化,空间拓扑分析,GIS图形编辑等都需要用到几何
。向量几何是用代数的方法来研究几何问题,首先,请大家翻一翻高等数学里有关向量的章节,熟悉一下几个重要的概念:
向量、向量的模、向量的坐标表示、向量的加减运算、向量的点积、向量的叉积,以及这些概念的几何意义...下面我们将用
这些基本概念来解答GIS中一些几何问题。 1 点和线的关系
点是否在线段上,这样的判断在图形编辑,拓扑判断(比如,GPS跟踪点是否跑在线上)需要用到这样的判断。通常的
想法是:先求线段的直线方程,再判断点是否符合这条直线方程,如果符合,还要判断点是否在线段所在的矩形区域(MBR)内
,以排除延长线上的可能性,如果不符合,则点不在线段上。这种思路是可行的,但效率不高,涉及到建立方程,解方程。
借助向量的叉积(也叫向量的向量积,结果还是向量,有方向的)可以很容易的判断。设向量a=(Xa,Ya,Za) b=(Xb,Yb,Zb)
向量叉积a X b如下:
二维向量叉积的模 |a X b|=|a|*|b|*sinα=|Xa*Yb-Ya*Xb| (α是向量a,b之间的夹角),向量叉积模的几何意义是以向量a,b
为邻边的平行四边形的面积。可以推测:如果两向量共线,向量叉积模(所代表的
平行四边形的面积) 为零 则 |a X b|=|a|*|b|*sinα=|Xa*Yb-Ya*Xb|=0,否则不共线,叉积的模为非零,根据这样条件可以很轻松的判断点和线的关系,避
免了建立方程和解方程的麻烦。
向量叉积的模|AB X AC|=0即可判断C点在AB所确定的直线上,再结合C点是否在AB所在的MBR范围内,就可以最终确
定C是否在AB线段上。关于点和线段的其他关系,都可以通过叉积的求得,比如 判断点在线的哪一侧,右手法则,可以通过a
X b= (Xa*Yb-Ya*Xb)*k中的(Xa*Yb-Ya*Xb)正负来判断。留给大家思考,很简单的,呵呵… 2 线和线的关系 判断两条线段是否相交,在很多拓扑判断和图形编辑 (比如,线的打断来构建拓扑,编辑线对象,叠置分析,面与
面关系的判断等) 中都需要用到线线相交的判断,如果两条线段相交,一条线段的两端点必然位于另一条线段的两侧(不考
虑退化情况,也就是一条线段的端点在另一条线段上,这个很容易判断)
两向量的叉积a X b= (Xa*Yb-Ya*Xb)*k ,分别判断AB X AC的方向与AB X AD的方向是否异号,再判断CD X CA 的方向与CD X
CB的方向是否异号,即可判断两线段是否相交。
退化情况,即一条线的端点落在另一条线上。运用”点是否在线段上”的方法来判定。详细区分留给大家思考。呵呵… 利用向量的方向还可以判断线段的转向,这个在道路导航中有所应用: 3 点和面的关系
在各种拓扑判断中(比如,面对象的选取,包含关系的判断等)需要判断一个点是否位于某个面内,经典的方法就是“垂线法
”,在直角坐标系中,从这个点向X轴作射线,判断射线与多边形的交点个数(不考虑退化情况,退化情况下,判断点或者射
线与多边形端点或者边的关系),如果为奇数,则点在面内,为偶数,则点在面外。 4 线和面的关系
线面关系的判断相对比较复杂,线在面内,线和面相交,相离,相接等关系。线段在面内,第一个必要条件是,线段的两个
端点都要在内。但由于多边形可能为凹,所以这不能成为判断的充分条件,于是有第二个必要条件线段与多边形的边,没有
内部交点。
线段和多边形交于线段的两端点并不会影响线段是否在多边形内;但是如果多边形的某个顶点和线段相交,还必须
判断两相邻交点之间的线段是否包含于多边形内部,如果在面内,则线段在面内,否则不在面内。
所以,算法思路如下(本算法引用网络上一篇文章):
if 线段PQ的端点不都在多边形内 then return false; 点集pointSet初始化为空; for 多边形的每条边s do if 线段的某个端点在s上 then 将该端点加入pointSet; else if s的某个端点在线段PQ上 then 将该端点加入pointSet; else if s和线段PQ相交 // 这时候已经可以肯定是内交了 then return false; 将pointSet中的点按照X-Y坐标排序; for pointSet中每两个相邻点 pointSet[i] , pointSet[ i+1] do if pointSet[i] , pointSet[ i+1] 的中点不在多边形中 then return false; return true;
注:X-Y坐标排序,X坐标小的排在前面,对于X坐标相同的点,Y坐标小的排在前面,这种排序准则也是为了保证水平和垂直
情况的判断正确。
1. 点在面内,线段相交情况的判断见上面的思路。
2. 这个过程中的排序因为交点数目肯定远小于多边形的顶点数目n,所以最多是常数级的复杂度,几乎可以忽略不计
。因此算法的时间复杂度也是O(n)。
3. 有了线段和面的关系,再判断折线与面的关系,也就可以for循环,同理进行判断了,但时间复杂度将是O(n^2)。
后面将介绍一种时间复杂度为O(nlogn)的”平面扫描算法”。
5 面和面的关系
面面的空间关系,可能要更复杂一些,在拓扑判断,多边形叠置分析,面对象的编辑中,有着广泛的应用。这个将在以后的
章节中介绍一种时间复杂度为O(nlogn)的算法“平面扫描算法”。 6 点到线段的距离 点到线段的距离,在各种测量,拓扑判断(比如,线对象的选取中需要比较距离)中都需要用到。大家对点到直线的
距离,都很熟悉,那点到线段距离又该如何计算呢? 问题的关键是判断a、r的角度,向量的点积能判断一个角是钝角还是锐角,先复习一下向量的点积,也叫向量的数
量积,结果是一个数,没有方向。设向量a=(Xa,Ya,Za) b=(Xb,Yb,Zb)
a . b=|a|*|b|*cosα=Xa*Xb+Ya*Yb+Za*Zb 向量点积的几何意义是,高中物理中,求作用力在一个方向上所作的功。如果a .
b>0,则α为锐角,a . b<0,则α钝角。
熟悉了利用向量的点积来判断角度,AC·AB 判断夹角a,BA·BC判断夹角r,即可确定三种情况中,具体是哪一种。至于第一种
情况,求点到垂足的距离,可以饶开建立方程求垂足,再求两点距离的思路,因为建立方程运算是复杂的,多耗了CPU资源。
利用向量叉积的几何意义来求,向量的叉积表示以两向量为邻边的平行四边形的面积,|AC X AB|为⊿ABC的面积的两倍,求
平行四边形的高,只要用面积除以底边AB的长度。即,高CD的长度=|AC X AB|/distance(AB)。
这些复杂的几何判断,都将在空间索引的过滤下,在少量数据集(侯选集)上进行。计算几何算法,通常是比较复杂,比较耗
CPU资源,而且还要考虑各种退化情况,在这里,并不试图向大家穷举各种情况,只想起一个抛砖引玉的作用, 或许还有人
会有这样的疑虑:有没考虑“投影”的问题?关于投影将在相应的章节中给予解释,但有一点是可以肯定的,空间分析、计算
几何算法,都是在平面直角坐标系下运算的,不会在球面上。
|