Web处理服务(WPS)管道选择

本教程将向您展示如何:

  1. 获取一组推特数据。

  2. 使用Geoserver Web处理服务(WPS)生成时间内插查询。

  3. 从Geoserver层查询结果并将结果保存到Geoserver层。

引言

时间内插查询查找在两者中相交的要素 space and time 。常规空间或时间查询选择落在指定几何图形和/或时间范围内的要素。随着您在时间上向前移动,时间内插查询具有不断变化的几何图形。

想象一下,您正在从华盛顿特区前往纽约市,并且对同时旅行相同路线的人感兴趣。这些旅行者在旅途中的任何时刻都会与你保持一定的距离。当你到达纽约时他们就不会在华盛顿了。因此,查询结果的几何形状为 a function of time

时间内插查询比正常的空间或时间查询更复杂,因为输入是具有不断增加的时间属性的点或线的序列。时间内插查询通俗地称为 tube selects

先决条件

确保您已完成中描述的步骤 安装 《GeoMesa用户手册》的一节,特别是与Acumulo相关的任务。之后,可能需要更改本教程使用的Acumulo和Hadoop版本。完成展开教程后,您应该具备:

  • 累积式运算的一个实例 2.0 or 2.1 在Hadoop上运行 2.8 or later ,

  • 访问同时具有CREATE-TABLE和WRITE权限的Acumulo用户,以及

  • 安装了GeoMesa插件的Geoserver 2.5.2的实例。

由于本教程需要构建自定义Java代码,因此还应该安装和配置开发工具:

使用Geoserver插件

安装完毕后,您应该会看到“geomesa:TubeSelect”出现在 WPS Request Builder ,它位于 Demos Geoserver Web管理界面左侧菜单栏中的链接。

“geomesa:Tube选择WPS插件”

“geomesa:Tube选择WPS插件”

下载并构建教程代码

克隆 geomesa 项目并构建它,如果您还没有:

$ git clone https://github.com/locationtech/geomesa.git
$ cd geomesa
$ mvn clean install

这是在本地Maven存储库中安装GeoMesa JAR文件所必需的。有关更多信息,请参阅 GeoMesa Accumulo Quick Start 教程。在本教程中,我们将使用来自公共Twitter API的Twitter数据,并使用使用 GeoTools -基于 FeatureSource 吞食进格罗梅萨。首先,检查代码并查看它:

$ git clone https://github.com/geomesa/geomesa-twitter
$ cd geomesa-twitter

要构建该项目,请运行以下命令:

$ mvn clean install

收集推特数据

警告

为下面的分析收集足够大的Twitter数据集需要几个小时。

这个 twitter-collect 模块收集 Twitter JSON格式的数据并将其写入本地文件。要运行该代码,您需要一个Twitter帐户以及访问令牌。进入https://apps.twitter.com/的推特开发应用管理控制台,创建一个新的应用,然后进入“密钥和访问令牌”页面,生成一个“访问令牌”。消费者API密钥、消费者机密、访问令牌和访问令牌机密都是运行收集过程所必需的。

运行该程序:

$ java -jar twitter-collect/target/twitter-collect-accumulo1.5-1.0-SNAPSHOT.jar \
    --consumerKey <CONSUMER_KEY> \
    --consumerSecret <CONSUMER_SECRET> \
    --outputDir ./tmp \
    --secret <ACCESS_SECRET> \
    --token <ACCESS_TOKEN>

这将收集实时Twitter数据并将其保存在 tmp 子目录;这将无限期地收集数据,直到它被中断。

摄取推特数据

这个 twitter-ingest 模块接受一组JSON文件。

该模块中有三个类:

  • Runner :提供用于处理命令行参数分析的Main方法

  • TwitterFeatureIngester: Inserts features into GeoMesa using a GeoTools FeatureSource

  • TwitterParser :解析Twitter JSON文件并将其转换为 SimpleFeature S

运行摄取程序:

$ java -jar twitter-ingest/target/twitter-ingest-accumulo1.5-1.0-SNAPSHOT.jar \
    --featureName <featureName> \
    --tableName <tableName> \
    --instanceId <instance> \
    --user <user> \
    --password <password> \
    --zookeepers <zookeepers> \
    tmp/20151201/20151201-090959.txt

哪里 <featureName> 要创建的SimpleFeatureType的名称, <tableName> 要使用的GeoMesa目录表的名称,以及 <instance><user><password> ,以及 <zookeepers> 才能连接到Acumulo。最后一个参数是由创建的Twitter JSON文件的名称 twitter-collect 模块。

获取数据后,在Geoserver中根据获取到GeoMesa的数据创建数据存储和图层(请参阅 VISUALIZE DATA WITH GEOSERVER 部分的 GeoMesa Accumulo Quick Start tutorial 有关如何执行此操作的更多详细信息)。

有关解析Twitter JSON数据的详细信息

从twets流返回的JSON对象记录在 Twitter developer site 。在本教程中,我们将对以下领域感兴趣:

  • coordinates: a geoJSON 带有经度/经度的对象(不要使用不推荐使用的 geo 字段)

  • user :用户对象

  • id :用户ID

  • name :用户名

  • id :推文ID

  • created_at :创建推文的时间

  • text :推文正文

Twitter JSON如下所示:

{
  "retweeted" : false,
  "source" : "web",
  "favorited" : false,
  "coordinates" : {
    "coordinates" : [
      -75.14310264,
      40.05701649
    ],
    "type" : "Point"
  },
  "place" : null,
  "retweet_count" : 0,
  "entities" : {
    "hashtags" : [],
    "user_mentions" : [
      {
        "name" : "Twitter API",
        "indices" : [
          19,
          30
        ],
        "id" : 6253282,
        "id_str" : "6253282",
        "screen_name" : "twitterapi"
      }
    ],
    "urls" : []
  },
  "truncated" : false,
  "in_reply_to_status_id_str" : null,
  "created_at" : "Wed Feb 29 19:42:02 +0000 2012",
  "contributors" : null,
  "text" : "Man I like me some @twitterapi",
  "in_reply_to_user_id" : null,
  "user" : {
    "friends_count" : 5,
    "follow_request_sent" : null,
    "profile_sidebar_fill_color" : "ffffff",
    "profile_image_url" : "https://a1.twimg.com/profile_images/1540298033/phatkicks_normal.jpg",
    "profile_background_image_url_https" : "https://si0.twimg.com/profile_background_images/365782739/doof.jpg",
    "profile_background_color" : "C0DEED",
    "notifications" : null,
    "url" : "https://blog.roomanna.com",
    "id" : 370773112,
    "is_translator" : false,
    "following" : null,
    "screen_name" : "fakekurrik",
    "lang" : "en",
    "location" : "",
    "followers_count" : 8,
    "statuses_count" : 142,
    "name" : "fakekurrik",
    "description" : "I am just a testing account, following me probably won't gain you very much",
    "favourites_count" : 1,
    "profile_background_tile" : true,
    "listed_count" : 0,
    "contributors_enabled" : false,
    "profile_link_color" : "0084B4",
    "profile_image_url_https" : "https://si0.twimg.com/profile_images/1540298033/phatkicks_normal.jpg",
    "profile_sidebar_border_color" : "C0DEED",
    "created_at" : "Fri Sep 09 16:13:20 +0000 2011",
    "utc_offset" : -28800,
    "verified" : false,
    "show_all_inline_media" : false,
    "profile_background_image_url" : "https://a3.twimg.com/profile_background_images/365782739/doof.jpg",
    "default_profile" : false,
    "protected" : false,
    "id_str" : "370773112",
    "profile_text_color" : "333333",
    "default_profile_image" : false,
    "time_zone" : "Pacific Time (US & Canada)",
    "geo_enabled" : true,
    "profile_use_background_image" : true
  },
  "id" : 174942523154894848,
  "in_reply_to_status_id" : null,
  "geo" : null,
  "in_reply_to_user_id_str" : null,
  "id_str" : "174942523154894848",
  "in_reply_to_screen_name" : null
}

我们使用以下命令手动解析此对象 GSON (google-json) 。或者,您可以为gson创建Java对象绑定,并将整个tweet解析为一个对象。有关连接到Twitter公共流的更多信息,请查看 Twitter Public Stream website

创建Web处理服务(WPS)请求

WPS构建器将为我们提供一个样例XML文档,作为执行管选择的起点。输入我们想要的值,然后单击“生成XML”按钮生成请求文档,我们将另存为 tube-select.xml 以备日后使用。

“从输入生成XML”

“从输入生成XML”

链接过程

WPS支持链接其他WPS进程。这在从现有层选择数据或将数据存储回Geoserver以创建新层时非常有用。Geoserver用户指南中有一节介绍 Process Chaining

管材选择

使用图层作为输入

在这个演示中,让我们假设某人正在沿着新泽西收费公路从德州威尔明顿前往宾夕法尼亚州费城北部,并且正在发推特。每条推文都会有一个GPS坐标和一个时间戳,这样我们就可以推断这个人在收费公路上以每小时55英里(25米/S)的速度行驶。该轨迹是为我们的查询定义“管”几何体的输入。使用 maxSpeed 25米/S和a maxTime 我们将创建一个120秒的空间/时间查询管。以下是Geoserver对可能的轨迹进行的渲染:

《地铁特写》

《地铁特写》

使用JSON作为输入

您可以手动定义输入,而不是使用图层作为输入 FeatureCollection track with JSON using GeoJSON 。这些功能需要一个独特的 id 一种 geometry 对象和一个名为 dtg 表示要素的观测时间。下面显示了我们的两个输入跟踪点的示例:

 <wps:Input>
    <ows:Identifier>tubeFeatures</ows:Identifier>
    <wps:Data>
         <wps:ComplexData mimeType="application/json">
            <![CDATA[
            {
               "features" : [
                    {
                        "id" : "0",
                        "geometry" : {
                            "coordinates": [-75.6002273 , 39.669456],
                            "type" : "Point"
                        },
                        "type" : "Feature",
                        "properties" : {
                            "dtg" : "2014-05-17T15:33:16.000+0000",
                        }
                    }, {
                        "id" : "1",
                        "geometry" : {
                            "coordinates": [-75.5102991 , 39.6857254],
                            "type" : "Point"
                        },
                        "type" : "Feature",
                        "properties" : {
                            "dtg" : "2014-05-17T15:39:28.000+0000",
                        }
                    }
               ],
               "type" : "FeatureCollection"
            }
            ]]>
        </wps:ComplexData>
    </wps:Data>
</wps:Input>

发布查询

创建管查询XML后,我们可以使用以下命令将其发布到Geoserver curl

$ curl -u admin:geoserver -H 'Content-type: xml' -XPOST -d@'/tmp/query.xml' http://localhost:8080/geoserver/wps | json_pp

在此请求中,结果变量的MIME类型设置为 json 在我们的文件中 query.xml

<wps:ResponseForm>
  <wps:RawDataOutput mimeType="application/json">
    <ows:Identifier>result</ows:Identifier>
  </wps:RawDataOutput>
</wps:ResponseForm>

我们用管道把输出输送到 json_pp ,它将很好地打印输出(本机包可用于大多数Linux发行版)。

将输出另存为图层

链接您的结果 gs:import Process允许您将您的层存储回GeoMesa,从而允许您渲染层。下面我们创建了一个带有贴图的层组合,我们的原始管轨,以及我们的结果 maxSpeed 25米/S和 maxTime S。这些层是 mapproxy:globe.osm.toneraccumulo:njtrack ,以及 accumulo:nj120

http://localhost:8080/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=mapproxy:globe.osm.toner,accumulo:njtrack,accumulo:nj120&styles=&bbox=-75.62390877,39.65103897,-74.81563784,40.04023423&width=1440&height=960&srs=EPSG:4326&format=application/openlayers
“25米试管成绩/S 120秒”

“25米试管成绩/S 120秒”

调整参数

最大速度、最大时间、缓冲区大小

调整 maxSpeedmaxTime 参数将从空间和时间两个方面增加管的大小。通过增加这些参数,输入轨迹可能会到达时间或几何体上更远的要素。下面,我们已经加倍了我们的 maxTime 给240名S创造了一个更宽的管子。也许我们的朋友走出了高速公路,去了一家餐馆或加油站。我们想解释一下这种可能性。再一次,一个被锁住的 gs:import 命令已将该层存储为 nj240

http://localhost:8080/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=mapproxy:globe.osm.toner,accumulo:njtrack,accumulo:nj240&styles=&bbox=-75.62390877,39.65103897,-74.81563784,40.04023423&width=1440&height=960&srs=EPSG:4326&format=application/openlayers
“地铁成绩25米/S 240秒”

“地铁成绩25米/S 240秒”

缝隙填充

许多输入轨迹可以是稀疏的。我们这位开着收费公路的朋友并不是每隔5秒发一次推特。选择一个 gapFill 方法填充这些缺失的轨迹。在本教程中,我们使用 line 用于填充缺口的选项。的可用选项 gapFill 方法有:

  • none -当您有密集的磁道时使用

  • line -在两点和两点之间绘制一条线,并使用这两点的时间范围

超越卷曲

WPS服务还可以由各种客户端访问,包括 OpenLayers ,它已经实现了 JavaScript WPS Builder 教程类似于Geoserver内置的教程。