使用openlayers调用本地瓦片数据方案

Posted: December 31st, 2010 | Author: laomi | Filed under: 开发日志 | Tags: , | No Comments »

身边经常有一些朋友在与GIS项目的时候抱怨没有地图数据,而实际上他们在做具体的应用的时候常常仅仅是需要一个地图来使得应用程序变得更漂亮。以前自己也遇到过一些这些问题,在08年公司做兼职的时候,就行开发一个离线的GIS数据包,这些的话,对于一些小型的应用程序就不用花大笔的钱去购买地图数据。

对于以上的问题,大家常常采用的是两种解决方案:一种解决方案就是直接使用一些第三方数据服务,例如Google maps 或者是MapABC的API来实现自己的功能,这种方法开发比较简单,很容易上手,但是一个重要问题就是给一些不能上网的客户来说,这样的开发方式就不适合了;另外一种方式就是让客户购买地图数据去支持应用程序,这样的方式用户需要花一些钱去购买地图数据(我以前在做项目的过程中,由于地图数据量不是很大,所以也可以用一些基础图层,然后再加上一些影像数据进行数字化)。其实上述的两种方式是目前大多数应用程序解决地图数据的主要方法,下面本片文章介绍第三种方式来实现(特在此申明,文章中提出的方法仅仅是提供交流和学习使用,如果使用商业用途用户自行负责)。

如果想从本地访问瓦片数据的话,首先需要解决的问题是从一些公共地图服务中获取瓦片数据。在这里将使用工具http://www.daogle.com/?page_id=66下载地图的瓦片数据。瓦片数据下载到本地之后,可以看到瓦片的数据命名“m_14_13519_6253.png”,其中m后面的14代表的目前的缩放级别,“13519”代表的是瓦片数据的横坐标,“6253”代表的是瓦片数据的纵坐标。对于Google maps用的是墨卡托投影方式,将地图投影成了一个40075016.685578488 m的正方形坐标的形式,然后根据缩放级别将这个正方形分割成不不同粒度的小正方形,这种分割的形式采用的是四叉树索引的方式进行。具体的分割如下图所示。

首先在level 0级别的时候,就是将这个正方形划分为一个256 像素的图片,如果化成米的形式的话,就是40075016.685578488的正方形,从这里可以计算出比例为:40075016.685578488/256 = 156543.033928041 (米/像素)。对于level 1级别时,然后再将这个正方形划分为一个4个256像素的正方形,此时计算出的比例为:40075016.685578488/512 = 78271.51696402 (米/像素)。 Read the rest of this entry »


arcgis server 9.3.1 rest开发学习(三)

Posted: July 21st, 2010 | Author: laomi | Filed under: 开发日志 | Tags: , , | No Comments »

arcgis server geoprocessing中简单的介绍了一下geoprocessing service中的一些相关的概念,接下来主要是按照自己以前的经验编写两个例子,一个是buffer的例子,另外一个是计算点密度分析的。在这里主要是借助ModelBuilder和geoprocesssing来完成,最后自己的例子主要是采用javascript rest开发。

首先使用的是arcgis的modelbuilder创建一个model,关于model的创建方法以及相关的资料,可以访问以下资源:

首先我们来介绍一下buffer的例子,该例子的效果是当你用鼠标在地图上点击时,然后再地图上就会创建一个缓冲区,该缓冲区的大小是可以限制的。关于缓冲区的模型的建立实际上只要将arcgis arctoolbox 中analysis tools—>proximity–>buffer拖拽到model builder中,然后设置输入、输出参数(如下图所示,其中p就是已经设置了参数,可以很据箭头的方式来判断输入输出参数,其实这个是在创建一个toolbox中已经设计好的)。下图是一个已经完全建立好的model,剩下来只要将这个model发布成一个geoprocessing service就行了。

Read the rest of this entry »


arcgis server 9.3.1 rest开发学习(二)

Posted: July 3rd, 2010 | Author: laomi | Filed under: 开发日志 | Tags: , , | No Comments »

arcgis server 9.3.1 rest开发学习(一)中已经描述了rest开发的简单的例子,主要是在地图加载的时候在地图上添加了点数据,在此例中清楚了rest  javascript开发的一些对象。在这部分主要接触的是在使用queryTask查询地图中的数据,并以柱状图的形式显示出来,在这里需要接触两个知识,一个是querytask,另外一个是使用dojo来实现柱状图。

也许你要问一下为什么使用的是dojo,而不是其他的JavaScript的包,其实其他的包也完全没有问题,你甚至是可以使用Google Chart 服务来完成这部分工作,我之所以使用dojo的主要原因是arcgis rest javascript sdk用的也是dojo的包。

esri.tasks.QueryTask对象就是对一个ArcGIS Server REST 链接(这里面的链接通常是一个图层,例如http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/3)执行一个查询任务。通过下面的图我可以知道,关于QueryTask的执行是在一个图层上进行的。QueryTask执行的主要步骤:

  1. 初始化一个map,然后添加一个图层,这个图层主要是作为背景图层显示的
  2. 初始化一个QueryTask对象,参数是一个utl,这个url制定为一个mapservice的Layer,例如上面所说的http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/3
  3. 初始化一个query(esri.task.Query)对象,对于query对象中主要做的是对查询条件的设置,返回结果设置等。
  4. 设置信息显示窗口的大小。
  5. 如果有Geometry对象返回的话,设置Geometry对象的样式。 Read the rest of this entry »

gdal中的ogr配置

Posted: June 27th, 2010 | Author: laomi | Filed under: 开发日志 | Tags: , , | No Comments »

最近在写一个spatial association rule的代码,选择的语言是用c/c++来编写,由于这个算法中需要用到空间关系计算这一块,所以需要选用一个能够计算空间关系的库来完成这一部分工作(既然已经有了现成的工具,没有必要自己再去开发一个了),在这里我们选择的是gdal中的ogr

The OGR Simple Features Library is a C++ open source library (and commandline tools) providing read (and sometimes write) access to a variety of vector file formats including ESRI Shapefiles, S-57, SDTS, PostGIS, Oracle Spatial, and Mapinfo mid/mif and TAB formats.
OGR is a part of the GDAL library.

通过官方网站上的介绍我们可以知道ogr的主要作用是一个对矢量数据的解析和操作的库,然后我再根据我们的需求(解析shapefile以及求出shapefile中的geometry中的空间关系,例如:距离关系、拓扑关系等),我们知道了它能够很好的满足我们的需求,说到这我当时觉得这已经不是什么很困难的问题了,所以自己就准备开始做了。

自己以前也没有用过c/c++写过什么程序,基本上也就是一些简单的数据结构和算法,发现自己对于如何将这个库引用到工程文件中来也是没有什么办法,自己甚至土鳖的将这些源码直接拷到工程文件中去编译,当时也是报了很多的错误。幸好在这个信息时代有Google(百度对于技术类的文章搜索还是没有google那么的强大,起码从我的经验来看是这样的),自己从网上也搜集了一些资料,这里总结具体的编译步骤如下:

由于我们需要空间关系的运算,所以我们需要将geos下载下来,因为在编译gdal的时候它会需要geos的库:

首先需要设定编辑环境,这里我们用的是vs2008,所以设置如下:

D:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat 拖至控制台用进行运行,这样的话,将系统的c++编辑环境设置为vc的编辑环境

编译geos:

1、GEOS 网站下载最新版本geos-3.1.1.tar.bz2 ,同时svn登录http://svn.osgeo.org/geos/trunk,下载geos-svn 版本,
2、解压缩geos-3.1.1.tar.bz2 ,从svn版本中复制nmake.opt,autogen.bat
3、If you use Microsoft Visual C++ (7.1 or later) compiler, you can build GEOS using NMAKE program and provided makefile.vc files:

autogen.bat
nmake /f makefile.vc MSVC_VER=1400

编译gdal Read the rest of this entry »


arcgis server geoprocessing

Posted: June 21st, 2010 | Author: laomi | Filed under: 开发日志 | Tags: , , , | No Comments »

以前对于arcgis只是给美国那边解决一些简单的小问题,毕竟那边没有什么专门的人来做arcgis开发,最近自己这边的设计也快出来了,开始准备开始做系统开发,从目前的开发框架上来说,自己还主要是学习使用rest的方式来开发arcgis中的功能。之所以选择rest开发主要有两个原因:第一是项目的具体需求需要;第二的原因是arcgis server的rest开发方式实现了我多年梦寐以求的GIS开发模式。其实这arcgis最有魅力的地方还是arcgis server中的geoprocessing的部分,如果你选择了使用这种开发模式的话,我相信你的代码量将会减少到只有原来的三分之一左右,如果是要是需要arcgis中多个功能之间进行组合的话,那这样的方式更适合你。

想要了解arcgis server中的geoprocessing service 的话,首先应该了解是arcgis desktop中的arctoolbox和ModelBuilder部分,因为要使用geoprocessing service需要发布的是arctoolbox,在实际调用的时候只要根据参数和服务地址来调用相应的服务。自己在学习这方面的资料的时候看的资料都是零零散散的,只有在youku上看见了一个arcgis的培训视频之后才慢慢的明白其中的一些意思。

首先介绍一下modelbuilder,打开一个arcmap或者是catalog,然后打开arctoolbox中新建一个arctoolbox,然后你可以之间将相关的arcmap中的一些arctoolbox中的一些功能直接拖拽到你新建的modelbuilder中去,这样发布出去的geoprocessing服务与具体的地图没有关系,这样发布出来的服务能够被任何应用程序调用,不过需要对于数据的输入输出必须得满足您所选择的开发模式。具体的数据支持请参考:input and output data types,大家目前习惯的开发模式为rest开发方式,而且很多的事情是直接在web应用中去调用geoprocessing service的服务。

对于geoprocessing service的服务发布存在两种方法,第一种是直接使用arcgis server manager来发布服务,一般来说如果是仅仅简单的进行发布一个geoprocessing service的话,那直接在新建service中新建一个geopeocessing service;另外一种发布geoprocessing service的方式是使用catalog的方式进行部分。 Geopeocessing service 其实有三种:

  • A geoprocessing service
  • A geoprocessing service with a source map document
  • A geoprocessing service with a result map service

关于三种service的大概可以理解成: Read the rest of this entry »