posts - 41,  comments - 90,  trackbacks - 0
  2009年1月4日

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 天狼 阅读(5888) | 评论 (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 天狼 阅读(2794) | 评论 (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 天狼 阅读(6693) | 评论 (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 天狼 阅读(3487) | 评论 (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 天狼 阅读(3397) | 评论 (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 天狼 阅读(5116) | 评论 (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 天狼 阅读(2983) | 评论 (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 天狼 阅读(2200) | 评论 (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 天狼 阅读(6741) | 评论 (2)编辑 收藏
    2009年10月23日 Geoserver 2.0 正式发布
    posted @ 2009-10-26 15:55 天狼 阅读(372) | 评论 (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 天狼 阅读(832) | 评论 (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 天狼 阅读(1637) | 评论 (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 天狼 阅读(7680) | 评论 (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 天狼 阅读(752) | 评论 (3)编辑 收藏
    关注uDig这个开源项目已经很久了,uDig基于GeoTools核心和Eclipse平台,定位于桌面GIS软件。
    在0.x版本时期,uDig存在速度慢、bug多等很多问题。最近发布的1.1版本速度和稳定性有了极大提升,界面也非常漂亮。
    支持多种数据库和网络地图服务接口,使用java的桌面GIS软件开发者不妨一试。
     
    posted @ 2009-01-04 17:22 天狼 阅读(2419) | 评论 (1)编辑 收藏