Web绘图软件可用于巨大的栅格时间序列吗?


11

我是一位ArcGIS Desktop用户,他是第一次进入Web映射领域。遵循在GIS.SE上找到的建议,我从OpenGeo的免费教程开始。

但是,我开始意识到,大多数演示和示例都针对矢量数据。我的主要项目涉及显示300帧时间序列的5000 x 5000像素栅格。在我的台式计算机上,这些文件存储在单个5000x5000x300 16位整数BIP二进制文件中,总计约为8GB。 我的目标是能够单击一个单元(时间序列中单个栅格),并弹出一个图形,以显示该像素在300个元素的时间序列中的值。 每个时间序列图使用的栅格数据必须无损存储,尽管单击的叠加图可能是有损缓存。

(对于新手Web GIS开发人员)是否有比OpenGeo更适合此项目的内容?还是我应该继续进行此设置?

作为参考,我具有Python,Java和PHP的编程经验。我对SQL没有太多的经验。这是一个开放式项目,所以我有足够的时间学习新语言。我已经有一个Web服务器,尽管我可能不得不切换主机,因为GoDaddy在没有VPS的情况下似乎并不支持PostgreSQL。

谢谢你的帮助!

编辑:(1月13日) 我仍在寻找有关如何最好地存储3维16位整数BIP栅格并能够有效查询数据的单个z轴“列”的信息。我不想将其转换为32位格式(因为这会使文件大小从当前的16位格式增加一倍)。


2
能否将PostgreSQL / PostGIS放在Web服务器上?-强烈建议您拥有自己的服务器,除非您正在寻找可扩展的选项,否则可能选择Amazon AWS(EC2关系数据库AMI)aws.amazon.com/running_databases
Mapperz

1
根据此线程,我的主机(GoDaddy)不支持PostgreSQL 。我真的不需要可伸缩性-这个项目主要是为了使一些同行研究人员比发送8GB文件并将其加载到ENVI中更容易访问我的数据。
dmahr 2012年

1
如果您正在考虑使用新主机,则我不建议您高度推荐Webfaction。他们提供了postgresql / postgis1.5,但是对于栅格功能,您可能需要postgis2.0。这也是在共享主机上。
djq 2012年

Answers:


6

编辑:(1月13日)我仍在寻找有关如何最好地存储3维16位整数BIP栅格并能够有效查询数据的单个z轴“列”的信息。我不想将其转换为32位格式(因为这会使文件大小从当前的16位格式增加一倍)。

查询这样的栅格应该不会真正带来大问题。您可以使用所有程序语言直接读取二进制数据,并且访问速度很快。只需确保以一种文件格式存储数据,该文件格式会将所有元数据存储在一个单独的文件中。BIP就是这样的格式

例如在php中,假设文件是​​行主要顺序(否则切换x和y),其中$ x和$ y在网格中的位置(从0开始计数),$ nx,$ ny和$ nz为像素数每个维度,$ nb个每个网格单元的字节数:

$fp = fopen('yourfile.bil', 'r');

fseek ($fp, $nz*$nb*($y*$nx +$x))//this is a very fast operation
// read some data
$data = fread($fp, $nz*nb);//this is also very fast

只需确保您访问了正确的像素:计数是否从左上方开始,...

一些额外的信息:读取数据后,应将其转换为浮点数。例如:

$dataf=unpack("f*", $data);
print_r($dataf);

如果您的主机不支持上传大文件,则可以例如将bip文件拆分为8个bip文件。

有关我将如何处理网站其余部分的更多信息:由于您的数据是静态的,因此可以使用gdal2tiles和openlayers生成一个小的mapviewer。http://www.gdal.org/gdal2tiles.html 实际上,由于您说“我确实不需要可伸缩性,因此该项目主要是为了使一些同行研究人员比发送数据更容易访问我的数据。 8GB文件并将其加载到ENVI中。”您甚至可以不使用webgis工具箱而做:只需让您的用户点击图片并捕获坐标即可:http//www.emanueleferonato.com/2006/09/02/click -image-and-get-coordinateswith-javascript /

(尽管您应该找到一种很好地呈现5000x5000图片的方法)


太棒了,这对澄清很有帮助。后续行动:我应该将此二进制文件存储在PostGIS中吗?我只是想避免服务器必须先将整个二进制文件从数据库中拉出,然后再使用PHP或Python查询它的情况。那将是非常缓慢的一步。
dmahr 2012年

否,该文件应位于文件系统上。使用数据库毫无意义。即使只是打开一个连接,也可能比上面的代码花费更多的时间。
johanvdw 2012年

7

这看起来像三个独立的问题:一个是基础架构,一个是架构,另一个是事件处理。我将提出一种可能的方法,但我的回答必定是笼统的。

基础设施

我建议为服务器使用诸如Linode(www.linode.com)之类的VPS托管服务。这样,您就可以完全(即具有root权限)访问由专业维护的服务器-无需担心电源中断或失去与Internet的连接。

建筑

这里有太多的选择,以至于它真的让人难以承受。例如,我使用GeoServer和OpenLayers运行了两个系统。GeoServer由Tomcat 7提供服务。OpenLayers / jQuery前端由Apache2提供服务。您可以包括Postgres / PostGIS来存储矢量数据,但这不是栅格数据的好选择。您也可以使用Django或什至web.py(http://webpy.org/)来建立Python系统,以使用相当简单的控制器。GeoServer可让您以以下格式存储栅格数据:

  • ArcGrid-弧形网格覆盖率格式
  • GeoTIFF-具有地理信息的标记图像文件格式
  • Gtopo30-Gtopo30承保范围
  • ImageMosaic-图片镶嵌插件
  • WorldImage-带有空间数据文件的栅格文件

事件处理

当用户单击地图时,您想在该点弹出现场数据的时间序列图。首先,设置一个可以用Python或Java编写的控制器,该控制器侦听纬度和经度的url请求。该控制器返回服务器上渲染的静态图像或客户端(jQuery)可以将其转换为绘图的json数据。

接下来,要在地图上获取XY数据,您可以使用以下函数(请参见http://dev.openlayers.org/releases/OpenLayers-2.11/examples/click-handler.html):

onClick: function(evt) {
    var clickSpot = evt.xy;
    // pass clickSpot to the controller ...
}

希望对您有所帮助。


感谢您的来稿!您是否曾经使用过任何一种文件格式来制作尺寸超过8GB的三维栅格?我知道GeoTIFF不能超过4GB。服务器软件是否能够有效查询单个z轴时间序列的数据?
dmahr 2012年

看一下图像金字塔。这可能有助于解决文件大小问题。处理click事件时,您的代码(控制器)将接收XY数据,然后从300张带时间戳的图像中搜索并提取z值。这需要大量的处理和磁盘IO,因此可能需要很长时间。如果该“强力”方法花费的时间太长,那么您可以考虑使用其他算法和/或时间序列存储方案。
katahdin 2012年

是的,“强力”方法会比我想要的慢(在台式机上甚至更慢)。我想我对围绕我能找到的最佳替代存储方案构建整个Web映射服务感兴趣。
dmahr 2012年

1

如果我正确理解了您的问题,则可以使用MapServer创建时间WMS服务。

这样,很容易显示每个日期时间的正确栅格(使用GetMap请求),并请求给定日期时间范围内的像元值(使用GetFeatureInfo请求)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.