|
liuzheli :
1、了解几个表的用途: mapinfo用户在oracle数据库里存在(因为我是接别人的项目而来的,所以我不太清楚这个用户是什么时候建立的。可能使用easyloader的第一次上传地图数据的时候自动建立吧)在mapinfo用户下存在表mapinfocatalog,自动保存easyloader上传到空间数据库的表的信息。该表里有多个字段,其中TABLENAME Char(32),用来保存上传的地图的名称。OWNERNAME Char(32),用来保存该地图所属的用户名称。 使用easyloader上传jumindi.tab文件后,在数据库里生成两个表 jumindi和jumindi_sx_fl6$。一个是存储属性数据和空间数据,一个是索引表。在存储数据的表格里存在字段mi_prinx,它是空间数据库中默认唯一非空索引,建议不要修改。 在mapxtreme中,可以把利用MDM(map definition manager)实现的地图定义保存为数据库里的一条记录。要想保存该地图定义,那么先在你所使用的用户下(比如我使用的是gis用户。自己建立的)建立一个表。该表需要至少有两个字段,name(varchar类型,存储地图定义的名称,供mapxtreme访问)和mapdef(clob类型,存储MDM生成的有关地图定义的相关信息的xml文档)。比如我在我的gis用户里利用建表语句建立如下表:CREATE TABLE MAPDEFINITIONS (NAME VARCHAR(40),MAPDEF CLOB)。满足包含以上两个字段的表都可以用来存储到该用户下的地图定义。 2、了解MDM地图定义管理器的使用。 3、按照以下步骤建立自己的基于easyloader上传到数据库中的地图定义 a,在用户下建立表单 在我的gis用户下利用CREATE TABLE MAPDEFINITIONS (NAME VARCHAR(40),MAPDEF CLOB)建立表MAPDEFINITIONS 。用来存储地图定义。 在我的gis用户下建立mapinfo_mapcatalog表。建表的sql语句,可以参考mapinfo用户下的该表的sql语句。 b,向新建的地图定义中加入一个spatical里上传的地图 点增加图层按钮 选择oracle spatical 输入连接数据库的相应信息。我使用用户gis(我上传地图文件的用户)。 指定oracle表或者查询信息。我选择表,输入BJGREEN(这个是我用easyloader上传上来的。上传到GIS用户下) ,id字段:MI_PRINX 选择查询mapinfo_mapcatalog的其他设置 访问本地数据。 图层名称起名为BJGREEN。 ----------------依次循环,加入更多的需要的地图信息。 c,点确定后,就可以在MDM中看到从数据库中获取的地图。 d,保存地图定义 在地图管理器里点另存地图定义为。 选择数据库,选中已经建立的连接。 选择“用表” 输入 MAPDEFINITIONS ,名称列输入NAME,地图定义列输入MAPDEF。 这个时候点刷新,看不到地图定义文件,因为还没向库里保存任何地图定义。在地图名称里输入BEIJING。 点保存。这个时候将地图定义保存到数据库中。此时再点刷新,那么将看到你存储到表MAPDEFINITIONS 中的地图BEIJING。 e,到此,建立自己的地图定义并保存到数据库中完毕。 4、访问spatical里的地图定义。 在这里,我把地图定义保存到数据库中,我利用加载该地图定义的方式访问数据库。 在我的mapj的初始化中代码如下: MapJ myMap = new MapJ(); OraSoMapDefContainer mdc = new OraSoMapDefContainer("oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@10.80.168.231:1521:new","GIS", "ATM419", "MAPDEFINITIONS", "NAME", "MAPDEF"); myMap.loadMapDefinition(mdc, "BEIJING"); 至此,你已经完全可以访问你的空间spatical了。 james.liu的论坛给了我很多帮助,因此spatical的问题,我从接触到解决这个问题,不过用了4天。希望大家都交流,共同解决一些技术上的问题。很多时候感觉孤单无助的时候来这里发个帖子,懂的人也别吝啬,多回答一下。 也得到了mapxtreme for java斑竹wtusmchen的帮助,也提示大家,按照上面步骤来实现的话,记得把需要的类包都加入到你的CLASSPATH里。 我是mapxtreme for java的新手,以前也没接触过GIS方面的内容,不过java语言用过一段时间。作为mapxtreme for java的新手,以后肯定有很多问题,希望大家给予帮助。谢谢:)
liuzheli:
同时我也有一个问题,希望能得到大家的解答。 访问spatical的数据远远不如访问tab文件速度快(至少目前我的代码里是这样的)。可能是每次客户端的请求,服务器端的servlet都要重新访问数据库来下载地图数据的缘故吧?不知道大家有没什么好的解决建议。 而且,我在编码测试直接访问spatical里通过easyloader上传的图层的时候没有把地图信息显示出来,却能得到该图层的相关信息。不知道问题出在哪里。 希望大家帮助:)
lover :
楼主真厉害! 4天就搞定了,我去年搞的时候,差不多一个月才琢磨出点门道 空间数据库确实要慢些,我现在部分表放在TAB中,部分放在oracle数据库中。
James.Liu :
五点建议: 一。引入空间数据库的目的可能各有不同,但是有几点是相同的, 1。解决多用户并发编辑的问题; 2。解决数据安全的问题; 3。高效的空间索引机制; 4。数据的分布式存储和管理; 5。GIS的长事务处理等等。这些优势都是TAB文件存储的局限所在。 但是TAB文件存储的优势在于,数据源链接速度快,空间操作响应速度快等, 所以建议利用各自的优势,将不太常更新和保密要求不高的数据放在TAB文件中,如背景图等,将需要编辑和控制的业务数据放在空间数据库中。 二。将来合理的索引机制,对于经常更新维护的表建立Q-TREE索引,对应更新少,查询多的表建立R-TREE索引。 三。将一些空间操作放到后台,前台用来做个表现。比如图层的缓冲区分析,完全可以在后台实现。 四。使用数据库连接池功能,在application server启动的时候建立好连接,这样在调用的时候就可以节省数据库连接的时间 五。地图应用服务器和数据库服务器物理分开,因为两者都非常消耗CPU资源。 仁者见仁,智者见智,欢迎朋友们继续跟贴完善!
liuzheli :
恩,james.liu的建议真是一语中地。我想提高速度的有效方法不外乎楼主说的那些。 对速度提升最有影响,作用最明显的应该在于把背景图以tab文件访问。而管理方面的图层存储数据库。 我采用的中等客户端。服务器的servlet渲染地图,以流方式返回客户端。空间操作已经放到后台了。缓冲区的管理我以前做的项目也没接触过。我考虑一下怎么实现。 数据库的连接池的方案非常可行。几乎j2ee的系统都会采用它来优化系统。因为访问数据库最耗时的是跟数据库建立连接的过程。而真正的存取耗费的时间是瞬间的。因为使用建立好的连接是非常可行的。我看develop guide,mapxtreme本身就支持连接池的。 我觉得,如果依照数据库连接池的思想的话,建立一个mapj池应该也是可取的。即application server启动的时候建立一批已经初始化的mapj对象。作为服务器端的servlet,处理客户端的第一次请求的时候引用这些已经初始化好的mapj对象。这也能从一方面解决这个问题。 多用户并发编辑,数据安全等都是数据库系统都要遇到的问题。该考虑如何解决的。不过我也还没自己的想法,大家可以回帖子帮忙解决啊:) 分布式数据库,因为我给导师做的项目,规模上可能还不需要了:) 谢谢james.liu,你的这些建议,我想,也将是我论文的重点了。再次感谢。 |