posts - 41,  comments - 90,  trackbacks - 0
  2006年8月17日

Android老大哥安迪鲁宾近日在发布2.3姜饼系统和Nexus S的时候曾演示了最新版本的Google Maps 5.0手机地图,最大的变化就是采用了全3D地图。

在新版手机地图中,矢量图将替换原本的2D画面为用户呈现出全新的3D界面,用户可以自由的转动和缩放。此外用户还将会获得离线地图浏览功能,不用在浏览地图时保持在线状态。

Google现在在其官方手机频道又放出了一段用Nexus S运行新版Maps应用的全功能演示,这款软件将会随Nexus S上市,之后提供其他设备更新,但是对手机硬件有一定的要求,新款800MHz至1GHz处理器且配有专用图形核心的手机才能支持3D视图。



原文见驱动之家
http://news.mydrivers.com/1/181/181818.htm
posted @ 2010-12-12 21:54 天狼 阅读(591) | 评论 (1)编辑 收藏
天地图官方网站提供的二次开发文档和例子过于简单,很多关键信息没有给予说明,例如给出了WFS服务接口,却没有提供详细的开发文档。
不过这并不影响我们的使用,因为OGC WFS规范包含元数据查询命令,通过发送getCapabilities请求,我们可以得知服务器提供哪些WFS服务。

获取WFS服务器元数据
http://search.tianditu.com/wfs?request=getCapabilities
返回信息如下:
<WFS_Capabilities version="1.0.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengeospatial.net//wfs/1.0.0/WFS-capabilities.xsd">
<Service>
<Name>GeoGlobe WFS</Name>
<Title>GeoGlobe网络要素服务器</Title>
<Abstract>武大吉奥信息技术有限公司GeoGlobe网络要素服务器</Abstract>
<KeywordList/>
<OnlineResource>http://search.tianditu.com:80/wfs</OnlineResource>
</Service>
<Capability>
<Request>
<GetCapabilities>
<DCPType>
<HTTP>
<Get onlineResource="http://search.tianditu.com:80/wfs"/>
</HTTP>
</DCPType>
</GetCapabilities>
<GetFeature>
<ResultFormat>
<GML2/>
</ResultFormat>
<DCPType>
<HTTP>
<Get onlineResource="http://search.tianditu.com:80/wfs"/>
<Post onlineResource="http://search.tianditu.com:80/wfs"/>
</HTTP>
</DCPType>
</GetFeature>
<DescribeFeatureType>
<SchemaDescriptionLanguage>
<XMLSCHEMA/>
</SchemaDescriptionLanguage>
<DCPType>
<HTTP>
<Get onlineResource="http://search.tianditu.com:80/wfs"/>
</HTTP>
</DCPType>
</DescribeFeatureType>
</Request>
<VendorSpecificCapabilities/>
</Capability>
<FeatureTypeList>
<Operations>
<Query/>
</Operations>
<FeatureType>
<Name>DOMAIN_POI_NEW</Name>
<Title>DOMAIN_POI_NEW</Title>
<Abstract>DOMAIN_POI_NEW</Abstract>
<Keywords>DOMAIN_POI_NEW</Keywords>
<SRS>EPSG:4326</SRS>
<LatLongBoundingBox minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0"/>
</FeatureType>
<FeatureType>
<Name>iso19112:SI_Gazetteer</Name>
<Title>iso19112:SI_Gazetteer</Title>
<SRS>EPSG:4326</SRS>
<LatLongBoundingBox minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0"/>
</FeatureType>
</FeatureTypeList>
<ogc:Filter_Capabilities>
<ogc:Spatial_Capabilities>
<ogc:Spatial_Operators>
<ogc:BBOX/>
<ogc:Equals/>
<ogc:Disjoint/>
<ogc:Intersect/>
<ogc:Touches/>
<ogc:Crosses/>
<ogc:Within/>
<ogc:Contains/>
<ogc:Overlaps/>
<ogc:Beyond/>
</ogc:Spatial_Operators>
</ogc:Spatial_Capabilities>
<ogc:Scalar_Capabilities>
<ogc:Logical_Operators/>
<ogc:Comparison_Operators>
<ogc:Simple_Comparisons/>
<ogc:Like/>
<ogc:Between/>
</ogc:Comparison_Operators>
</ogc:Scalar_Capabilities>
</ogc:Filter_Capabilities>
</WFS_Capabilities>

返回信息包含了WFS服务器的开发单位(武大吉奥),WFS图层的名称(DOMAIN_POI_NEW和iso19112:SI_Gazetteer),支持的逻辑操作符和空间操作符。

继续测试
http://search.tianditu.com/wfs?request=GetFeature&version=1.0.0&typeName=DOMAIN_POI_NEW&BBOX=105.99,29.99,106,30
返回
<wfs:FeatureCollection xsi:schemaLocation="http://www.opengis.net/wfs WFS_Basic.xsd http://www.geostart.com.cn/geoglobe describe.xsd">
<gml:boundedBy>
<gml:Box>
<gml:coordinates>-180.0,-90.0 180.0,90.0</gml:coordinates>
</gml:Box>
</gml:boundedBy>
<gml:featureMember>
<DOMAIN_POI_NEW>
<OID>6764930</OID>
<Geometry>
<gml:Point srsName="-1">
<gml:coordinates>105.999183,29.995258</gml:coordinates>
</gml:Point>
</Geometry>
<DOMAINNAME>梅子村</DOMAINNAME>
<DOMAINCODE>1CHN50022400000130172</DOMAINCODE>
<NLEVEL>16</NLEVEL>
<X>105.999183</X>
<Y>29.995258</Y>
<COLDATE/>
<NAMETIME/>
<ENDTIME/>
<CLASSID/>
<STANDARDNAME>亚洲中国重庆市铜梁县梅子村</STANDARDNAME>
<TELEPHONE/>
<ADDRESS/>
<KIND>BB80</KIND>
<ZIPCODE/>
<ADMINCODE>500224</ADMINCODE>
<POI_ID>5000000130172</POI_ID>
<PID/>
<DATATYPE>chinapoi</DATATYPE>
<FENAME/>
<locationType>
<SI_LocationType>
<name>DOMAIN_POI_NEW</name>
</SI_LocationType>
</locationType>
</DOMAIN_POI_NEW>
</gml:featureMember>
</wfs:FeatureCollection>

分析返回的GML数据,可知DOMAIN_POI_NEW是地名图层,包含名称、代码、类别码等属性字段。

将图层改为iso19112:SI_Gazetteer,没有返回任何信息,google ISO19112,得到如下解释:
DIN EN ISO 19112-2005 地理信息.通过地理标识符的空间定位 标准号: DIN EN ISO 19112-2005 标准名称: 地理信息.通过地理标识符的空间定位

得到以上信息后,我们尝试使用Openlayers获取,即全国地名数据库。

通过URL(GET方式)访问“天地图”WFS服务,可以使用OpenLayers.Request.GET类,示例代码如下:
   //使用FEATUREID查询

   new OpenLayers.Request.GET( {
        url : "http://search.tianditu.com/wfs?request=GetFeature",
        params: {
            typeName: "DOMAIN_POI_NEW",
            FEATUREID: "DOMAIN_POI_NEW.6649356"
        },
        callback : handler
    });


   //使用BBOX查询

    new OpenLayers.Request.GET( {
        url : "http://search.tianditu.com/wfs?request=GetFeature",
        params: {
            typeName: "DOMAIN_POI_NEW",
            BBOX: "105.99,29.99,106,30"  //map.getExtent().toBBOX()
        },
        callback : handler
    });


说明:
url WFS服务器地址,必须加上?request=GetFeature
typeName 图层名称
FEATUREID WFS的图元ID,采用标准格式: [图层名].[OID编号]
BBOX 指定区域查询,注意不要设置过大,否则浏览器可能失去响应。

通过POST方式访问“天地图”WFS服务,可以使用OpenLayers.Request.POST类,示例代码如下:

    var xmlPara = "<?xml version='1.0' encoding='UTF-8'?>"
            + "<wfs:GetFeature maxFeatures='100' service='WFS' version='1.0.0' "
            + "xmlns:wfs='http://www.opengis.net/wfs' "
            + "xmlns:gml='http://www.opengis.net/gml' "
            + "xmlns:ogc='http://www.opengis.net/ogc' "
            + "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' "
            + "xsi:schemaLocation='http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/wfs.xsd'>"
            + "<wfs:Query typeName='iso19112:SI_Gazetteer' srsName='EPSG:4326'>"
            + "<ogc:Filter xmlns:ogc='http://www.opengis.net/ogc'>"
            + "<ogc:And><ogc:PropertyIsLike wildCard='*' singleChar='.' escape='!'>"
            + "<ogc:PropertyName>STANDARDNAME</ogc:PropertyName>"
            + "<ogc:Literal>*解放碑*</ogc:Literal>"
            + "</ogc:PropertyIsLike></ogc:And></ogc:Filter>"
            + "</wfs:Query></wfs:GetFeature>";
    
    var request = OpenLayers.Request.POST( {
        url : "http://search.tianditu.com/wfs?",
        data : xmlPara,
        callback : handler
    });
};

说明:

url WFS服务器地址

data WFS请求正文,返回的GML由回调函数handler处理

handler负责处理服务端返回的GML数据,也就是矢量化的地图数据,根据应用需求编写代码,获取feature的通用代码如下:
var g = new OpenLayers.Format.GML();
var features = g.read(req.responseText);
for ( var i = 0; i < features.length; ++i) {
   var feature = features[i];
   var geometry = feature.geometry;
   var attributes = feature.attributes;
}

定义过滤条件时请使用STANDARDNAME字段,不要使用DOMAINNAME字段,前者应该有索引支持,而后者没有,查询速度差别很大。

经过测试,typeName="DOMAIN_POI_NEW"和typeName="iso19112:SI_Gazetteer"都能返回结果。由于缺少官方文档说明,不知道这两个图层有何区别。

尝试使用OpenLayers.Protocol.WFS无法访问“天地图”WFS服务,服务器返回: 请求参数[REQUEST]的值为空或不正确。

提醒: 使用POST查询时,页面文件或代码文件务必保存为utf-8编码,如果使用gbk、gb2312编码,汉字地名会变成乱码,导致javascript代码错误。

posted @ 2010-12-10 16:22 天狼 阅读(5887) | 评论 (3)编辑 收藏
国家测绘局2010年10月21日正式发布中国公众版国家地理信息公共服务平台“天地图”,作为中国境内数据资源最全的地理信息服务网站,“天地图”将为公众提供权威、可信、统一的地理信息资源。

“天地图”公开开放了地图数据服务接口,第三方使用者可以直接通过互联网获取地图数据,无需授权认证,在公众服务信息公开方面可以说是一次非常大的进步。
“天地图”的在线服务数据近10TB以下是“天地图”提供的在线地理信息数据资源:

数据类型

数据源

级别

服务地址

线划地图

全球1:100万地理底图

2-10

http://tile0.tianditu.com/services/A0512_EMap

http://tile0.tianditu.com/services/AB0512_Anno

全国1:25万公开版数字地形图

11-12

http://tile0.tianditu.com/services/B0627_EMap1112

全国车载导航

13-18

http://tile0.tianditu.com/services/siwei0608

卫星影像

全球250米卫星影像 (MODIS)

2-7

http://tile0.tianditu.com/services/sbsm0210

全国15米卫星影像 (ETM)

8-10

全国2.5米卫星影像 (P5)

11-14

http://tile0.tianditu.com/services/e11

http://tile0.tianditu.com/services/e12
http://tile0.tianditu.com/services/e13
http://tile0.tianditu.com/services/eastdawnall

地级城市0.6米卫星影像

 (QuickBirdWorldView IWorldView II)

15-18

http://tile0.tianditu.com/services/sbsm1518

数字高程模型

全球90X90米数字高程模型

 

http://tile0.tianditu.com/services/J07098

地名地址

全球1:100万地名地址

 

http://search.tianditu.com/wfs

全国1:25万地名地址


全国车载导航地名地址


除地名地址数据使用OGC WFS协议发布外,其他数据全部采用基于OGC WMS-C协议的分级瓦片形式发布,工作原理类似于谷歌地图和OSM(OpenStreetMap)。

类似谷歌地图,“天地图”为互联网开发人员提供了二次开发API(武大吉奥开发的GeoGlobe二维地图API)。

通过分析GeoGlobe API代码,发现它源自Openlayers,大部分代码除了把Openlayers换成GeoSurf外,没有任何变化。不知道Openlayers项目组就此作何感想。
正因为如此,我们可以参考OpenLayers.Layer.TileCache和OpenLayers.Layer.XYZ类,编写一个专用于读取“天地图”的TDTLayer类,使Openlayers能够直接访问“天地图”的在线地图数据。

“天地图”采用256×256像素,png格式的地图瓦片文件,读取单个文件需要四个参数:T、X、Y、L
T=瓦片(Tile)名称,X=瓦片横向编码,Y=瓦片纵向编码,L=瓦片级别
这个是一个完整的请求示例:http://tile0.tianditu.com/DataServer?T=AB0512_Anno&X=50&Y=12&L=6

天地图”地理信息数据资源列表将地图瓦片分为16级(L=2-18),其中L=2级比例尺最小,对应全球地图。
L=2级只有8个瓦片文件,分别是

 X= 0 1 2 3 0 1 2 3
 Y= 0 0 0 0 1 1 1 1
L=3级有32个瓦片文件,分别是:
 X= 0-7
 Y= 0-3
L=4级有128个瓦片文件,分别是:
 X= 0-15
 Y= 0-7
其余各级以此类推,每级的瓦片文件数比前一级增加4倍,其中线划地图10级以上,卫星地图8级以上只提供中国境内的数据,没有覆盖全球。

查看
GeoGlobe API主代码GeoSurfJSAPI.js文件(相当于Openlayers.js,可以了解X(x_num)、Y(y_num)、L(level)的生成方法,伪代码如下:
level=getLevelForResolution(map.getResolution()); //计算瓦片级别
coef=TopTileSize.w/Math.pow(2,level); //中间系数
x_num=this.pyramid.topTileFromX<this.pyramid.topTileToX?Math.round((bounds.left-this.pyramid.topTileFromX)/coef):Math.round((this.pyramid.topTileFromX-bounds.right)/coef);
y_num=this.pyramid.topTileFromY<this.pyramid.topTileToY?Math.round((bounds.bottom-this.pyramid.topTileFromY)/coef):Math.round((this.pyramid.topTileFromY-bounds.top)/coef);
根据当前分辨率计算地图瓦片级别
function getLevelForResolution(res){
var ratio=map.getMaxResolution()/res;
if(ratio<1)return 0;
for(var level=0;ratio/2>=1;)
{level++;ratio/=2;}
return level;
}

经过简单测试,“天地图”和谷歌地图在数据上差别不大,二次开发方面借助于强大的Openlayers地图客户端引擎不会弱于Google Map API,唯独在速度上与谷歌地图存在较大差距,特别是地图放大到13级-18级时,延迟变得非常明显,有时甚至无法显示。
使用Firebug跟踪运行发现,大约1/3的地图瓦片请求超时,导致客户端读取失败。
“天地图”目前还处于测试阶段,希望相关单位继续改进和提升服务器端性能,快速稳定的响应大量客户端发出的并发请求。
测试中发现,“天地图”开放的地图数据服务接口从tile0.tianditu.com一直到tile7.tianditu.com。依次ping 这8个服务接口,tile1到tile7的响应速度相对较快。修改客户端js代码,将瓦片地图请求平均发送给tile0到tile7 八个服务接口,可以有效加快地图显示速度。“天地图”提供的GeoSurfJSAPI.js中已经包含相关代码,通过给Layer的mirrorUrl属性赋值,可以均衡读取指定的多个服务接口,代码如下:
                        var layer3 = new GeoSurf.Layer.GlobeTile("siwei0608", "http://tile6.tianditu.com/services/siwei0608", {
                                transitionEffect: "resize",
                                topLevel: 13,
                                bottomLevel: 18,
                                maxExtent: new GeoSurf.Bounds(100, 27, 110, 34),
                                mirrorUrls: [
                                    "http://tile1.tianditu.com/services/siwei0608",
                                    "http://tile2.tianditu.com/services/siwei0608",
                                    "http://tile3.tianditu.com/services/siwei0608",
                                    "http://tile4.tianditu.com/services/siwei0608",
                                    "http://tile5.tianditu.com/services/siwei0608",
                                    "http://tile6.tianditu.com/services/siwei0608"
                                ]
                            });

客户端使用上述读取策略后,即便放大到17-18级,整幅地图也能够完全显示,速度有明显的提升。


posted @ 2010-12-06 14:06 天狼 阅读(8566) | 评论 (5)编辑 收藏
发布WFS矢量地图

OGC WFS协议定义了地图客户端查询和传送矢量数据的方法,在查询、分析、动态绘图等实际应用中非常有用。MapServer支持OGC WFS 1.0.0和1.1.0规范。

重新定义一个Mapfile文件,命名为ext2.map,内容如下:
MAP

  NAME "vector"
    SHAPEPATH "I://cn_data"
    
    FONTSET fonts.txt
    IMAGECOLOR 255 255 255
    IMAGETYPE agg

    SIZE 800 600
    STATUS ON
    UNITS DD
    EXTENT 115.275 39.2204 117.475 40.9462
   
    OUTPUTFORMAT
        NAME agg
        DRIVER AGG/PNG
        IMAGEMODE RGB
        FORMATOPTION "INTERLACE=false"
        MIMETYPE "image/png"
    END

    PROJECTION
        "init=epsg:4326"
    END

    WEB
        METADATA
            "wms_title"                       "road wms"
            "wfs_title"                       "road wfs"
            "wms_onlineresource"              "http://192.98.151.23/cgi-bin/mapserv.exe?"  #mapserver服务器的url
            "wms_srs"                         "EPSG:4326"   #地图坐标系        
        END
    END

    LAYER
        NAME "road"
        METADATA
            "wms_title"                       "road"
            "wfs_title"                       "road"
            "wms_srs"                         "EPSG:4326"  #图层坐标系
            "gml_include_items"             "all"
            "gml_featureid"                 "id" #必须指定id
        END
        STATUS ON
        DATA "roa_4m.shp"
        TYPE line
        DUMP TRUE
        CLASS
            STYLE
                COLOR "#00FF00"
            END
        END
    END

END

该文件中有两组METADATA标签,是WFS(WMS) Server所需要的,分别是MAP的METADATA标签和LAYER的METADATA标签。
前者是针对整个地图的全局定义,后者是每个图层的元数据定义。

保存Mapfile文件,打开浏览器进行测试
http://192.98.151.23/cgi-bin/mapserv.exe?map=I:/cn_data/ext2.map&SERVICE=WFS&VERSION=1.0.0&REQUEST=GetCapabilities
正常情况下,可以看到以下返回信息
<WFS_Capabilities version="1.0.0" updateSequence="0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-capabilities.xsd">
<!--
 MapServer version 5.2.1 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP OUTPUT=PDF OUTPUT=SWF OUTPUT=SVG SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=ICONV SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI SUPPORTS=THREADS SUPPORTS=GEOS SUPPORTS=RGBA_PNG INPUT=JPEG INPUT=POSTGIS INPUT=ORACLESPATIAL INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE
-->
<Service>
<Name>MapServer WFS</Name>
<Title>road wfs</Title>
<OnlineResource>
http://192.98.151.23/cgi-bin/mapserv.exe?map=I:/cn_data/ext2.map&
</OnlineResource>
</Service>
<Capability>
<Request>
<GetCapabilities>
<DCPType>
<HTTP>
<Get onlineResource="http://192.98.151.23/cgi-bin/mapserv.exe?map=I:/cn_data/ext2.map&"/>
</HTTP>
</DCPType>
<DCPType>
<HTTP>
<Post onlineResource="http://192.98.151.23/cgi-bin/mapserv.exe?map=I:/cn_data/ext2.map&"/>
</HTTP>
</DCPType>
</GetCapabilities>
<DescribeFeatureType>
<SchemaDescriptionLanguage>
<XMLSCHEMA/>
</SchemaDescriptionLanguage>
<DCPType>
<HTTP>
<Get onlineResource="http://192.98.151.23/cgi-bin/mapserv.exe?map=I:/cn_data/ext2.map&"/>
</HTTP>
</DCPType>
<DCPType>
<HTTP>
<Post onlineResource="http://192.98.151.23/cgi-bin/mapserv.exe?map=I:/cn_data/ext2.map&"/>
</HTTP>
</DCPType>
</DescribeFeatureType>
<GetFeature>
<ResultFormat>
<GML2/>
</ResultFormat>
<DCPType>
<HTTP>
<Get onlineResource="http://192.98.151.23/cgi-bin/mapserv.exe?map=I:/cn_data/ext2.map&"/>
</HTTP>
</DCPType>
<DCPType>
<HTTP>
<Post onlineResource="http://192.98.151.23/cgi-bin/mapserv.exe?map=I:/cn_data/ext2.map&"/>
</HTTP>
</DCPType>
</GetFeature>
</Request>
</Capability>
<FeatureTypeList>
<Operations>
<Query/>
</Operations>
<FeatureType>
<Name>road</Name>
<Title>road</Title>
<SRS>EPSG:4326</SRS>
<LatLongBoundingBox minx="80.3869" miny="18.2823" maxx="132.515" maxy="49.6272"/>
</FeatureType>
</FeatureTypeList>
<ogc:Filter_Capabilities>
<ogc:Spatial_Capabilities>
<ogc:Spatial_Operators>
<ogc:Equals/>
<ogc:Disjoint/>
<ogc:Touches/>
<ogc:Within/>
<ogc:Overlaps/>
<ogc:Crosses/>
<ogc:Intersect/>
<ogc:Contains/>
<ogc:DWithin/>
<ogc:BBOX/>
</ogc:Spatial_Operators>
</ogc:Spatial_Capabilities>
<ogc:Scalar_Capabilities>
<ogc:Logical_Operators/>
<ogc:Comparison_Operators>
<ogc:Simple_Comparisons/>
<ogc:Like/>
<ogc:Between/>
</ogc:Comparison_Operators>
</ogc:Scalar_Capabilities>
</ogc:Filter_Capabilities>
</WFS_Capabilities>

在OpenLayers中加载WFS图层

OpenLayers是一个功能强大的Web地图客户端引擎。

接下来,我们利用OpenLayers的OpenLayers.Protocol.WFS类,显示刚才发布的WFS图层,代码如下

       var protocol = OpenLayers.Protocol.WFS({
                    url: "http://192.98.151.23/cgi-bin/mapserv.exe?map=I:/cn_data/ext2.map&", //mapserver地图服务器的url,加上mapfi了文件的路径
                    featureType: "road", //layer的名称
                    srsName: "EPSG:4326", //layer的坐标系
                    geometryName: "msGeometry", //geometry字段的名称
                    featurePrefix: "ms"
                });

以下是全部javascript代码:
        window.onload = function() {
                var map = new OpenLayers.Map('mapdiv', {
                    projection: "EPSG:4326",
                    units: "degree"
                });
                
                var roads = new OpenLayers.Layer.WMS("road", "http://192.98.151.23/cgi-bin/mapserv.exe?map=I:/cn_data/ext2.map&", {
                    layers: 'road',
                    transparent: 'true',
                    format: 'image/png'
                }, {
                    isBaseLayer: false,
                    visibility: true,
                    buffer: 0
                });
                
                
                var empty = new OpenLayers.Layer("empty", {
                    isBaseLayer: true
                });
                
                var select = new OpenLayers.Layer.Vector("Selection", {
                    styleMap: new OpenLayers.Style(OpenLayers.Feature.Vector.style["select"]),
                    displayInLayerSwitcher: false
                });
                
                var hover = new OpenLayers.Layer.Vector("Hover", {
                    displayInLayerSwitcher: false
                });
                
                map.addLayers([roads, hover, select, empty]);
                
                var protocol = OpenLayers.Protocol.WFS({
                    url: "http://192.98.151.23/cgi-bin/mapserv.exe?map=I:/cn_data/ext2.map&",
                    featureType: "road",
                    srsName: "EPSG:4326",
                    geometryName: "msGeometry",
                    featurePrefix: "ms"
                });
                
                var control = new OpenLayers.Control.GetFeature({
                    protocol: protocol,
                    box: true,
                    hover: true,
                    multipleKey: "shiftKey",
                    toggleKey: "ctrlKey"
                });
                
                control.events.register("featureselected", this, function(e){
                    select.addFeatures([e.feature]);
                });
                control.events.register("featureunselected", this, function(e){
                    select.removeFeatures([e.feature]);
                });
                control.events.register("hoverfeature", this, function(e){
                    hover.addFeatures([e.feature]);
                });
                
                control.events.register("outfeature", this, function(e){
                    hover.removeFeatures([e.feature]);
                });
                
                map.addControl(control);
                control.activate();
                
                map.addControl(new OpenLayers.Control.LayerSwitcher());
                map.addControl(new OpenLayers.Control.MousePosition());
                
                if (!map.getCenter()) {
                    map.zoomToMaxExtent();
                }

            }

在浏览器中运行html页面,国道数据将以矢量方式传送到客户端,由openlayers动态绘制,鼠标移动到道路上或者选中道路,道路将实时改变颜色,在Web上实现与传统桌面GIS应用类似的体验效果。

posted @ 2010-12-01 15:00 天狼 阅读(2510) | 评论 (0)编辑 收藏
在今年的FOSS4G国际大会上,geoserver项目组发布了2.1beta1版本。
新版本增加了多项引人注目的功能,原文如下:

WMS Cascading

Something users have asked for since the addition of WMS support itself is cascading, the ability of GeoServer to proxy for another remote WMS server like MapServer or another GeoServer. This feature has many uses such as pulling in a remote base layer and overlaying local vector data onto it or securing a locally unsecured map server. Special thanks to the University of Perugia for sponsoring this feature.

Read more about WMS cascading.

Virtual Services

Anyone who has published a large number of layers or feature types with GeoServer has probably at some point been annoyed by the fact that every single layer is published by a single global service. WMS has the ability to group and nest layers but WFS and WCS have no such equivalent. Well now with virtual services one can create multiple service endpoints within a single physical geoserver instance.

Special thanks to Landgate for funding this work.

Read more about virtual services.

Layers from SQL

GeoServer has always been good at publishing a flat database table. But users often need to do more such as pre filter the data in a table, or join two tables together, or generate column values on the fly with a function. Before this feature the recommendation was to create a view. However views can be a maintenance burden and are at times problematic.

Now one can create a layer directly from an SQL query. And on top of that query definitions can be parameterized which allows one to create dynamic queries on the fly. These parameters can be restricted with regular expressions in order to prevent an SQL injection security hole.

Special thanks to Andrea for spending much of his personal time on this one. And also to OBIS who provided the funding for the parametric component of the work.

Read more about SQL layers.

WPS

With 2.1 and the arrival of WPS we welcome a new OGC service to the family. The Web Processing Service is an OGC service for performing geospatial analysis functions over the web. The specification is extensible in nature and allows for simple processes like buffering a geometry to more complex processes such as image processing.

Historically GeoServer has been focused primarily on data delivery without any tools for performing analysis of spatial data. WPS fills that gap making GeoServer a more compete solution for geospatial web services.

Thanks to Refractions Research for the initial contribution of the WPS module and to Andrea once again for taking personal time to bring WPS support to its current state.

Read more about WPS. Download the WPS extension now to try it out.

Unit of Measure

Support for units in SLD allows one to specify values in measurements other than pixels such as feet or meters. This adds a very powerful capability to SLD that in many cases alleviates the need for multiple scale dependent rendering rules. This has the upside of greatly simplifying complex SLD documents.

Special thanks to Milton Jonathan who did the initial GeoTools work to make unit of measure support possible and to Andrea for working with Milton to improve the initial patch. Note that this feature has also been backported to the stable 2.0.x branch. Thanks to SWECO and Malmö City of Sweden for sponsoring the backport.

Read more about UOM support.

DPI Scaling

By default GeoServer renders images at a resolution of 90 DPI. While this is acceptable for the standard screen it is not acceptable for print which requires a higher resolution. Now it is possible to supply a format option to a WMS request on the fly that controls the DPI setting.

Special thanks again to SWECO and to Malmö City of Sweden for sponsoring this work. Note also that this feature has also been backported to the stable 2.0.x branch.

Read more about DPI scaling.



posted @ 2010-12-01 10:42 天狼 阅读(1748) | 评论 (0)编辑 收藏
为MapServer添加瓦片缓存服务

国际上有两个比较流行的开源地图瓦片缓存服务器:geowebcache和tilecache。
geowebcache基于J2EE架构,具有完整的Web图形管理界面,支持多进程并发切图,可以随时查看切图进度和剩余时间,搭配geoserver非常合适。
titlecache采用python编写,CGI工作模式,非常小巧,2.11版本只有令人惊讶的68K!(这一点很像MapServer)。
titlecache采用SHELL或DOS命令行方式运行切图程序,实时输出切图进度信息。
mapserver选择titlecache作为地图切片缓存服务器,在ms4w_3.0beta10中包含了tilecache插件,由于beta版本存在问题,
我们在ms4w_2.3.1正式版中手工加入tilecache服务器,具体步骤如下:

1、从tilecache官方网站下载安装包tilecache-2.11.tar.gz,该安装包适用于所有操作系统,我们使用Windows XP。
2、解压安装包,将其中的tilecache-2.11目录整体复制到ms4w的apps目录下。
3、进入ms4w的http.d目录,新建一个名为httpd_tilecache.conf的文本文件,内容如下:
Alias /tilecache/ "/ms4w/apps/tilecache-2.11/"
<Directory "/ms4w/apps/tilecache-2.11/">
  AllowOverride None
  Options ExecCGI
  Order allow,deny
  Allow from all
</Directory>
addHandler cgi-script .cgi .py
4、进入ms4w/apps/tilecache-2.11目录,打开tilecache.cgi文件,修改第一行的python编译器路径,例如
#!E:\Python25\python.exe
5、打开该目录下的tilecache.cfg文件,修改cache标签,指定本地磁盘缓存目录,例如
[cache]
type=Disk
base=F:/tmp/tilecache
添加一个road标签,指定地图服务类型,服务地址,mapfile文件路径,图层名称,栅格格式,空间参考系统编码,例如
[road]
type=WMS
url=http://127.0.0.1/cgi-bin/mapserv.exe?map=I:/cn_data/c2.map&transparent=true&
layers=road
extension=png
srs=EPSG:4326
6、重新启动Apache
7、打开tilecache下的index.html文件,根据实际情况修改openlayers.js的路径,例如
<script src="/openlayers/OpenLayers.js"></script>
修改layer参数,例如
layer = new OpenLayers.Layer.WMS( "road", "tilecache.cgi?", {layers: 'road', format: 'image/png' } );

使用浏览器访问http://127.0.0.1/tilecache,Web页面上将显示经过tilecache处理的地图,客户端浏览过的地图切片文件被保存在tilecache.cfg文件指定的临时目录下,这里是F:/tmp/tilecache目录,如果其中包含客户端正在请求的地图,这些地图将不再通过MapServer动态生成,而是直接从缓存目录读取静态图片文件。对于大用户量、高并发的地图访问,瓦片缓存机制可以非常有效的提高客户端读取、显示地图的速度。

通过执行tilecache_seed.py脚本,可以手动生成地图切片,下面的命令给road图层发布0到6级的地图切片文件。
python "F:\ms4w\apps\tilecache-2.11\tilecache_seed.py" road 0 6
等待执行完毕,进入缓存目录可以找到刚才发布的地图切片文件。


posted @ 2010-11-26 15:45 天狼 阅读(3265) | 评论 (5)编辑 收藏
连接Oracle Spatial

前面的测试中我们使用shape文件作为地图数据源,下面我们将从Oracle Spatial空间数据库读取地理数据。

mapserver提供两种方式连接oracle空间数据库,native oracle spatial和ogr。安装包提供了支持native oracle spatial的二进制文件,ogr方式需要自行编译源代码。借用以往项目的Oracle 10.2.0.3数据库,MapServer采用ms4w_2.3.1已编译包,地图服务器安装Oracle10.2客户端,进行本地网络配置,测试连接正常。

关闭Apache MS4W Web Server服务,进入\ms4w\Apache\cgi-bin\ignored-libmap\oracle11g目录,将libmap.dll复制粘贴到\ms4w\Apache\cgi-bin目录,替换原有文件,启动Apache MS4W Web Server服务。

新建一个Mapfile文件,LAYER部分如下
LAYER
    NAME "road"
    TYPE LINE
    CONNECTION "geouser/123456@geodb" #数据库连接字符串
    CONNECTIONTYPE oraclespatial      #连接类型为oracle spatial
    DATA "GEOLOC FROM NAV_ROAD1 USING SRID 4326"  #此处GEOLOC为GEOMETRY字段名,NAV_ROAD1为表名
    PROJECTION
       "init=epsg:4326" #必须指定SRS编码
    END
    DUMP TRUE
    CLASS
        STYLE
            COLOR 0 128 128
        END
    END
END

DATA标签使用如下格式
"[geom_column]
FROM
[table]| [(SELECT [...]
FROM [table]|[Spatial Operator]
[WHERE condition] )]
[USING [UNIQUE column]| [SRID #srid]| [FUNCTION]| [VERSION #version]
]"
注意:不要在FROM之前加入属性字段名,属性字段可添加在FROM后的子查询中,如下所示



GEOLOC FROM (SELECT MI_PRINX AS OID, NAME AS ONAME, COLOR AS COLOR, GEOLOC AS GEOLOC FROM NAV_ROAD1) USING SRID 4326



LABEL或STYLE用到的属性字段必须包含在SELECT子查询中。







修改openlayers客户端代码



var ms_layer = new OpenLayers.Layer.WMS(



                "Test Map",
                "/cgi-bin/mapserv.exe",
                {   
                    layers: 'road',
                    map: 'I:/cn_data/c2.map',
                    format: 'png'
                },
                {
                    reproject: false,
                    'numZoomLevels': 20,
                    gutter: 15,
                    buffer: 0
                }
            );

打开浏览器,查看效果。

为图层添加标注(Label)


在地图上标注文字,必然涉及到字体,MapServer采用与操作系统无关的设计,不能自动获知当前操作系统下安装了哪些字体,必须手工创建字体集FONTSET文件。
该文件的格式非常简单,每行配置一个字体,左边是字体名(可自由命名),右边是字体文件的路径(请使用绝对路径),如下所示:
arial   C:\WINDOWS\Fonts\arial.ttf
sans    C:\WINDOWS\Fonts\SIMSUN.TTC
将以上内容保存为文本文件,文件名和扩展名不限,例如保存为fonts.txt

在Mapfile的Map标签下添加一行
FONTSET fonts.txt #指明字体集文件,可以包含路径

在Mapfile的Layer标签中添加一行
LABELITEM "NAME"  #指明标注所用的字段名

在Layer下的CLASS标签中添加以下内容
LABEL
    COLOR  0 0 0
    OUTLINECOLOR 255 255 255
    FONT "sans"  #此处sans对应宋体SIMSUN.TTC
    TYPE truetype
    SIZE 6
    POSITION AUTO
    PARTIALS FALSE
    ENCODING GBK #此处为文字编码,如果不设置该值,中文将不能正确显示。对于中文Windows系统,操作系统的默认编码为GBK。
END

注意:ms4w_3.0beta11属于开发版本,支持shape文件数据源配置label标签,不支持oracle spatial数据源配置label标签。
为了读取oracle空间表中的属性生成标签,我们换用ms4w_2.3.1正式版,系统工作正常。

使用动态样式(STYLE)

实际应用中对地图的渲染有很多要求,MapServer支持动态设置STYLE,修改Mapfile文件LAYER的STYLE,例如:
STYLE
    COLOR [COLOR]
END
每条道路的颜色由道路表的属性字段COLOR决定,与之类似,可以从数据库取值填充SYMBOL,SIZE,ANGLE等标签。
提示:MapServer的颜色码可以使用[r] [g] [b]十进制格式,也可以使用Web开发中常用的RRGGBB十六进制格式,例如:#FF0000


posted @ 2010-11-26 12:16 天狼 阅读(2793) | 评论 (1)编辑 收藏
MapServer简介
    在开源WebGIS领域,MapServer的历史和名气都超过GeoServer(20世纪90年代中期,由明尼苏达大学研制),很早就被列入OSGeo项目组。
与GeoServer不同,MapServer用C语言编写,采用传统的CGI架构,融合了Pro4j、GDAL等开源项目。对比J2EE架构的GeoServer,MapServer显得非常精巧,5.6版本的核心部分只有33KB,源代码只有2.2M,包括Apache、Php、Pro4j、GDAL、MapScript在内的完整安装包也只有35M。

安装过程
    和Java一样,C具有良好的跨平台特性,MapServer支持Windows、Linux、Mac OS X等操作系统。

    官方网站对Unix和Windows平台下的源代码安装步骤给出了详细说明。根据说明下载需要的第三方库,然后在Shell命令行模式下编译源代码,对于缺少Unix Shell或DOS操作经验的用户, 这是一件比较头疼的事情。好在MapServer已经考虑到不习惯命令行操作的Windows用户,给出了Windows下的已编译安装包ms4w,目前最新版本是3.0beta11。
   
    ms4w的安装过程很简单,下载ms4w,解压缩到硬盘任意目录(目录名最好不要包含中文字符),打开命令提示符窗口,切换到ms4w所在目录,键入apache-install即可。(提示:如果机器上安装有Apache或IIS,运行apache-install之前,请将它们关闭。ms4w安装后不会和原有的Apache冲突。)

看到如下信息,说明安装成功。
Installing the Apache MS4W Web Server service
The Apache MS4W Web Server service is successfully installed.
Testing httpd.conf....
Errors reported here must be corrected before the service
can be started.
The Apache MS4W Web Server service is starting.
The Apache MS4W Web Server service was started successfully.

安装完成后,使用浏览器访问 http://127.0.0.1/cgi-bin/mapserv.exe,MapServer返回如下提示信息
No query information to decode. QUERY_STRING is set, but empty.

发布地图数据
    类似于Arcgis Server和GeoServer,MapServer采用零代码编写的配置文件方式管理地图发布,配置文件被称为Mapfile,后缀名为map。

    Mapfile有三种编写方式:
    1、参考官方文档Mapfile章节,手工编写
    这种方式要求开发人员对Mapfile的编写规则非常熟悉,否则很容易出错。
    2、类似Arcgis Server和GeoServer提供的Web图形化配置界面,MapServer有一个对应的开源项目MapLab,提供基于Web的图形化配置界面
    不过个人感觉,MapLab的易用性远逊于Arcgis Server和GeoServer。
    3、使用开源桌面平台QGIS,自动生成Mapfile文件
    对于新手,推荐使用第三种方式。

以下是测试用的Mapfile文件,MapServer对Mapfile文件的存放位置没有特殊要求,可以存放在不同的计算机上。

# Mapfile文件必须以MAP开头
MAP
# Map的名字 test
NAME test
STATUS ON
# 地图大小
SIZE 800 600
# Projection definition
# Projections are not currenlty supported. If desired, add your own # projection information based on Mapserver documentation.
# Map的坐标系
PROJECTION "init=epsg:4326"
END

# Map的全图范围
EXTENT 75 15 140 55
# Map的坐标单位 DD表示经纬度
UNITS DD
# Map的背景颜色 白色
IMAGECOLOR 255 255 255
# 生成的图片类型,常用gif或png
IMAGETYPE gif
# shp文件的路径,请使用绝对路径
SHAPEPATH "I://cn_data"
#
# Start of web interface definition. Only the TEMPLATE parameter # must be specified to display a map. See Mapserver documentation
# MapServer内置了地图客户端功能,此处是Web客户端相关设置。
# 由于我们使用Openlayers作为地图客户端,MapServer做为地图服务器,此处不做设置
WEB
# HEADER
# TEMPLATE
# FOOTER
# 最小、最大比例尺等级
MINSCALE 1
MAXSCALE 13
# 设置IMAGEPATH,默认路径如下,请使用绝对路径
IMAGEPATH 'I:/ms4w/Apache/htdocs/tmp'
# 设置IMAGEURL,默认路径如下
IMAGEURL '/tmp/'
END
# 设置图层,一个Map下可以包含多个LAYER
LAYER NAME polyline  # 图层名称,MapServer使用该名称
TYPE LINE # 几何类型
STATUS ON
DATA "roa_4m" # shp文件名,不需要带扩展名,路径在前面的SHAPEPATH项中指定
CLASS NAME "roa_4m" # 类名
# TEMPLATE
COLOR 112 0 0 # 颜色
END
END
END # Map File

客户端测试
    接下来测试刚才建立的Mapfile,在浏览器地址栏中输入 http://127.0.0.1/cgi-bin/mapserv.exe?LAYERS=polyline&MAP=I:/ms4w/Apache/htdocs/my.map&FORMAT=gif&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A4326&BBOX=75,15,140,55&WIDTH=800&HEIGHT=600
大约0.5秒后(初次加载),浏览器显示出中国1:400万道路网,地图发布成功! 熟悉OGC标准的朋友可能已经发现,上面的URL是WMS地图请求。

直接通过CGI请求,得到的是一幅静态地图,为了实现地图的缩放、漫游,我们选用Openlayers地图客户端。 通过OpenLayers.Layer.WMS可以直接调用MapServer地图服务,测试代码如下:
var ms_layer = new OpenLayers.Layer.WMS(
   "polyline", //OpenLayers中的图层名
   "/cgi-bin/mapserv.exe", //MapServer地图服务器的路径
   { layers: 'polyline', //Mapfile中定义的图层名
     map: 'I:/cn_data/my.map', //Mapfile文件的绝对路径,注意必须使用'/'而不是'\',使用相对路径无法显示地图
     format: 'gif' },
   { reproject: false,
     'numZoomLevels': 20,
     gutter: 15,
     buffer: 0 }
);

滚动鼠标滚轮,地图的刷新速度保持在0.5秒以内。MapServer继承了C语言的特点,地图渲染效率很高。

写在最后
    MapServer提供两种工作方式,CGI方式(适用于CGI、AJAX、FLEX开发人员)和MapScript方式(适用于Php、Java、C#、Python开发人员)。以原生CGI方式效率最高,配合TileCache,可以快速生成大范围的地图瓦片数据。比较基于.Net和J2EE的商业或开源平台,MapServer更适合高负荷的大型互联网地图应用。

posted @ 2010-11-24 17:39 天狼 阅读(6692) | 评论 (5)编辑 收藏
OpenLayers.Layer.Google
#2493: Google layer instances with overridden methods may need to be modified, because some methods are now mixed in from OpenLayers.Layer.Google.v2. Affected API methods are
onMapResize,
getMapObjectBoundsFromOLBounds,
setMapObjectCenter,
dragPanMapObject,
getMapObjectLonLatFromMapObjectPixel,
getMapObjectPixelFromMapObjectLonLat,
getMapObjectZoomFromMapObjectBounds,
getMapObjectLonLatFromLonLat and getMapObjectPixelFromXY.
This means that when calling any of these methods on the prototype, the code needs to be changed to call it on OpenLayers.Layer.Google.v2 instead. You would e.g. have to change
OpenLayers.Layer.Google.prototype.onMapResize.apply(this, arguments);
to
OpenLayers.Layer.Google.v2.onMapResize.apply(this, arguments);
OpenLayers.Control.Panel
#2764: OpenLayers.Control.Panel does not change the active state of controls with a type of OpenLayers.Control.TYPE_BUTTON any more. If you want to retain the old behavior, create your panel with an overridden activateControl method like this:
var panel = new OpenLayers.Control.Panel({ activateControl: function(control) { OpenLayers.Control.Panel.prototype.activateControl.apply(this, arguments); if (control.active &amp;&amp; control.type == OpenLayers.Control.TYPE_TOOL) { for (var i=panel.controls.length-1; i&gt;=0; --i) { panel.controls[i].type == OpenLayers.Control.TYPE_BUTTON &amp;&amp; panel.controls[i].deactivate(); } } }
});
New Addins
InlineXhtml - adds support for WMS layers with SVG as image format, for SVG enabled browsers.
posted @ 2010-09-13 12:22 天狼 阅读(537) | 评论 (0)编辑 收藏
openlayers是一个纯javascript的web地图客户端框架,对开发平台的适应性非常强,可以很容易的嵌入静态http页面、asp页面、.net页面、jsp页面、j2ee页面。由于openlayers采用AJAX架构,当地图服务器与web客户端服务器不同时,WMS中的getFeatureInfo,以及所有WFS功能接口不能正常工作。原因是各种浏览器禁止跨域访问xml,解决的办法很简单,使用代理(Proxy)。

根据应用系统架构的不同,代理的实现方式有很多种,包括web服务器内置代理(如Apache)、cgi方式代理、php代理、jsp代理、aspx代理等。
openlayers官方提供了一个采用python编写的cgi代理,推荐在Apache2.2下使用。

openlayers官方代理安装步骤:
1、安装Python2.5,记住安装路径。
2、将openlayers官方提供的proxy.cgi复制到apache的cgi-bin目录下。
修改第一行Python25的安装路径,注意不要去掉最前面的#号。
修改allowedHosts中的geoserver/mapserver ip:geoserver/mapserver port部分。
3、打开conf目录下的httpd.conf文件,修改cgi部分,例如:
<Directory "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin">
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>
AddHandler cgi-script .cgi .py
保存后重新启动Apache,在浏览器地址栏中填入http://apache ip/cgi-bin/proxy.cgi,测试代理是否工作正常。

以下是proxy.cgi的内容:
#!C:\Python25\python.exe
# -*- coding: utf-8 -*-

import urllib2
import cgi
import sys, os

# Designed to prevent Open Proxy type stuff.

allowedHosts = ['geoserver/mapserver ip:geoserver/mapserver port',
                                'www.openlayers.org',
                                'openlayers.org']

method = os.environ["REQUEST_METHOD"]

if method == "POST":
    qs = os.environ["QUERY_STRING"]
    d = cgi.parse_qs(qs)
    if d.has_key("url"):
        url = d["url"][0]
    else:
        url = "http://www.openlayers.org"
else:
    fs = cgi.FieldStorage()
    url = fs.getvalue('url', "http://www.openlayers.org")

try:
    host = url.split("/")[2]
    if allowedHosts and not host in allowedHosts:
        print "Status: 502 Bad Gateway"
        print "Content-Type: text/plain"
        print
        print "This proxy does not allow you to access that location (%s)." % (host,)
        print
        print os.environ
 
    elif url.startswith("http://") or url.startswith("https://"):
  
        if method == "POST":
            length = int(os.environ["CONTENT_LENGTH"])
            headers = {"Content-Type": os.environ["CONTENT_TYPE"]}
            body = sys.stdin.read(length)
            r = urllib2.Request(url, body, headers)
            y = urllib2.urlopen(r)
        else:
            y = urllib2.urlopen(url)
      
        # print content type header
        i = y.info()
        if i.has_key("Content-Type"):
            print "Content-Type: %s" % (i["Content-Type"])
        else:
            print "Content-Type: text/plain"
        print
      
        print y.read()
      
        y.close()
    else:
        print "Content-Type: text/plain"
        print
        print "Illegal request."

except Exception, E:
    print "Status: 500 Unexpected Error"
    print "Content-Type: text/plain"
    print
    print "Some unexpected error occurred. Error text was:", E

备注:部署在同一个机器、不同服务器上(相同ip,不同端口号)同样是跨域访问。例如地图服务器geoserver在tomcat,端口8080,应用系统在Apache或IIS,端口80),这种情况下只有IE6能够正常访问,条件是将ip地址加入可信站点列表,IE7、IE8、FF3.6都会禁止访问。


posted @ 2010-08-26 10:36 天狼 阅读(4107) | 评论 (0)编辑 收藏
Openlayers项目开发完成后,需要将系统从开发环境转移到生产环境。

开发环境下,Openlayers框架由上百个独立的javascript程序文件组成,通过lib目录中的Openlayers.js
动态加载,便于各个功能模块的开发调试。

Openlayers是一个非常庞大的Web地图客户端应用框架,提供了很多功能模块,通常在开发过程中不会用到全部模块。
将系统中用到的独立javascript程序库组织成一个Openlayers.js文件,可以减少代码冗余,加快加载速度,
同时也便于对代码进行压缩和重编码,在一定程度上保护软件产品。

Openlayers提供了代码组合和压缩工具,在build目录下,使用Python脚本实现。运行该工具,需要安装Python解释器。
build文件夹中提供了三种预设的配置文件,它们是:
full.cfg    组合全部代码
library.cfg 组合主要代码
lite.cfg    组合最小代码
项目配置文件建议使用library.cfg或lite.cfg为模板编写。
配置文件中定义了四种作用不同的标签:
[first]    最前执行的代码文件
[last]     最后执行的代码文件
[include]  在预设配置中加入的代码文件列表
[exclude]  从预设配置中去除的代码文件列表
修改[include]和[exclude]项,生成项目配置文件。

在命令提示符下,输入python build.py mycfg my.js(如果是windows系统,请将python.exe加入系统Path路径)
生成的my.js就是生产版本的Openlayers库文件,将my.js部署到生产环境,测试各项功能是否运行正常。

build过程对代码文件做了压缩处理,压缩率在40%左右,程序结构没有做任何改动。
如果你想保护自己的代码,建议使用其他工具进行二次处理,这里推荐Google的Jscompiler,Google的很多项目都使用该工具进行代码压缩和优化。

Google Jscompiler的使用方法:
从http://code.google.com/intl/zh-CN/closure/compiler/下载最新版本。
Google Jscompiler采用Java编写,需要安装Java 6.0运行时或开发包,如果没有安装请到Oracle网站下载。
解压下载的zip包,生成compiler-latest目录,其中compiler.jar是主程序,帮助包含在README中。

执行Google Jscompiler请新打开一个命令提示符窗口,输入:
java -jar compiler.jar --help 显示所有可选参数说明。
压缩编码单个javascript程序文件,请使用下面的命令:
java -jar compiler.jar --js=in.js --js_output_file=out.js
压缩合并多个javascript程序文件,请使用下面的命令:
java -jar compiler.jar --js=in1.js --js=in2.js ... --js_output_file=out.js

经过Google Jscompiler处理后的Openlayers库文件可以再减少20-30%的大小,生成的文件经过测试没有任何问题。
Google Jscompiler会自动对代码进行分析,自动筛选出逻辑上不可能到达的代码,给出提示。
Google Jscompiler会对代码逻辑流程重新组合和优化,提高浏览器上的执行效率。
经过Google Jscompiler重新编码后,Web客户端的运行速度有明显提升。

posted @ 2010-08-04 14:44 天狼 阅读(3484) | 评论 (1)编辑 收藏
第三步:加入GeoTools类库
使用Eclipse打开example工程下的pom.xml文件,替换成以下内容并保存:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>org.geotools.demo</groupId>
 <artifactId>example</artifactId>
 <packaging>jar</packaging>
 <version>1.0-SNAPSHOT</version>
 <name>example</name>
 <url>http://maven.apache.org</url>
 <properties>
  <geotools.version>2.6.3</geotools.version>
 </properties>
 <dependencies>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>3.8.1</version>
   <scope>test</scope>
  </dependency>
  <dependency>
   <groupId>org.geotools</groupId>
   <artifactId>gt-main</artifactId>
   <version>${geotools.version}</version>
  </dependency>
 </dependencies>
 <repositories>
  <repository>
   <id>maven2-repository.dev.java.net</id>
   <name>Java.net repository</name>
   <url>http://download.java.net/maven/2</url>
  </repository>
  <repository>
   <id>osgeo</id>
   <name>Open Source Geospatial Foundation Repository</name>
   <url>http://download.osgeo.org/webdav/geotools/</url>
  </repository>
 </repositories>
</project>

不要关闭Eclipse,回到“命令提示符”窗口,在工程目录下键入mvn eclipse:eclipse,
例如: F:\project\example>mvn eclipse:eclipse
等待执行完成。

其间Maven会自动下载GeoTools的gt-main类库,请保持网络连接。

切换到Eclipse,使用refresh命令刷新example工程,你可以看到GeoTools已经加入工程中。

打开geotools.demo.example.App类,做如下修改:
 public static void main( String[] args )

        System.out.println( "Hello GeoTools:" + GeoTools.getVersion() );
}

编译执行,如果看到 Hello GeoTools:2.6-3,恭喜你!大功告成!

第四步:加入绘图界面和Shape插件

打开pom.xml文件,在 <dependencies></dependencies>之间加入以下内容:
<dependency>
   <groupId>org.geotools</groupId>
   <artifactId>gt-shapefile</artifactId>
   <version>${geotools.version}</version>
  </dependency>
  <dependency>
   <groupId>org.geotools</groupId>
   <artifactId>gt-epsg-hsql</artifactId>
   <version>${geotools.version}</version>
  </dependency>
  <dependency>
   <groupId>org.geotools</groupId>
   <artifactId>gt-swing</artifactId>
   <version>${geotools.version}</version>
  </dependency>

不要关闭Eclipse,回到“命令提示符”窗口,执行:F:\project\example>mvn eclipse:eclipse
其间Maven会自动下载GeoTools类库,请保持网络连接。

执行完成后,切换到Eclipse,使用refresh命令刷新example工程。
 
运行QuickStart类,如果demo路径中没有找到Quickstart.java,可以自己创建。
源文件在http://svn.osgeo.org/geotools/tags/2.6.3/demo/example/src/main/java/org/geotools/demo/Quickstart.java 直接复制代码,编译运行即可。

中文乱码问题
用QuickStart打开shape文件,如果文件中包含中文属性信息,中文将无法正确显示,这是GeoTools和GeoServer的常见问题。
在这里,不需要更改ShapefileDataStore类的源代码,我们可以直接修改QuickStart类,
    FileDataStore store = FileDataStoreFinder.getDataStore(file);
FeatureSource featureSource = store.getFeatureSource();

更改为
    ShapefileDataStore shpDataStore=new ShapefileDataStore(file.toURL());
    shpDataStore.setStringCharset(Charset.forName("GBK"));
    FeatureSource featureSource = shpDataStore.getFeatureSource();
即可显示汉字。

posted @ 2010-05-18 16:12 天狼 阅读(3395) | 评论 (3)编辑 收藏
Geotools官方网站上有一个很好Quickstart教程 http://geotools.org/quickstart.html
通过学习该教程,可以快速生成开发环境,我们选择Eclipse作为集成开发工具。

第一步:安装和配置Java和Maven
这部分属于常识性内容,Quickstart没有详细说明。
下载Java SDK 1.5或1.6,运行安装程序自动安装。手工设置JAVA_HOME环境变量,指向Java SDK安装目录。
下载Maven,当前版本是2.2.1(必须使用2.1以上版本),解压到硬盘指定目录。将Maven所在目录手工添加到PATH环境变量中。

检查JDK和Maven是否安装,打开“命令提示符”窗口,键入mvn -version,
例如:F:\project\example>mvn -version
如果返回以下信息,说明JDK和Maven正确安装。
Apache Maven 2.2.1 (r801777; 2009-08-07 03:16:01+0800)
Java version: 1.6.0_03
Java home: C:\Program Files\Java\jdk1.6.0_03\jre
Default locale: zh_CN, platform encoding: GBK OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"
如果返回错误信息,请检查环境变量是否设置正确。

第二步:设置工程文件目录
回到“命令提示符”窗口,转到工程起始目录下,键入mvn archetype:generate,
例如 F:\project>mvn archetype:generate
等待执行完毕。在此过程中Maven会创建工程文件和目录,并自动通过互联网下载需要的库文件,请保持网络连接。

运行到快要结束时,需要填入几个参数:
1、输入文档类型:选择默认的快速启动文档类型 15。注:Maven 2.2.1版本的默认值不是15,可以使用新默认值。
2、填入以下值:
groupId: org.geotools.demo
artifactId: example
version: 1.0-SNAPSHOT
package: org.geotools.demo.example
回到“命令提示符”窗口,按下面操作:
F:\project>cd example
F:\project\example>mvn eclipse:eclipse
等待执行完成。

启动Eclipse,打开Windows>Preferences菜单,找到Java>Build Path>Classpath Variables配置页面,添加一个新类路径,键入名称M2_REPO,加入类文件路径。
对于Windows XP在C:\Documents and Settings\<当前用户名>\.m2\repository,对于Windows Vista在: C:\Users\<当前用户名>\.m2\repository,
对于Linux和Mac在: ~/.m2/repository

导入刚才创建的example工程,选择File>Import菜单,选“Choose Existing Projects into Workspace”, 单击Next按钮,选择工程路径F:\project\example,完成。
posted @ 2010-05-18 16:00 天狼 阅读(5112) | 评论 (4)编辑 收藏
Google Maps基站定位
(转载至http://www.cnblogs.com/psunny/archive/2009/10/22/1587779.html)

如果你在你的手机装过Google Mobile Maps,你就可以发现只要你的手机能连接GPRS,即使没有GPS功能,也能定位到你手机所在的位置, 只是精度不够准确。在探讨这个原理之前,我们需要了解一些移动知识,了解什么是MNC/LAC/Cell ID。
  • Mobile Network Code(MNC)
    移动网号码,中国联通CDMA系统的MNC为03,中国移动的为00。
  • Mobile Country Code(MCC)
    移动用户所属国家代号:460
  • Location Area Code(LAC)
    地区区域码,用来划分区域,一般一个小地方就一个LAC,大地方就
  • Cell Tower ID(Cell ID)
    CellID代表一个移动基站,如果你有基站数据,查CellID你就可以知道这个基站在哪里,移动公司或者警察通过这个知道你是在哪个基站范围打的移动电话。

这些信息有什么用呢? 通过这些信息可以知道你的手机是从哪个国家,区域和哪个基站接入移动网络的。所以有些防盗手机丢失后,会发一些类 似"MCC:460;MNC:01;LAC:7198:CELLID:24989"内容的短信到你指定号码就是这个用途,通过这些信息可以从移动查到你的 被盗手机在哪里出现过。不过知道了也没用,中国人口这么密集,就是在你身边你也不知道谁是小偷:) 

  这些信息从哪里来呢,一般的手机系统都提供相应的API来获取这些信息(Tower Info),比如Window SmartPhone 或Mobile就是通过RIL.dll里的API来取得,每个手机操作系统不一样,相关的信息可以查相关资料。

得到了这些信息,如果没有基站信息表,得到了这些信息也不知道在哪,因为只有移动运营商有相关的信息,除非你是运营商或者警察才能得到这些信息。是 不是我们就查不到相应的数据呢,当然不是,强大的Google就有,这里就要提到Google Mobile Maps API,里面囊括了比较全的基站信息,中国的也有,就是偏远地区的有没有就不知道了。Google Mobile Maps本身就是使用的这些信息,感兴趣可以试一试,没有GPS模块也能定位到你手机位置,但精度不大,取决于基站的位置离你多远。

  同样我们自己也可以开发相应的手机应用来定位,只要调用Google现成的API(Secret API)"http://www.google.com/glm/mmap“.

  • 首先读取你自己手机的CellID和LAC。
  • 通过Http连接发送Post请求到http://www.google.com/glm/mmap
  • 传入CellID和LAC参数,从API返回基站的经纬度(Latitude/Longitude)。
  • 另外有个可以参考的例子(windows mobile)http://www.codeproject.com/KB/mobile/DeepCast.aspx

       下面是通过j2me获取手机imei号码和cellid(基站号)的例子

    package jizhan;
    import javax.microedition.lcdui.Command;
    import javax.microedition.lcdui.CommandListener;
    import javax.microedition.lcdui.Display;
    import javax.microedition.lcdui.Displayable;
    import javax.microedition.lcdui.Form;
    import javax.microedition.midlet.MIDlet;
    import javax.microedition.midlet.MIDletStateChangeException;

    public class GetIMEIAndCellId extends MIDlet implements CommandListener {
        
    private Command exitCommand = new Command("exit", Command.EXIT, 1);

         Form form 
    = new Form("imei and cellid");
         Display display 
    = null;

        
    public GetIMEIAndCellId() {
             display 
    = Display.getDisplay(this);

         }


        
    protected void destroyApp(boolean arg0) {

         }


        
    protected void pauseApp() {

         }


        
    protected void startApp() throws MIDletStateChangeException {
            
    //获取系统信息
             String info = System.getProperty("microedition.platform");
            
    //获取到imei号码
             String imei = "";
            
    //cellid
             String cellid = "";
            
    //lac
             String lac = "";
            
    // #if polish.vendor==Sony-Ericsson
             imei = System.getProperty("com.sonyericsson.imei");
            
    //参考 http://forums.sun.com/thread.jspa?threadID=5278668
            
    //https://developer.sonyericsson.com/message/110949
             cellid = System.getProperty("com.sonyericsson.net.cellid");
            
    //获取索爱机子的
             lac = System.getProperty("com.sonyericsson.net.lac");
            
    // #else if polish.vendor==Nokia
             imei = System.getProperty("phone.imei");
            
    if (imei == null || "".equals(imei)) {
                 imei 
    = System.getProperty("com.nokia.IMEI");
             }

            
    if (imei == null || "".equals(imei)) {
                 imei 
    = System.getProperty("com.nokia.mid.imei");
             }

            
    //获取到cellid
            
    //参考http://wiki.forum.nokia.com/index.php/CS000947_-_Getting_Cell_ID_in_Java_ME
            
    // #if polish.group==Series60
             cellid = System.getProperty("com.nokia.mid.cellid");
            
    // #else if polish.group==Series40
             cellid = System.getProperty("Cell-ID");
            
    // #endif
            
    // #else if polish.vendor==Siemens
             imei = System.getProperty("com.siemens.imei");
            
    // #else if polish.vendor==Motorola
             imei = System.getProperty("com.motorola.IMEI");
            
    //cellid 参考 http://web.mit.edu/21w.780/www/spring2007/guide/
             cellid = System.getProperty("CellID");
            
    // #else if polish.vendor==Samsung
             imei = System.getProperty("com.samsung.imei");
            
    // #endif

            
    if (imei == null || "".equals(imei)) {
                 imei 
    = System.getProperty("IMEI");
             }


            
    //展示出来
             form.append("platforminfo:" + info);
             form.append(
    "imei:" + imei);
             form.append(
    "cellid:" + cellid);
             form.setCommandListener(
    this);
             form.addCommand(exitCommand);
             display.setCurrent(form);
         }


        
    public void commandAction(Command cmd, Displayable item) {
            
    if (cmd == exitCommand) {
                 destroyApp(
    false);
                 notifyDestroyed();
             }

         }


    }

      需要注意的是,必须是受信任的Midlet才可以取到这些数据。也就是说Midlet必须经过签名上述代码才可以工作,否则获取到的是NULL。。
    下面是从别的地方看来的,没做过测试,供参考。
    a) Nokia = System.getProperty("com.nokia.mid.imei");
    System.getProperty("com.nokia.IMEI");
    System.getProperty("phone.imei");
    b) Samsung
    System.getProperty("com.samsung.imei");
    c) Sony-Ericsson
    System.getProperty("com.sonyericsson.imei");

    IMSI: IMSI全称是International Mobile Subscriber Identification Number,移动用户身份码。当手机开机后,在接入网络的过程中有一个注册登记的过程,系统通过控制信道将经加密算法后的参数组传送给客户,手机中的 SIM卡收到参数后,与SIM卡存储的客户鉴权参数经同样算法后对比,结果相同就允许接入,否则为非法客户,网络拒绝为此客户服务。IMSI唯一的标志了 一个SIM卡。
    IMEI: IMEI即International Mobile Equipment Identity(国际移动设备身份)的简称,也被称为串号,它唯一标志了一台移动设备,比如手机。 IMEI码一般由15位数字组成,绝大多数的GSM手机只要按下“*#06#”,IMEI码就会显示出来。其格式如下: TAC即Type Approval Code,为设备型号核准号码。FAC即Final Assembly Code,为最后装配号码。 SNR即Serial Number,为出厂序号。 SP即Spare Number,为备用号码。  

      有时候,我们在应用中需要获取IMSI或者IMEI号用于将应用程序和手机或SIM卡绑在一起。获取的方式在各不同厂商的各款手机上不尽相同,在motorola RAZR E6   上采用System.getProperty()获取。相应程序代码是:

                 String imei= System.getProperty("IMEI"); //for E6
                 if ( null == imei )
                     imei = System.getProperty("phone.IMEI");
                
                 String imsi = System.getProperty("IMSI"); //for E6
                 if ( null == imsi )
                     imei = System.getProperty("phone.IMSI");
                
                 g.drawString("IMEI: "+imei, 10, 50, Graphics.LEFT | Graphics.TOP);

                 g.drawString("IMSI: "+imsi, 10, 70, Graphics.LEFT | Graphics.TOP);

    参考地址:
    http://blog.csdn.net/phiger/archive/2009/07/22/4371922.aspx
    http://hi.baidu.com/lfcomputer/blog/item/0520e0d37a410a3c970a16c1.html
    http://wiki.forum.nokia.com/index.php/CS000947_-_Getting_Cell_ID_in_Java_ME
    posted @ 2009-12-03 16:30 天狼 阅读(2981) | 评论 (4)编辑 收藏
    不需要安装任何插件,使用openlayers 2.8可在Web页面上实现高级编辑功能。

    作为一个功能强大的WebGIS客户端,openlayers提供了添加、删除点、线、面的功能。
    对于节点捕获、分割、旋转等高级编辑功能,openlayers也提供了相应的例子。

    节点捕获的例子 http://dev.openlayers.org/releases/OpenLayers-2.8/examples/snapping.html
    分割的例子 http://dev.openlayers.org/releases/OpenLayers-2.8/examples/split-feature.html
    节点捕获和分割的例子 http://dev.openlayers.org/releases/OpenLayers-2.8/examples/snap-split.html
    旋转、缩放的例子 http://dev.openlayers.org/releases/OpenLayers-2.8/examples/modify-feature.html
    控制缩放的例子 http://dev.openlayers.org/releases/OpenLayers-2.8/examples/resize-features.html
    动画旋转的例子 http://dev.openlayers.org/releases/OpenLayers-2.8/examples/rotate-features.html



    posted @ 2009-11-20 15:14 天狼 阅读(2198) | 评论 (0)编辑 收藏

    给图层添加高度数据,需要根据实体几何类型分别处理。对于面,例如行政区界或建筑物,需要创建一个高度模板文件。
    对于线(点),例如架空电缆,高程将直接从图形数据中读取。
    GeoServer 1.7.1及以上版本支持输出三维面的KML(KMZ),1.7.6及以上版本支持输出三维线(点)的KML(KMZ)。

    发布三维面图层:

    用Geoserver发布三维面的过程非常简单,测试中我们使用Geoserver自带的示例图层topp:states。

    1、用记事本新建一个文本文件(高度模板文件),命名为height.ftl
    2、在文件中加入一行脚本,格式为${ATTRIBUTE.value},ATTRIBUTE是属性字段的名称。
    例如states图层有属性字段PERSONS,记录每个州的人口,输入${PERSONS.value?number/100},把高度和人口数建立关系。
    3、将height.ftl复制到Geoserver的/data/featureTypes/states/目录下
    4、进入Geoserver地图预览页面,找到topp:states,选择KML,打开Google Earth浏览效果。

    效果图1



    官方原文见:http://geoserver.org/display/GEOSDOC/04-Height+Templates

    作为练习,可以根据官方文档
    http://demo.opengeo.org:8080/display/GEOSDOC/05-Super+Overlays+and+Extrudes+with+Building+Data,
    发布纽约曼哈顿的建筑物,浏览三维城市效果。

    效果图2



    发布三维线图层:

    三维线不使用height.ftl文件,因为一条线有两个以上的节点,每个节点可能有不同的高度值,高程直接存放在图形数据(Geometry)的Z坐标中。
    Oracle Spatial、PostgreSQL(PostGIS)等数据库都支持存储三维坐标。

    Geoserver可以直接发布三维线,测试中使用Oracle Spatial(10g)和PostgreSQL(8.3)作为数据源。
    1、在Oracle Spatial(10g)或PostgreSQL(8.3)中存入包含Z坐标的三维线数据,作为测试,可用直接SQL语句插入数据。
    2、在Geoserver中发布该图层。
    3、进入Geoserver地图预览页面,找到刚才发布的图层,选择KML,打开Google Earth浏览效果。

    需要注意的是,默认KML(KMZ)在Google Earth中的实际效果是三维面。
    经过查阅KML文档,要实现三维线,需要在KML链接后加上可选参数format_options=extrude:0,例如将
    http://192.98.151.200:8080/geoserver/wms/kml?layers=topp:TESTL
    改为
    http://192.98.151.200:8080/geoserver/wms/kml?layers=topp:TESTL&format_options=extrude:0

    效果图3


    Google KML Version 2.2已经获得OGC批准,成为国际标准的数据存储格式。ESRI、INTERGRAPH、MAPINFO在其最新版本软件中提供KML格式输出支持。
    Google定义的KML不仅可以包含三维高程数据,还能加入四维时间数据。

    本文只涉及三维数据的发布和展示,相关技术文档请参考Google KML和Geoserver KML页面。
    Google KML页面:http://code.google.com/apis/kml/documentation/
    Geoserver KML页面:http://geoserver.org/display/GEOSDOC/KML+KMZ+Output http://geoserver.org/display/GEOSDOC/Google+Earth+Features
    本文涉及的软件环境为:Geoserver 1.7.7、Geoserver 2.0、Google Earth 5.1、Oracle 10.2.0.3、PostgreSQL 8.3.7

    posted @ 2009-10-27 10:40 天狼 阅读(6737) | 评论 (2)编辑 收藏
    2009年10月23日 Geoserver 2.0 正式发布
    posted @ 2009-10-26 15:55 天狼 阅读(370) | 评论 (0)编辑 收藏

    一.安装postgis

      (1)首先到postgresql的官方网站(www.postgresql.org)上下载最新版的开源数据库postgresql,我当前下载的最新安装包是postgresql-8.3.6-1-windows.exe

      (2)运行该exe,按照向导安装之,在安装过程中最好关闭防火墙,以及监控;另外最好将安装目录设置为NTFS分区的盘上.

      (3)安装完成后提示你是否在退出时配置application stack builder,这里购选上它,然后点finish

      (4)进入application stack builder向导后,选择postgresql 8.3 on port 5432,点next

      (5)在application list中沟选中你要安装的application,这里必须沟选postgis-pg83-setup-1.3.5-1.exe

      (6)下一步,选择下载服务器,下载完成后开始安装相应的application

      (7)在安装时要注意,有两处都要设置密码,不要设置密码为空.

      (8)这样根据向导就可以成功安装postgis了

      安装postgis过程中可能会出现"Error opening file for writing:
    c:\program files\PostgreSQL\8.3\bin\libiconv-2.dll"的提示,这里我们可以忽略之

    二.向postgis导入shapefile数据

      (1)安装后运行pgadmin III,右击postgresql 8.3(localhost)服务器,连接之,这里的密码是你安装时设置的密码,务必牢记

      (2)连接后,我们发现postgis安装后自动给我们生成了一个数据template_postgis,我们将要导入的数据就需要放到这个数据库中.

      (3)运行命名提示符cmd.exe,将其转向C:\Program Files\PostgreSQL\8.3\bin(或者将cmd.exe复制到该目录下)如下:

        C:\Program Files\PostgreSQL\8.3\bin>

      (4)首先将shp生成对应的sql脚本,键入以下字符

         C:\Program Files\PostgreSQL\8.3\bin>shp2pgsql -W "GBK" D:\CampusGISProject\new_p
    ku_vector\viwpt.shp viwpt > D:\CampusGISProject\new_pku_vector\viwpt.sql

         这里的-W "GBK"代表字符编码的转换,D:\CampusGISProject\new_pku_vector\viwpt.shp则是要生成sql脚本的 shp文件.viwpt是创建数据表的表名,>不能少,D:\CampusGISProject\new_pku_vector \viwpt.sql则是要生成SQL文件的绝对目录

         生成成功后命令提示符会显示如下:

         Shapefile type: Point
         Postgis type: POINT[2]

      (5)然后我们执行sql语句,执行该SQL语句文件,导入数据到数据库template_postgis中

         C:\Program Files\PostgreSQL\8.3\bin>psql -d template_postgis -f D:\CampusGISProj
    ect\new_pku_vector\viwpt.sql postgres

         其中 template_postgis是数据库名,postgres是该数据库的用户

         执行成功后,刷新该数据库,就可以看到新生成的数据表viwpt

       这样viwpt.shp数据就成功导入到了postgis中了
    posted @ 2009-10-20 15:00 天狼 阅读(830) | 评论 (0)编辑 收藏
    从MapGuide官方网站(https://mapguide.osgeo.org)下载MapGuide Open Source Windows安装包
    MgServerSetup-2.0.2.3011.exe
    MgWebServerExtensionsSetup-2.0.2.3011.exe
    安装包中已经包含了apache和tomcat,但是没有包含Java SDK。需要单独安装Java SDK 5.0以上版本,并设置JAVA_HOME和JRE_HOME环境变量。

    安装MapGuide Server和MapGuide Web Server Extensions,安装时选择Java环境,另外两种环境是PHP和DOTNET。
    下载java环境示例文件javaviewersample.zip,解压到 MapGuideOpenSource安装目录\WebServerExtensions\www 目录下,
    在解压后的文件夹 javaviewersample 找到文件 readme.txt,按其中的说明进行配置,注意修改路径。
    进入 MapGuideOpenSource安装目录\WebServerExtensions\Tomcat\bin 目录,执行 startup.bat,启动Tomcat。
    如果Tomcat无法启动,检查Java环境变量是否正确。

    下载示例数据包 Sheboygan.mgp,复制到 MapGuideOpenSource安装目录\Server\Packages 目录下。
    打开站点管理程序,地址为 http://ip:8008/mapguide/mapadmin/login.php,登录用户名Administrator,密码admin,注意大小写。
    如果输入了正确的用户名和密码,仍然无法登录,检查MapGuide Server服务是否运行。

    选择管理页面左侧的导航条,选择ManagePackages,然后在右侧列表选中Sheboygan.Mgp,点击Load Package标签,等待Package加载完成。
    注意:如果IP地址为127.0.0.1或localhost,可能无法执行Load Package命令。

    在浏览器中输入 http://ip:8008/mapguide/javaviewersample/ajaxtiledviewersample.jsp, 查看运行效果。


    posted @ 2009-08-31 15:19 天狼 阅读(1633) | 评论 (0)编辑 收藏

    将 Oracle Spatial 与 Google Earth 集成

    此篇文章将向您展示如何使用Oracle Locator/Oracle Spatial、GeoServer 和Google Earth 创建具有定位功能的强大的无缝商务智能系统。最后,我希望您在阅读完本练习之后 ...
    官方链接:http://www.oracle.com/technology/global/cn/pub/articles/lokitz-spatial-geoserver.html


    posted @ 2009-08-20 21:19 天狼 阅读(467) | 评论 (0)编辑 收藏
    GeoWebCache是一个采用Java servlet实现缓存WMS(Web Map Service)地图切片的开源项目。

    当地图客户端请求一张新地图时,GeoWebCache将拦截这些调用,返回经过缓存切片处理的地图文件,提高地图显示速度,减轻geoserver服务器的工作负荷,实现更好的用户体验。

    6月9日发布的geoserver 1.7.5 直接包含了geowebcache组件,不需要单独安装和配置,默认状态下没有开启cache。

    开启cache功能的步骤:
    1、在浏览器输入地址 http://geoserver服务器ip:8080/geoserver/gwc,出现geowebcache页面,加载图层动态列表。
    2、在GeoWebCache页面,选择需要发布的图层,单击右边的Seed this layer链接,选择开始zoom和结束zoom,了解GeoWebCache工作原理的开发者,应该明白这两个参数,提交请求。
    3、生成cache可能需要一段时间,可以用刷新列表查看进度。

    执行完毕后,可在Tomcat的\temp\geowebcache\目录下找到切割成小块的图形文件。
    要查看结果,进入GeoWebCache页面,选择OpenLayers或Google Earth列上的链接。
    在openlayers中测试,地图显示速度有明显提升。



    posted @ 2009-06-15 13:24 天狼 阅读(7676) | 评论 (0)编辑 收藏
    AMD三核处理器无法安装MSDE 2000 SP3,包括SQL Server200 SP3、SP4。

    CPU AMD Phenom X3 8450
    操作系统 Window XP SP2、SP3,Window Server 2003 SP1、SP2

    http://social.msdn.microsoft.com/forums/zh-TW/240/thread/bdabbd4f-f7f8-47fc-b502-fa439cdc8dc6/

    posted @ 2009-03-02 13:48 天狼 阅读(656) | 评论 (0)编辑 收藏
    Oracle通过Windows防火墙的方法:

    1、在Windows防火墙上设置开放 TCP 1521端口(Oracle TNSListener),使用telnet oracle服务器ip 1521 测试端口是否开放;
    2、打开注册表,找到HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0,新建一个字符串值:USE_SHARED_SOCKET=true;
    3、修改Oracle数据库操作模式,默认为“专用服务器模式”,修改为“共享服务器模式”。可以使用Database Configuration Assistant工具修改;
    4、重新启动Oracle数据库实例。

    在Windows2003server sp2和Oracle 9.2.0.4上测试通过。
    posted @ 2009-02-11 14:04 天狼 阅读(750) | 评论 (3)编辑 收藏
    关注uDig这个开源项目已经很久了,uDig基于GeoTools核心和Eclipse平台,定位于桌面GIS软件。
    在0.x版本时期,uDig存在速度慢、bug多等很多问题。最近发布的1.1版本速度和稳定性有了极大提升,界面也非常漂亮。
    支持多种数据库和网络地图服务接口,使用java的桌面GIS软件开发者不妨一试。
     
    posted @ 2009-01-04 17:22 天狼 阅读(2417) | 评论 (1)编辑 收藏
    http://219.153.20.6:8080/cqcbd/map.htm
    or
    http://www.cqcbd.gov.cn:8080/cqcbd/map.htm
    服务器在重庆电信机房。
    posted @ 2008-06-12 13:19 天狼 阅读(1143) | 评论 (2)编辑 收藏
    google免费提供了数量巨大的卫星地图资源。
    利用openlayers可以将google maps卫星地图和我们自己的地图合并在一起,当然自己地图的坐标系必须正确,
    google maps使用标准的WGS84经纬度坐标。
    添加google maps卫星图层分两步完成。
    1、在htm页面中引用google maps javascript库:
    <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAgwXwXyUIfjoFVrD_utlccRRLOu__vN-h4YvLvUUNjkkj2EdVKBSWwGWJ6bCTmu6Mt9dUF86wrzrqNg"
          type="text/javascript"></script>
    注意:获得key需要先注册一个google帐号,然后申请一个免费google maps key,key和你的服务器ip绑定。
    2、在js脚本里添加以下几句:
    try {
        var satellite = new OpenLayers.Layer.Google( "卫星图" , {type: G_SATELLITE_MAP, 'maxZoomLevel':zoom} ); //zoom分为20级,可取0-19,显示城市市区一般可取18  
        map.addLayer(satellite);
    } catch(e) {
        alert("无法连接到google maps,卫星地图将不能显示。"); //当网络不正常时,处理异常。
    }
    注意:如果只使用openlayers开发,不需要使用google maps api。
    经google官方人士证实,google maps接口现在和将来都会一直免费提供,只要符合许可协议。

    posted @ 2007-12-21 16:53 天狼 阅读(4099) | 评论 (2)编辑 收藏
    很好的交互性:前一个测试例子中,鼠标移动到单位标记上,可以弹出信息窗口,在窗口中显示单位名称。
    通过openlayers,可以获得WFS图层的feature对象,包括feature的属性feature.attributes对象和feature的空间feature.geometry对象。feature.geometry对象提供多种属性和方法。需要注意的是feature.attributes对象,它包含了所有的属性信息。要得到属性信息,请使用这样的格式feature.attributes['cq:LNAME'],cq是geoserver中的数据仓库名,LNAME是unit图层中的一个属性名,注意这里是严格区分大小的,是否支持中文字段没有测试。
    重要提示:openlayer2.5版已经修正的属性数据获取方法,直接使用feature.attributes[属性字段名],不再使用feature.attributes['cq:LNAME']。
    posted @ 2007-11-26 11:08 天狼 阅读(3021) | 评论 (0)编辑 收藏
    openlayers提供了几十个示例,虽然每个示例都很简单,但却很具有代表性,值得初学者学习。
    现在我想做一个测试,包含多个图层、缩放条、工具条、鼠标位置、弹出窗口,其中图层分别来自geoservr
    提供的WMS和WFS服务接口。
    主要代码如下:
    样式定义,定义地图大小,工具条位置和替换按钮图片。
    <style type="text/css">
            #map {
                width: 640px;
                height: 475px;
                border: 1px solid black;
            }

            .olControlPanel div {
              display:block;
              position: absolute;
                        top: 0px;
                        left: 190px;
              width:  60px;
              height: 23px;
              margin: 5px;
            }
            .olControlPanel .olControlMouseDefaultsItemActive {
              background-image: url("/openlayers/img/Pan.gif");
            }
            .olControlPanel .olControlMouseDefaultsItemInactive {
              background-image: url("/openlayers/img/PanSelected.gif");
            }
            .olControlPanel .olControlZoomBoxItemInactive {
              width:  60px; 
              height: 23px;
              position: absolute;
                        top: 0px;
                        left: 250px;
              background-image: url("/openlayers/img/ZoomInSelected.gif");
            }
            .olControlPanel .olControlZoomBoxItemActive {
              width:  60px; 
              height: 23px;
              position: absolute;
                        top: 0px;
                        left: 250px;
              background-image: url("/openlayers/img/ZoomIn.gif");
            }
             .olControlPanel .olControlSelectFeatureItemInactive {
              width:  60px; 
              height: 23px;
              position: absolute;
                        top: 0px;
                        left: 310px;
              background-image: url("/openlayers/img/InfoSelected.gif");
            }
            .olControlPanel .olControlSelectFeatureItemActive {
              width:  60px; 
              height: 23px;
              position: absolute;
                        top: 0px;
                        left: 310px;
              background-image: url("/openlayers/img/Info.gif");
            }
        </style>
    JS代码,核心部分。
    <script src="/openlayers/OpenLayers.js"></script>
        <script type="text/javascript">
            <!--
            //定义全局变量
            var map, layer, selectControl, selectedFeature;
            //关闭弹出窗口的函数
            function onPopupClose(evt) {
                selectControl.unselect(selectedFeature);
            }
            //构造弹出窗口的函数
            function onFeatureSelect(feature) {
                selectedFeature = feature;
                popup = new OpenLayers.Popup.Anchored("chicken",
                                         feature.geometry.getBounds().getCenterLonLat(),
                                         new OpenLayers.Size(250,75),
                                         "<div style='font-size:.8em'>" + feature.attributes['cq:LNAME'] +"</div>",
                                         null, true, onPopupClose);
                feature.popup = popup;
                map.addPopup(popup);
            }
            //销毁弹出窗口的函数
            function onFeatureUnselect(feature) {
                map.removePopup(feature.popup);
                feature.popup.destroy();
                feature.popup = null;
            }
            //地图和页面加载函数
            function init(){
                //设置地图缩放范围和缩放等级,0级比例尺最小
                map = new OpenLayers.Map( $('map'), {  maxScale: 500, minScale: 500000, numZoomLevels: 5 });
                //加载行政区图层,WMS栅格图像
                layer = new OpenLayers.Layer.WMS( "District",
                        "http://192.98.151.17:8081/geoserver/wms", {layers: 'cq:GMAP_DISTRICT'} );
                map.addLayer(layer);
                //加载水系图层,WMS栅格图像
                layer = new OpenLayers.Layer.WMS( "Water",
                        "http://192.98.151.17:8081/geoserver/wms", {layers: 'cq:GMAP_LAKE', 'transparent': true, format: 'image/png' } );
                map.addLayer(layer);
                //加载单位图层,WFS矢量数据,由openlayers在客户端绘制,注意:数量太多会导致速度缓慢
                layer = new OpenLayers.Layer.WFS( "Unit",
                        "http://192.98.151.17:8081/geoserver/wfs", {typename: 'cq:GPOI_GOV'},
                   { 
                          typename: 'unit',
                          featureNS: 'http://www.openplans.org/cq',
                          extractAttributes: true,
                          maxfeatures: 10,
                          textAttrToDisplay: 'lname'
                   } );
                map.addLayer(layer);
                //在地图上添加按钮和工具条
                zb = new OpenLayers.Control.ZoomBox();
                var panel = new OpenLayers.Control.Panel({defaultControl: zb});
                selectControl = new OpenLayers.Control.SelectFeature(layer, {onSelect: onFeatureSelect, onUnselect: onFeatureUnselect, hover: true});
                panel.addControls([
                    new OpenLayers.Control.MouseDefaults(), zb, selectControl
                ]);
                map.addControl(panel);
              
                map.addControl(new OpenLayers.Control.PanZoomBar({zoomWorldIcon:false}));
                map.addControl(new OpenLayers.Control.LayerSwitcher({'ascending':false}));
                map.addControl(new OpenLayers.Control.MousePosition());
                //设置初始地图的中心坐标和缩放等级
                map.setCenter(new OpenLayers.LonLat(106.5, 29.5), 3);
               
            }
            // -->
        </script>
    HTML代码
    <body onload="init()">
        <h1>OpenLayers Test</h1>
        <div id="panel"></div>
        <div id="map"></div>
        <textarea style="display:none" id="serialize" cols="96" rows="10"/>
      </body>

    posted @ 2007-11-26 10:58 天狼 阅读(31635) | 评论 (15)编辑 收藏
    Geoserver 1.5.2 已于8月3日正式发布,项目组正邀请全球开发者测试。
    本次更新修正了70多个bug,可以想象工作量是非常大的!

    接下来进行升级测试,将现有系统(基于geoserver1.4.0, tomcat5.0.28, oracle9.2.0.4),升级到1.5.2。升级过程很简单,替换文件即可。
    重新启动tomcat,进入geoserver管理界面,没有问题,原来的十几个图层加载成功。
    打开浏览器地图客户端,迟迟没有地图显示出来,查看tomcat的运行log纪录,出错了:
    :380031 [严重] org.geotools.data.jdbc.JDBC1DataStore - Error Performing SQL query: SELECT "LNAME", "POPNAME", "CLASS", "DISTRICT", "ADDRESS", "TEL_NO", "MI_STYLE", "MI_PRINX", "GEOLOC", "CID", "TID", "PID", "HTTP_ADR", "RP_PID", "MEMO", "ID" FROM "GPOI_BANK" WHERE SDO_RELATE("GEOLOC",MDSYS.SDO_GEOMETRY(2003,8307,NULL,MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),MDSYS.SDO_ORDINATE_ARRAY(106.3398675279321,29.35768529955373,106.7158359115559,29.67623870044627)),'mask=anyinteract querytype=WINDOW') = 'TRUE'
    java.sql.SQLException: ORA-29902: 执行 ODCIIndexStart() 例行程序中出错
    ORA-13373: 测量数据不支持类型为 Extent 的元素
    ORA-06512: 在"MDSYS.SDO_INDEX_METHOD_9I", line 368
    ORA-06512: 在line 1
    把查询放到sqlplus中执行,错误依旧。仔细检查查询语句,发现MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3)和以前的版本不同,1.4是MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),错误原因就在1和3上。
    1表示直线联结
    2表示弧线联结
    3表示混合联结,而oracle9i版本不支持3这个参数,所以出现"ORA-13373: 测量数据不支持类型为 Extent 的元素"错误。
    换用Oracle10g(10.2.0.1)测试,地图可以正常显示,没有错误。
    知道问题原因就好办了,改用以前的oracle插件一切ok。

    紧接着测试WCS接口,这是我最关心的功能。
    根据文档和示例,先后添加了DEM(来自美国USGS)和Tiff卫星照片,客户端显示正常。
    DEM分级颜色通过dem.sld设定,无法实现三维浏览。
    Tiff文件预先配准,采用矢量图层坐标系统。

    posted @ 2007-08-08 15:40 天狼 阅读(1708) | 评论 (1)编辑 收藏
    最近忙着装修房子,很久没有更新博客了。

    6月9日,Geoserver 1.5.1正式发布,这是一个值得期待的版本。
    从Geoserver 1.4到1.5.1的升级过程比较简单,没有遇到特别的问题。
    地图渲染速度没有太大变化,没有从1.3到1.4那种速度上的跳跃感。
    平台变化:
    1、内核升级到Geotools2.3.2;
    2、支持多种格式的WCS发布,很有用的功能;
    3、引入OpenLayer,为客户端开发提供一种新的选择。
    开发者可以使用OpenLayer直接发布地图,减少了开发工作量。相对而言,mapbuilder是一个强大又复杂的系统。
    测试中发现的问题:
    1、读取oracle空间表,渲染地图出现错误。
    分析原因:官方提供的oracle扩展包gt2-oracle-spatial-2.3.2.jar和驱动程序ojdbc14.jar在9i(9204)数据库上有问题,ojdbc14.jar是10g的驱动程序。使用老版本的gt2-oracle-spatial和9i的JDBC驱动,问题解决。估计官方提供的oracle扩展包只适用于10g。
    2、对oracle空间表进行WFS查询,返回的XML结果集有问题,导致WFS查询失败。
    例如某查询应该返回:
    <gml:featureMember>
        <cq:CBD_BUILDING fid="CBD_BUILDING.161">
        <cq:ID>161</cq:ID>
        <cq:LNAME>都市广场</cq:LNAME>
    实际返回的XML为:
    <gml:featureMember>
        <gml:CBD_BUILDING fid="CBD_BUILDING.161">
        <gml:ID>161</gml:ID>
        <gml:LNAME>都市广场</gml:LNAME>

    PostGIS和ArcSDE没有类似的bug。
    posted @ 2007-06-15 14:44 天狼 阅读(1638) | 评论 (1)编辑 收藏
    geoserver 1.5开始,停止使用mapbuilder编写的测试页面,转而使用openlayers。
    openlayers提供了mapbuilder没有的导航工具条,提供了地图分幅(分块)和预读取功能,这些都是实际应用中非常有用的。
    地图分幅(分块)和预读取功能可以大大加快地图浏览速度,不用每次从服务器读取新的地图块。
    posted @ 2007-04-19 20:44 天狼 阅读(1648) | 评论 (1)编辑 收藏
    Hibernate版本3.2.0beta9a
    开发环境Eclipse3.2.1+MyEclipse5+HibernateTools3.2

    前几天还好好的程序,今天突然出现Could not find datasource错误。
    郁闷了一下午,终于找到了罪魁祸首。

    可以正常运行的hibernate.cfg.xml文件:
        <session-factory>
        <property name="show_sql">false</property>
        <property name="connection.datasource">java:comp/env/jdbc/odbcq</property>
        <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
        <mapping resource="com/tecom/cbd/model/CbdBuilding.hbm.xml" />

        </session-factory>

    出现错误的hibernate.cfg.xml文件(MyEclipse5自动生成):
        <session-factory>
        <property name="show_sql">false</property>
        <property name="connection.datasource">java:comp/env/jdbc/odbcq</property>
        <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
        <property name="jndi.class"></property>
        <property name="connection.password"></property>
        <property name="connection.username"></property>
        <property name="jndi.url"></property>
        <mapping resource="com/tecom/cbd/model/CbdBuilding.hbm.xml" />

        </session-factory>

    posted @ 2007-02-06 16:42 天狼 阅读(4432) | 评论 (0)编辑 收藏
    geoserver 1.4.0测试工作完成,发现的问题已经解决,正好有一新项目进入开发阶段,决定使用sun jdk1.4.2+apache2.2.4+tomcat5.0.28+geoserver 1.4.0+mapbuilder 1.0.1组合.
    我们使用apache2.2 和tomcat5.0 整合搭建了一套运行平台,网上搜索了很多apache2.2 和tomcat5.0整合的文章,由于版本等原因,搞了2天才弄出来。
    本文可以为需要做apache2.2 和tomcat5.0 整合的朋友做参考。
    经过测试该平台的性能比济南项目(IIS6+Resin3.0.19)提升50-100%。

    使用软件
    Sun Java2SDK 1.4.2 (j2sdk-1_4_2_11-windows-i586-p.exe)
    Sun JAI 1.1.2 SDK (jai-1_1_2_01-lib-windows-i586-jdk.exe) geoserver需要
    Sun ImageIO 1.0 SDK (jai_imageio-1_0_01-lib-windows-i586-jdk.exe) geoserver需要
    Apache 2.2 (apache_2.2.4-win32-x86-no_ssl.msi) 注意:必须使用2.2.3及以上版本
    Tomcat 5.0 (jakarta-tomcat-5.0.28.exe)
    mod-jk 1.2 (mod_jk-apache-2.2.3.so) 注意:必须匹配apache版本

    1、安装Java2SDK-1_4_2,过程省略。
    2、安装Apache 2.2,过程省略。使用端口80,将mapbuilder整个目录(地图客户端支持包)复制到 Apache安装目录/htdocs下。
    3、安装Tomcat 5.0,过程省略。使用端口8081,将geoserver整个目录(地图引擎)和cqcbd整个目录(应用系统)复制到 Tomcat安装目录/webapps下。将cqcbd.xml文件复制到 Tomcat安装目录/conf/Catalina/localhost下,cqcbd.xml文件包含数据库连接池的ResourceLink信息。
    4、将mod_jk-apache-2.2.3.so复制到 Apache安装目录/modules下。
    5、修改 Apache安装目录/conf/httpd.conf
    添加mapbuilder虚拟目录:(mapbuilder不使用tomcat解析。使用tomcat时,xsl中输出的汉字会显示为?号,原因不明。)
    Alias /mapbuilder "D:/Apache2.2/htdocs/mapbuilder"
    <Directory "D:/Apache2.2/htdocs/mapbuilder">
        Options Indexes FollowSymLinks
        AllowOverride None
        Order allow,deny
      Allow from all
    </Directory>

    添加apache_tomcat连接器mod-jk配置文件路径:
    # Tomcat mod-jk
    Include conf/mod_jk.conf

    6、在Apache安装目录/conf/下新建文件mod_jk.conf,内容如下:

    # Load mod_jk module. Specify the filename
    # of the mod_jk lib you’ve downloaded and
    # installed in the previous section
    #加载mod_jk模块
    LoadModule jk_module modules/mod_jk-apache-2.2.3.so
    # Where to find workers.properties
    JkWorkersFile conf/workers2.properties
    # Where to put jk logs
    JkLogFile logs/mod_jk.log
    # Set the jk log level [debug/error/info]
    JkLogLevel info
    # Select the log format
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
    # JkOptions indicate to send SSL KEY SIZE,
    JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
    # JkRequestLogFormat set the request format
    JkRequestLogFormat "%w %V %T"
    # 请求分发配置,可以配置多项
    JkMount /cqcbd/* loadbalancer
    #把/cqcbd/目录下的所有请求转发给集群负载均衡器(最终到达tomcat)
    #注意,不要把mapbuilder目录下的请求转发给Tomcat
    #关掉主机Lookup,提高系统性能。
    HostnameLookups Off

    7、在Apache安装目录/conf/下新建文件workers2.properties,内容如下:

    worker.list=loadbalancer
    # Define the first node...
    worker.server1.port=8009
    worker.server1.host=192.98.151.7 #tomcat服务器ip地址
    worker.server1.type=ajp13
    worker.server1.lbfactor=1
    worker.server1.local_worker=1
    worker.server1.cachesize=1000
    worker.server1.cache_timeout=600
    worker.server1.socket_keepalive=1
    worker.server1.socket_timeout=0
    worker.server1.reclycle_timeout=300
    worker.server1.retries=3

    # Define the second node...

    # Now we define the load-balancing behaviour
    worker.loadbalancer.type=lb
    worker.retries=3
    worker.loadbalancer.balance_workers=server1
    worker.loadbalancer.sticky_session=true
    worker.loadbalancer.sticky_session_force=true

    8、Tomcat不需要特别配制,确认 Tomcat安装目录/conf下的server.xml文件包含:

    <Connector port="8009" protocol="AJP/1.3" protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler" redirectPort="8443">
    </Connector>

    整合完成!测试系统:
    访问http://192.98.151.7,出现Tomcat目录列表。
    访问http://192.98.151.7/geoserver,出现Geoserver目录列表。
    访问http://192.98.151.7/mapbuilder,出现mapbuilder首页。
    访问http://192.98.151.7/cqcbd,出现CBD管理系统首页。
    说明:测试时只使用了一台服务器。

    posted @ 2007-01-31 17:19 天狼 阅读(4812) | 评论 (2)编辑 收藏
    上周测试了Geoserver1.4.0正式版,比起Geoserver1.3.2有了较大变化,最大变化是引入spring框架以及内核升级到Geotools2.2。测试中发现地图渲染速度明显提升,特别是读取oracle spatial的速度至少提升了100%(难以置信)。同时也发现WFS查询存在严重问题,回想当初Geoserver1.3.0版本也存在不少bug,再等等吧!期待Geoserver1.4.1早日发布。
    posted @ 2007-01-20 21:50 天狼 阅读(2666) | 评论 (3)编辑 收藏
    最后担心的速度问题经过升级服务器硬件,优化运行环境很好的解决了。
    Geoserver具有j2ee平台固有的特点,吃CPU,耗内存。因此服务器CPU采用P4 Xeon 3.0G(单颗),内存扩充为2G,采用BEA IA32 1.4.2 JVM和IIS6+Resin 3.0.19服务器,同时运行3个独立的Geoserver,640*480幅面地图刷新时间不大于1秒 。

    web地址 www.ditu365.cn 该网站暂时未启用,请访问济南地名网 http://map.jndmw.cn
    服务器在网通机房,南方电信用户访问会比较缓慢。
    posted @ 2006-12-18 12:56 天狼 阅读(8129) | 评论 (13)编辑 收藏
    安装环境:Windows 2003 Server SP1+Sun Java 2 SDK 1_4_2_11+Tomcat 5.0.28
    如果你希望试用Geoserver,建议下载Windows Installer文件geoserver-1.3.3.exe,安装程序中包含
    Jetty应用服务器,将为你自动创建测试环境。

    部署一个Geoserver项目(WAR文件包),大致需要以下六个步骤:
    1、安装Sun Java 2 SDK,到sun网站下载j2sdk-1_4_2_11-windows-i586-p.exe(版本可能有变化)。
    注意:必须下载JDK,而不是JRE。你也可以使用IBM或BEA公司的JDK,经过测试表明BEA的Jrocket在Windows x86平台上比Sun的JVM有更快的速度。
    (安装JDK 5.0可能遇到问题,请参考Geoserver帮助文档。)
    2、安装Sun Java Advance Image SDK,到sun网站下载jai-1_1_2_01-lib-windows-i586-jdk.exe(版本可能有变化),安装程序自动将Java Advance Image安装到Sun Java 2 SDK所在目录。
    注意:必须安装JDK版本。
    3、安装Sun Java Advance ImageIO SDK,到sun网站下载jai_imageio-1_0_01-lib-windows-i586-jdk.exe(版本可能有变化),安装程序自动将Java Advance ImageIO安装到Sun Java 2 SDK所在目录。
    注意:必须安装JDK版本。
    4、安装Tomcat应用服务器,到Apache网站下载jakarta-tomcat-5.0.28.exe,安装到指定目录,默认使用8080端口。你也可以安装其他J2EE应用服务器,经过Geoserver项目组测试的应用服务器包括:JBoss、Jetty、Tomcat、Resin。
    注意:Tomcat 5.5需要JDK 5.0支持。
    5、安装Apache服务器,到Apache网站下载apache_2.2.3-win32-x86-no_ssl.msi,安装到指定目录,服务器名为本机IP地址,默认使用80端口。如果Apache Server无法正常启动,检查你的系统上是否正在运行IIS服务器。
    (该步骤可选,我们使用Apache处理普通http请求,Tomcat处理OGC WMS,WFS-T地图服务请求,这样做的目的是分担Tomcat的工作压力,提高Geoserver的地图处理速度。)
    6、关闭Tomcat,复制geoserver.war包到Tomcat的webapp目录,启动Tomcat。Tomcat将自动部署geoserver。启动完毕,使用http://ip:8080/geoserver进入geoserver图形配置页面。第一次进入geoserver,应用服务器需要编译jsp,请耐心等待。
    提示:geoserver需要高速CPU和大量内存才能流畅运行,建议配置至少为P4 1.6A 512M内存。在低配置的机器上运行速度将非常缓慢,参见以下的测试报告。

    测试中我们同时渲染了15个地图图层,数据全部取自Oracle数据库,记录每次地图刷新所需时间。
    服务器A P4 1.7(2级Cache 256K) 内存 512M(DDR266) 耗时6-8秒
    服务器B P4 1.6A(2级Cache 512K) 内存 1G(DDR400) 耗时3-5秒
    服务器C P4 2.8E(2级Cache 1M) 内存 512M(DDR400) 耗时1-2秒

    posted @ 2006-08-20 21:39 天狼 阅读(4012) | 评论 (3)编辑 收藏
    WMS Server列表
    1. NASA JPL Web Mapping Server http://wms.jpl.nasa.gov/wms.cgi?Service=WMS&Version=1.1.1&Request=GetCapabilities
    2. Cubewerx Demonstration Server http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?CONFIG=main&SERVICE=WMS&?VERSION=1.1.1&REQUEST=GetCapabilities 3. DM Solutions GMap Server http://www2.dmsolutions.ca/cgi-bin/mswms_gmap?VERSION=1.1.0&REQUEST=GetCapabilities
    4. TerraServer http://terraservice.net/ogccapabilities.ashx?version=1.1.1&request=GetCapabilties
    5. Delaware http://datamil.udel.edu/servlet/com.esri.wms.Esrimap?servicename=DE_census2k_sf1&VERSION=1.0.0&request=capabilities 6. LifeMapper http://www.lifemapper.org/Services/WMS/?Service=WMS&VERSION=1.1.1&request=getcapabilities
    7. NASA GLOBE Program http://globe.digitalearth.gov/viz-bin/wmt.cgi?VERSION=1.1.0&Request=GetCapabilities
    8. Geobase National Road Network - Newfoundland and Labrador http://www.geographynetwork.ca/wmsconnector/com.esri.wsit.WMSServlet/Geobase_NRN_NewfoundlandAndLabrador_I_Detail?request=GetCapabilities 9. Demis.nl http://demis.nl/mapserver/request.asp?Service=WMS&Version=1.1.0&Request=GetCapabilities
    10. SEACOOS, remote sensed and in-situ ocean data. http://nautilus.baruch.sc.edu/wms/seacoos_rs?REQUEST=GetCapabilities http://nautilus.baruch.sc.edu/wms/seacoos_rs_256?REQUEST=GetCapabilities http://nautilus.baruch.sc.edu/wms/seacoos_in_situ?REQUEST=GetCapabilities http://nautilus.baruch.sc.edu/wfs/seacoos_in_situ?service=wfs&request=getcapabilities&version=1.0.0 For details on remotely-sensed WMS data, see: http://caro-coops.org/bb/viewtopic.php?t=324&highlight= For details on in-situ WMS and WFS data, see: http://caro-coops.org/bb/viewtopic.php?t=331&highlight= For more information on layers see: http://www.seacoos.org/Data%20Access%20and%20Mapping/layerpopup
    11. GO Web Server, a hybrid SLD-WMS 1.3.0 and WFS 1.0.0 using GO-1 http://goserver.systechnologies.com/GO1WebServer/gws http://goserver.systechnologies.com/GO1WebServer/test-wmsclient.html For details see http://goserver.systechnologies.com/go1wiki/index.php/Main_Page
    12. wms.lizardtech.com - hosting a large collection of hi-resolution orthorectified imagery covering the US. http://wms.lizardtech.com - express server portal page http://wms.lizardtech.com/lizardtech/iserv/ows?service=WMS&request=GETCAPABILITIES - capabilities document
    13. Regional Autonomous Corporation of Santander - Environmental & forest data - Departament of Santander - Colombia http://sig.cas.gov.co:9999/geoserver/wms?Service=wms&Request=GetCapabilities

    WFS Server列表
    # DM Solutions Sample Server http://www2.dmsolutions.ca/cgi-bin/mswfs_gmap?version=1.0.0&request=getcapabilities&service=wfs # InterGraph Server http://ogc.intergraph.com/OregonDOT_wfs/request.asp?VERSION=0.0.14&request=GetCapabilities # Geography Network Canada (ESRI Instance) http://dev.geographynetwork.ca/ogcwfs/servlet/com.esri.ogc.wfs.WFSServlet?Request=GetCapabilities # Galdos Sample Server http://wfs.galdosinc.com:8680/wfs/http?Request=GetCapabilities&service=WFS # Federal Water Quality Data - Pacific Yukon http://excise.pyr.ec.gc.ca/cgi-bin/mapserv.exe?map=/LocalApps/Mapsurfer/PYRWQMP.map&version=1.0.0&service=WFS&request=GetCapabilities # Federal Water Quality Data - Newfoundland - Labrador http://map.ns.ec.gc.ca/MapServer/mapserv.exe?map=/mapserver/services/envdat/config.map&service=WFS&version=1.0.0&request=GetCapabilities # Geomatics Sample Server http://gws2.pcigeomatics.com/wfs1.0.0/wfs?service=WFS&request=getcapabilities # Nature Watch http://emandev.cciw.ca/cgi-bin/mapserver/mapserv.exe?map=/inetpub/wwwroot/emanco/cgi-bin/mapserver/naturewatch.map&version=1.0.0&service=WFS&request=GetCapabilities # Cubewerx Demonstration Server http://demo.cubewerx.com/demo/cubeserv/cubeserv.cgi?service=WFS&datastore=Foundation&request=GetCapabilities

    posted @ 2006-08-17 21:56 天狼 阅读(5369) | 评论 (1)编辑 收藏
    本文讲述如何使用国际开源项目构建一个完整的GIS(地理信息)应用系统。

    通常的GIS应用系统包括:GIS内核、空间数据导入/转换、空间数据引擎、应用服务器、桌面应用程序、Web应用程序、(移动设备应用程序), 实际应用中可以根据需要进行取舍。
    1、GIS内核 Geotools Geotools是一套基于Java平台的开源GIS API中间件,实现了完整的GIS底层功能。
    2、空间数据导入/转换 地理数据的获取 地理数据来自文件、数据库和WMS/WFS服务器。
    文件方式: 支持读取的地理数据文件:ESRI Shape、Mapinfo Tab/Mif、Geomedia Access等,建议使用Shape文件格式,Oracle和PostgreSQL提供Shape文件导入数据库的程序。
    WMS/WFS服务器:Internet上有很多开放的GIS应用服务器,例如NASA、InterGraph、TerraServer等,通过它们获取各种免费地图资源。
    Google Map资源:Google Map没有采用标准的WMS/WFS协议,可以通过调用开放的Google Map API,附加自定义的WMS/WFS图层,实现应用目的。例如:通过Google Map可以免费获取高分辨的Google Map卫星地图。
    3、空间数据引擎
    开源:PostgreSQL(PostGIS)、MySQL(4.1以上)
    商业:Oracle、DB2、ArcSDE
    开源商业空间数据库推荐使用PostgreSQL。
    使用商业空间数据库引擎,例如Oracle Spatial、ArcSDE,可以非常方便的处理地理数据,更好的处理海量数据,以及与现有商业软件共享数据。
    4、应用服务器 Geoserver Geoserver是一个基于J2EE的开放的GIS应用服务器,实现了OGC(Open Geospatial Consortium)制定的WMS和WFS(WFS-T)规范,Geoserver是整个GIS应用系统的中枢部分,承担大部分业务处理任务。 (新版本(1.3.3)增加了对Google Earth KML/KMZ的支持。)
    需要注意的是,Geoserver不只是WebGIS服务器,它可以为桌面应用程序(Udig、Mapinfo)或移动设备(支持J2ME的PDA、手机)提供地图支持。
    5、桌面应用程序(C/S) Udig、GVSig
    Udig是一个使用Eclipse RCP和GeoTools构建的桌面地理信息系统,采用Eclipse SWT图形组件,具有更快的运行速度。Udig可以直接读取Shape文件,访问DB2或Oracle空间数据库,访问OGC WMS/WFS服务器。 Udig提供浏览、查询、编辑、测量等基本的GIS操作功能。
    6、Web应用程序(B/S) Mapbuilder Mapbuilder是一个采用AJAX(Asynchronous JavaScript and XML)技术开发的WebGIS客户端,它的内部结构基于MVC(Model-View-Controller),具有良好的可读性和可扩展性, 兼容Firefox 1.0+, Internet Explorer 6.0+, Mozilla 1.3+, Navigator 6+等浏览器。
    7、移动客户端 Spot Spot是一款基于移动设备的地图和定位软件,地图通过OGC WMS获取,并且提供了蓝牙GPS接口。该软件属于共享软件,使用GPS接口需要付费。
    posted @ 2006-08-17 21:46 天狼 阅读(9638) | 评论 (8)编辑 收藏