giswuyuanjie关于shapefile人们常说的Shapefile是一种美国ESRI公司开发的空间数据开放格式。目前,许多空间数据都以此格式进行存储、管理、共享,这证明了shape格式的实用性,也侧面证明了ESRI公司的实力和影响力。Shapefile格式保存了图形的矢量信息和其属性信息,一般由以下几个文件组成:*.shp-存储空间几何对象。*.shx-存储空间几何对象在*.shp文件中偏移索引。*.dbf-存储空间几何对象的属性信息。除了以上三个文件格式之外,还可以有其它文件的支持,这样能够优化访问数据库的性能:*.sbn和.sbx-空间几何对象空间索引。*.fbn和.fbx-存储只读空间几何对象空间索引。*.ain和.aih-存储列表中活动字段的属性索引。*.prj-保存空间参考信息。*.shp.xml-保存的元数据。关于*.shp、*.shx、*dbf文件的读取,可以去网站下载源代码进行研究。shapefile文件格式的白皮书可以去网站下载但是,如果想加快读写速度需要注意以下几点:1、利用SHPObject对象时,每次都对Z、M值进行了分配空间,开发人员可以自己修改shapelib库源代码,在没有M、Z值情况下不分配内存空间;2、开发者重写函数一个读取函数:SHPReadObject(SHPHandlehSHP,intiShape,SHPObject**obj),obj对象不必每次读取都重新重复分配内存,只有在上一个对象占用的内存空间小于此次读取对象时再重新分配空间;3、修改SHPObject结构,将顶点坐标的x、y值交互存放,和物理存储位置一致,例如:x1y1x2y2x3y3...4、利用quadtree进行空间搜索,加快空间数据搜索速度;5、完全重新设计sHPObject结构,使其与自己系统的空间数据对象一致,再重新开发shapeobject读写函数,自己从文件中解析数据,直接形成自己的内存数据结构去分析、绘制等工作,而不是利用ShpObject进行中转;6、注意shapefile格式中的Polygon,是拥有对个环的Polygon,环间可以嵌套形成洞、岛等现象,虽然ESRI规定,换走向的右侧为Polygon内部,但很多时候shapefile的存储并未遵守这一规则,而且环的存储顺序也很混乱,即:内环不一定紧随其外环存储,在读取中特别注意。7、warmerdam这位老仙儿,在shapefile读取库中,加入了quadtree的支持。但是,如果你把这些代码独立编译成dll,然后去调用会出现问题。SearchDiskTree()中要求传入的是FILE*,而这个参数是在你的工程(DLL或者EXE)中打开的,程序运行时崩溃。最好在shapelib中添加一个函数SearchDiskTreeEx(),改为传*.qix文件名吧。在shptree代码中,有分配内存的函数,却没有回收内存的函数,也需要自己添加一个,避免不同空间中非配、回收内存。用OpenLayers解析GML文件:不可否认openlayers的确是个好东西,尤其是他的事件封装机制更是让人爱不释手,感谢致力于openlayers开发的脚本爱好者们。但是作为一个开源的脚本框架,它也存在不少缺陷,GML解析的低效率就是一个严重的问题。对于一个像美国states的gml文件,大小约为300K左右,有95个面对象,所有面对象一共包含11000个左右的点,这么一个gml文件,不算从WFS请求过来的时间,就是放在本地就用openlayers脚本解析,耗时也在10s以上,虽然这里机器不太好,属于上个世纪的戴尔机器,内存256,CPU2.8G,但是这么长的耗时实在是说不过去。后来试用精简了的武汉数据,大小大概400K,只有一个面对象,不过这个面包含很多个点,16145左右,从WFS请求,结果在客户端根本就画不出来,IE死掉了。后来查看openlayers解析gml数据的代码,很容易就可以发现问题。openlayers对于Geometry对象的组织是这样的,其实最基本的就是点,然后MultiPoint由点构成,继承自Openlayers.Geometry.Collection,而LinearRing,LineString均由Point构成,Polygon由OpenLayers.Geometry.LinearRing构成。openlayers在解析数据时候,将所有的面、线包含的点全部都对象化为Openlayers.Geometry.Point,并首先将所有的对象读取到内存,得到一个Feature的集合,然后将这个集合提交给渲染器进行渲染。本来这个思想就行不通,加入我们通过WFS收到的文件有10M或者更大,要是把这些全部解析出来然后放到内存,那还不跑死啊,这个就像一个100M的文本文件要解析出来一样,要是等全部解析完了再处理数据那是不行的,万一数据再大呢,比如2G的数据,你还能这样全部读到内存么??而其实将所有的点都对象化才是它效率低下的根本原因,本人做过测试,将16145个Openlayers.Geometry.Point在现有机器配置下实例化耗时6S(除了一个QQ外,机器不运行任何其他程序),这个解析效率显然是不能满足GIS应用的。那么我认为,应该在gml数据解析得到相应Geometry对象的时候就直接将其用VML或SVG画出来,而且构建Polygon对象的时候不要涉及Point对象,及不要像这样构建ring1=newOpenLayers.Geometry.LinearRing(p.points);rings.push(ring1);varpoly=newOpenLayers.Geometry.Polygon(rings);最好是直接传入一系列坐标对直接构建Polygon。笔者自己写了个解析GML的简单脚本程序,然后用VML进行绘制,绘制本地的states数据连加载到显示不要1S,绘制局域网WFS请求的武汉数据,连请求到显示不要两秒,性能有明显改善。但是笔者这个简单程序只能作为测试,数据组织方面肯定不能和openlayers相比。附:VML和SVG是以DOM元素的形式存在与客户端用于适量数据的显示,因而二者都不能显示大数据量,它们只能作为一种辅助的形式显示少量的矢量数据。要想获得以接受的效率,矢量对象的个数最多在1000个左右。VML和SVG的绘图效率比较低下,假如矢量对象比较多或者面对象的面积普遍较大,那么重绘也是比较慢的。有人要看代码,所以我找出来了,找了好久,只是测试用的简单代码,没什么结构性。PLAINTEXTJAVASCRIPT:代码如下WMS:WebMapService(Web地图服务)l利用具有地理空间位置信息的数据制作地图。其中将地图定义为地理数据可视的表现。这个规范定义了三个操作:nGetCapabitities返回服务级元数据,它是对服务信息内容和要求参数的一种描述;nGetMap返回一个地图影像,其地理空间参考和大小参数是明确定义了的;nGetFeatureInfo(可选)返回显示在地图上的某些特殊要素的信息WFS:WebFeatureService(Web要素服务)lWeb地图服务返回的是图层级的地图影像,lWeb要素服务(WFS)返回的是要素级的GML编码,并提供对要素的增加、修改、删除等事务操作,是对Web地图服务的进一步深入。OGCWeb要素服务允许客户端从多个Web要素服务中取得使用地理标记语言(GML)编码的地理空间数据,定义了五个操作:nGetCapabilites返回Web要素服务性能描述文档(用XML描述);nDescribeFeatureType返回描述可以提供服务的任何要素结构的XML文档;nGetFeature一个获取要素实例的请求提供服务;nTransaction为事务请求提供服务;nLockFeature处理在一个事务期间对一个或多个要素类型实例上锁的请求。WFS-T:WebMapService-Transactional.允许用户以可传输的块编辑地理数据。WCS:WebCoverageService(Web覆盖服务)Web覆盖服务(WCS)面向空间影像数据,它将包含地理位置值的地理空间数据作为“覆盖(Coverage)”在网上相互交换。l网络覆盖服务由三种操作组成:GetCapabilities,GetCoverage和DescribeCoverageType:nGetCapabilities操作返回描述服务和数据集的XML文档。nGetCoverage操作是在GetCapabilities确定什么样的查询可以执行、什么样的数据能够获取之后执行的,它使用通用的覆盖格式返回地理位置的值或属性。nDescribeCoverageType操作允许客户端请求由具体的WCS服务器提供的任一覆盖层的完全描述。GML:GeographyMarkupLanguage.一种用于描述地理数据的XML。OGC——OpenGeospatialConsortium——开放地理信息联盟总之,GeoServer是您需要显示地图在网页的那些工具的当中一个,用户可以缩放并且移动。可以与一些客户端联合使用,比如:MapBuilder(forwebpages),UDig,GVSig,等等。对标准的使用允许信息从GeoServer到其它地理信息可以很容易地被结合。如果你对GeoServer发出一个WMS请求,你就可能得到如下的一张图:查看Demo在welcome界面中单击demopage链接,进入页面后单击WFS-T链接就可以启动一个名叫MapBuilder的基于Javascript的地图地图编辑器。启动MapBuilder后我们可以看到一张样图,那就就从它开始吧!用其提供的工具对图进行修改。自己练习。关于geoserver开发geoserver只能用j2ee开发geoserver是符合ogcwms/wfs/wcs标准的地图服务器,建设一套完整的webgis系统还需要客户端配合,mapbuilder和openlayers是非常好的两个选择。对于较大的项目,空间数据库也是必不可少的,geoserver支持商业的oracle、db2,开源的postgis、mysql。扯得更远一点,geoserver支持googlemap和googleearth。Geotools外文官网是开源的Java代码库,在GIS中提供对地理空间数据的标准操作。简单说,它就是一个中间件,提供的功能符合OGC规范,且与GeoAPI有密切的联系。它支持的数据格式有Shapefile、GML、WFS、PostGIS、OracleSpatial、ArcSDE、MySQL、GeoMedia、MapInfo等。利用Geotools能够实现:l格网覆盖Gridcoverages——栅格数据,l坐标系统转换CoordinateTransformation,l数据渲染Renderers,l格式化Styling——符号化数据集等功能。WFS地址把下面地址中的HighwayInterchange改成自己创建的featuretype的名字,在浏览器中查看,WFS的URL,=getfeature&service=wfs&version=1.0.0&typename=States下面地址的youtian改成自己的FeatureType名字,就是自己的WFS地址=youtianOpenlayersdom结构OpenLayers项目分析——(一)项目介绍(OpenLayersJavaScriptMapp