Category Archives: GIS

ArcCatalog使用iso元数据标准

为了系统只使用iso标准,ArcCatalog(以下称ac)做为发布端,需要做如下工作:

  1. 关闭fgdc和geo-network同步器。在metata菜单里,使用set working synchronizer命令关闭两者。
  2. 建立一个vba宏,删除xml里的fgdc标签。edn有现成可用的宏,在esri的edn开发网站上搜索 delete FGDC metadata,估计就可以找到。(或向我索要)建立好了,在ac里选择上需要处理的文档,支持宏即好。其实分析一下,就只有几个标签,手工去删除也不难。而且最好能有个自己的工具去批量删除。
  3. 关闭 arcims server上的基于内容的 validation功能,用处不大,那是为metadata explorer设计的,如果不用explorer,这个功能就没多大用处了,而且此功能实质是检查 fgdc标签的内容(或者说iso的内容处在低于fgdc内容的优先级别上)。

SQL server master库损坏的解决方案

SQL server 2k master db corruption due to power cutoff, causing sql server cannot start up. In this server, ArcSDE 9 and ArcIMS 9 are associated with Sql Server 2k sp4. and worse, no backup have been created prior to this disaster.
solution:
1. Backup possibly effected dbs, i.e., sde db, and westdc db.
2. run rebuildm.exe to reconstruct the master db. all logins are lost after that operation. sde amd westdc dbs cannot be found in the rebuilt master db.
3. attach the original sde db and westdc db using sa as the db owner.
4. create lost logins, for example, westdc, sde, etc. Fortunately, I have backed up all these information.
5. using enterprise manager, open sde and westdc dbs, isolated users can be found under the users leaf. So we have to assign the appropriate logins to those isolated users. use commands as follow:
USE sde;
GO
sp_change_users_login @Action=’Report’;
GO
USE westdc;
GO
sp_change_users_login @Action=’update_one’, @UserNamePattern=’westdc’, @LoginName=’westdc’;
GO
the first set of commands is used to report the isolated users in database sde. the second set of commands will assign an existing login named westdc to the isolated user westdc.
6. restart the arcsde service, then arcims services. DONE!
Lessons:
We always are required to backup databases in a regular interval.

南宅影像图

最近google Earth更新了一些数据,浏览到我家的时候,发现可能是由于附近有个海事边哨,覆盖我老家的是一景分辨率较高的影像(估计是QuickBird这类),可以分辨到我们家的屋顶,剪裁下来与大家共享。

IMapPtr在vc里编译提示没定义

上午有人问在他的MFC程序里,为什么IMapPtr不能用,在编译的时候说没定义。
首先我们要明白IMapPtr是什么东西,在COM里,有一种叫智能指针(smart pointer),通过此类指针,COM可以安全地构造和析构。一般通过_COM_SMARTPTR_TYPEDEF(<interface>, __uuidof(<interface>))宏来定义,对IMap扩展后相当于:
typedef _com_ptr_t<_com_IIID<IMap, __uuidof(IMap)>> IMapPtr;
这部分工作在vc里导入 type library时完成,vc通过 #import来完成,import会自动生成 .tlh和.tli,这些typedef即在 .tlh里定义。
在ArcEngine编程中,一般在vc环境设置中include进 ArcSDK.h,和*.olb所在目录,在stdafx.h里增加 #include <ArcSDK.h>后,就可以在代码中直接用象IMapPtr这类指针了。
包括ArcSDK.h时要求事先定义ESRI_WINDOWS,这样arcsdk.h事实是调用 windows_sdk.h,编译时可能会有一些警告,可以忽略,或者通过#pragma warning(disable : 4192) 来忽略特定的警告。
 
如果上述工作后仍有问题,你应该有理由怀疑你的ArcEngine安装可能不完整了。

ArcGIS installation error 1904

With prompt like failed to register.

Solution: this is due to the embedded DEP (data execution protection). Change the parameter of boot.ini “NoExecute=OptIn” to “NoExecute=AlwaysOff” to work around this problem. After installation, please set it back to OptIn.

ArcGIS License server & firewall

为使得ArcGIS License Server通过 windows firewall 被其它机器所使用,需要如下 配置:
1. open License.dat or *.lic obtained from ESRI company,remember the port specified in the host line, commonly 27000, or 27004
2. specify the port used by arcgis.exe, for ex.
VENDOR ARCGIS PORT=1234 
(in my computer, it is 1025 by default)
3. open your firewall configuration window, add ports for manager (as item 1), 
as well as for arcgis.exe (as item 2) respectively
 
done!
 
 

arcCatalog不能通过ip address访问 sde spatial db

在arcCatalog里的spatial database connection对话框里,不能通过 ip address连接
到sde,但域名是可以的
解决方法:在本机的hosts(%system32%driversetc)文件里添加一行:
210.77.68.241 geodata #arcsde server
再在catalog里连接,使用ip或geodata都可以连接上去。

可能的原因:catalog在输入ip地址时,使用了getHostByAddr()方法,得到域名后,再
执行正常的连接(从host->ip->连接)。由于210.77.68.241这个ip没能反解得到域
名,故连接失败。
增加hosts项后,getHostByAddr可以反解得到域名是geodata,正常连接的时候,再行
解释域名到ip,从而正常连接。

评价:比较ugly的方法,如果不反解,而直接根据ip进行连接估计更好。可能是受
catalog采用的编程语言本身api的限制。

地球共享网从apache web server到iis的移植

地球共享网从apache web server到iis的移植
tong# cngis.org
 
由于服务器资源有限,地球共享网西北分节点需与我们正开发的西部数据中心同处一个服务器,而西
部数据中心的开发团队熟悉iis,并打算使用 asp.net来开发。因此我们要做的,是将地球共享网从原
来的apache环境移植到win2k3/iis。
1. 移去apache server
2. 将jdk 1.4.2_06移去,升级成jdk 1.4.2_08(这是由于西部数据中心采用的arcims server要求至
少是08以上),jsr升级到 update 6
 
3.0 备份 原tomcat下的webapps/ROOT目录下内容(由于定制主页更改过)。保留c:subCenter目录不
变。
3.1 移去 tomcat 5.0,升级成tomcat 5.5,其中jsr选定最新的 jsr 1.5.0.60(即update 6),安装
成service
3.2 将5.5下的webapps/ROOT改名为tomcat-ROOT,将3.0备份的ROOT全部移进 webapps目录下
 
4. 安装iis 6
5. 新建站点 westdc.geodata.cn,将端口号改为 8087,以后westdc.geodata.cn将通过 8087进行访问,而西部数据中心占用原有的80端口。新站点可以指向任何地方,在实际运行时,通过 jk2导至
tomcat的root目录下。我使用了 wwwroot目录。
 
6. 从tomcat.apache.org下载jakarta-tomcat-connectors-jk2.0.4-win32-IIS.zip(使用了jk2——
由于它的配置复杂,已经不被tomcat官方支持——是由于jk2支持不同端口的uri映射,如6.2
workers2.properties [uri:*:8087/*]所示,至少现在我不知道如何使用jk来达到同样的目的)
6.1 将zip包里的 isapi_redirector2.dll和install4iis.js 复制到 tomcat 5.5的bin目录下
6.2 将 tomcat 5.5/conf下的 workers2.properties改成 workers2.properties-bak,创建新的
workers2.properties,内容如下:
[channel.socket:localhost:8009]
port=8009
host=127.0.0.1
 
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009
 
[uri:*:8087/*]
worker=ajp13:localhost:8009
[uri:/tomcat-docs/*]
worker=ajp13:localhost:8009
 
7. 将westdc.geodata.cn网站暂时改名为 Default Web Site,然后cmd进入命令窗口,cd到 tomcat
5.5/bin下,执行cscript install4iis.js,将为 jk2创建必要的配置。将Default Web Site重新改回
westdc.geodata.cn。(我测试的时候,使用了 install4iis.js -s命令指定网站名,没有成功,所以
使用其缺少的网站名,创建可以成功)。创建结束后请检查如下内容:
7.1 注册表项应包括如下内容:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREApache Software FoundationJakarta Isapi Redirector2.0]
"extensionUri"="/jakarta/isapi_redirector2.dll"
"serverRoot"="C:Program FilesApache Software FoundationTomcat 5.5"
"workersFile"="C:Program FilesApache Software FoundationTomcat 5.5
confworkers2.properties"
"authComplete"="0"
"threadPool"="20"
(路径根据 tomcat所在目录不同可能不同)
7.2 在westdc.geodata.cn的属性isapi tab里应该加了 一项指向 isapi_redirector2.dll条目,名字
可以随便,比如 Jakarta Filter等
7.3 在westdc.geodata.cn下创建了一个名为 jakarta的虚拟目录,权限为脚本和可执行
7.4 在iis 6里的服务扩展里添加了 isapi_redirector2.dll,命名任意
 
8. 打开C:Program FilesApache Software FoundationTomcat 5.5webappsROOTWEB-INFclassesconfsecInfo.xml,将里面的原先的 本机ip改成 ip:8087字样
 
9. 在tomcat 5.5 /conf下的 server.xml里的 localhost Host下,添加:
 <Context path="/DCenterWebService" docBase="C:subCenterDCenterWebService" />
  
 <Context path="/Metadata" docBase="C:subCenterWebShare" />
 <Context path="/Manage" docBase="C:subCenterDataCenterM" />
 
10. 重启www服务
11. 检查 http://localhost:8087,应该已经搞定,iis从8087上收到的request会被redirect到 tomcat的 8009执行
 
12. 西部数据中心也加载了isapi_redirector2.dll(由于西部数据中心将采用arcims,而arcims是需要 jsp的支持),现在使用 80端口,且 localhost/tomcat-docs 也会被redirect tomcat下面。所以,如果没有 jk2根据端口的pattern match,那么来自任何端口的虚拟server的根目录都会被重定位到 westdc.geodata.cn下,这不是我们想要的。

arcims .net link的几种方式

至少有三种方式可以实现:
1. 通过servlet,asp.net其实是生成了servlet的url get串所需的参数。网上可以找
到一个例子,.net primer的实现就是基于这种方式。效率可能有点低。
2. arcims自身提供的.net link dll,链接进vs project refences。未在asp.net 2下
测试,未必与2.0兼容。
3. 一个意大利人开发的 .net connector 2.14,他自称是支持asp.net 2,刚才用对象
查看器检查了一下,发现对image service等几个有比较好的支持,已经实现了一些便
利的比如取得地图等方法。缺少文档,仅有的一点也是意大利文,metadata没有实现的
支持,但可通过sendrequesttoservice方法来进行get_metadata和 publish_metadata