云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

网站空间_用友不能登录到服务器_企业0元试用

小七 141 0

我在清理衣柜里的东西。多年来,我已经做了大量的技术概念验证应用程序,大多数都是在HANA或SAP云平台上。所有这些都被写进了一步一步的"操作指南",但是很少有人找到了自己的方法,进入了公共领域。

是时候改变了。

这个博客并不是一个完整的端到端的例子,而是一个使用HANA spatial和一些物联网传感器的应用程序的经验教训列表。嗯,什么叫云,有点像。中间物联网。我们从未使用过SAP-CP物联网功能,只是某个地方的本地平台——它配备了一些不错的API。但这并不重要。

用例

我们有一堆物联网传感器,配备了GPS和Wifi等。它们被设置为以特定的间隔"ping"它们的位置。我们想追踪他们,或者更重要的是,我们想知道他们是否在他们应该在的特定位置。我们想在UI5应用程序中展示这一点。

传感器,在我同事办公桌的抽屉里(抽屉在大楼里)。顺便问一下:为什么停车场没有车?照片一定是在星期天拍的……

传感器(顺便说一下,来自一家叫做iTraq的公司)将其位置数据发送到本地平台(如"非SAP-CP")。在我们的SAP-CP应用程序中,我们将定期对ITRAQAPI执行REST调用(一个预定的cron作业)以检索数据。这就是我所说的"物联网"。物联网就在那里,只是不在我们的应用程序中。

在HANA DB中存储空间数据

我不打算多谈前端应用程序—它超出了我们的范围。我们想把重点放在空间数据上。为了检索我们设备的数据,我们调用上面提到的API,并获得每个设备的"状态报告",坐标显示位置。我们把它塞进一个HANA数据库:

这里,我们有两个表;一个用于区域(我们将在其中存储设备应该驻留的位置),另一个用于设备本身。区域是多边形(形状),而设备有一个点作为其位置。

ST_几何体和ST_point列被定义为SRID 4326,这是(除其他外)Google使用的最常见的空间参考系统标识符之一。

请记住"4326"。几分钟后它将变得非常重要。

关键学习#1:带有空间数据的HANA表不能作为XSOdata服务公开

相反,它们必须嵌入UDF(用户定义函数)并包装在计算视图中。事实上,如果您尝试在计算视图中直接使用包含空间列的表,该视图将很好地激活—但是您不敢将其公开为XSOdata服务—一切都将崩溃!

有点。如"the.xsodata service will not activate".

相反,我们必须求助于一种解决方法:创建一个表函数(UDF),将空间列转换为JSON对象–使用STèAsGeoJSON函数,在计算视图中使用表函数,并将此视图作为服务公开。

我们的表函数(UDF):

请注意空间列("区域")到JSON对象的转换。

由于我们不能将表函数直接作为odata服务公开(HANA 1的另一个缺点),下面是嵌入UDF表函数的计算视图:

密钥学习#2:在Web IDE中(直到HANA 2 sp1),在计算视图节点中看不到UDF的元数据

正如细心的读者所注意到的,这个计算视图是使用HANA Studio创建的。这是由于HANA 1(以及HANA 2到SPS1)的另一个缺点造成的,这次在浏览器IDE中:在calc视图节点中使用自定义项无法调出元数据…换句话说:您将看不到列!)

如前所述,解决方案是使用好的老HANA工作室。创建计算视图,将自定义项添加到节点,映射所需的列,保存,然后在浏览器IDE中打开计算视图(或者继续使用HANA Studio)。

现在,我们可以将自定义项作为XS OData服务公开:

密钥学习#3:某些空间函数不适用于SRID 4326

还记得4326吗?我们选择的SRID(因为,嘿,Google也使用它,所以我们可以将我们的值存储在srid4326中(除了Google混合了经纬度并颠倒了它们的顺序-一定是一些聪明的贸易壁垒方案,我知道什么))。好吧,让我们做一些简单的事情:使用一个或两个HANA spatial函数来处理我们的空间数据,看看我们是否可以打破某些东西。

让我们从一个小的"热身"练习开始:只需从表中选择列,使用ST_asWKT()函数将区域转换为"已知文本":

选择区域。"id"作为id,区域。"name"作为名称,区域。"area".ST\u asWKT()作为区域自我们的空间包.BoxTracker.data::BoxTracker.区域"区域;

结果:

不错。我们可以看到"面积"列确实是一个多边形。但是,如果我们尝试在多边形上使用stu-WITHIN函数,大数据局,它将失败:

选择区域。"id"作为id,区域。"name"作为名称,新stu点('点(0)')。stu-WITHIN(区域。"区域")作为WITHIN-from我们的空间包.BoxTracker.data::BoxTracker.区域"区域;

由于坐标(0,0)肯定不在多边形区域内。对吗?

结果:

近距离观察错误(看它有多难看?):

完整错误读取: