FME学习之旅---day26

文章讲述了如何使用FME工具处理JSON数据,包括读取、转换(如从WKT到ShP)、提取坐标、空间化、样式设置,以及如何编写简单的和嵌套的GeoJSON。还介绍了如何从API获取JSON数据并提取所需信息,以及将JSON转换为Excel格式的过程。
摘要由CSDN通过智能技术生成

我们付出一些成本,时间的或者其他,最终总能收获一些什么。

【由于上周,上班状态不是很好,事情多又杂,没有学习的劲头,就短暂的休息了一下下。双休爬山,给自己上了强度,今天才缓过来,下周又是五一了,估计要到五一后过渡一下,学习的劲头又能恢复了】

教程:JSON 入门

本教程系列概述了如何使用 FME 读取、写入和转换 JSON 数据。

【由于工作的需要,会频繁的使用到json文件中存储的wkt格式的坐标数据,需要将其转换成shp;或者人工确定json中某一固定属性对应的值等一些重复枯燥的人工核实任务,所以想看一下FME中能否有较好的解决方法】

阅读JSON

JSON 读取器自动模式

1. 打开 FME Workbench 并添加 JSON 读取器

2.将 JSON 读取器架构扫描模式更改为 JSON 查询

表视图”将报告数据没有架构,但使用“要素信息窗口”会显示列表属性。仅包括天气的子数据,而不包括机场、城市等父数据:

从 JSON 中提取位置

        案例中涉及的主要是将json中的点坐标暴露后,进行点要素的空间化,设置相关的样式,导出为KML格式。

1.添加JSON相关的读模块

根据教程中的下载相应的json数据,添加到读模块中

设置参数时,Schema Scan Mode为Auto(自动)

2.使用AttributeCreator将未暴露的坐标进行暴露,也可使用 AttributeExposer 转换器进行暴露

3.使用VertexCreator转换器,进行点坐标的空间化

4.使用CoordinateSystemSetter转换器,进行坐标系的设置,将坐标系定义为LL84

5.使用KMLPropertySetter转换器,设置fields.totalunits为点的标签

KMLPropertySetter转换器说明:为一组输出到 OGCKML 写模块的矢量和栅格要素,设置公共的属性

6.使用KMLStyler转换器,对样式进行设置

KMLStyler转换器说明:为一组输入到OGCKML写模块的要素创建公共样式。

7.添加KML写模块,属性定义采取自动的模式

没有安装谷歌地球,直接在FME中空间化的效果。

高级 JSON 读取

1.使用JSON读模块读取,读取floods.json文件

其中,items{}.floodArea.polygon 属性中存放了json文件的相关地址

我们必须提取链接到多边形数据的 URL,并使用它们将几何体读取到我们的工作空间。

对读模块的参数进行设置,将Schema Scan设置如下

对读模块进行预览,能看到floodArea.polygon已经被公开。

2.使用FeatureReader转换器

FeatureReader转换器说明:

“生成输出端口”对话框将询问您是否要提供用于生成输出端口的数据集,但在本例中,我们不需要这样做,因此我们可以单击“取消”。

示例中添加了KMLStyler转换器和KML写模块,上个例子中已经学习过,就直接使用Inspectors进行查看。

编写 JSON

JSON 编写器提供了一种快速简便的方法来将数据转换为 JSON 格式。但是,它只适合编写不嵌套的平面 JSON。

分布说明

第1部分:编写JSON

1.读模块读取Excel文件,publicart.xlsx

点击参数,可以看到Excel表的详情

2.添加写模块

添加JSON写模块,在参数设置中,进行如下修改。

3.在notepad++中显示输出的json文件

这一点说明,FME 的 JSON 编写器最适合用于不需要嵌套的情况。

第2部分:编写GeoJSON

GeoJSON 是一种 JSON 规范,用于处理地理数据的几何编码。

使用 JSONTemplater 编写 JSON

文章详细介绍了如何使用 JSONTemplater 和文本文件编写器编写嵌套JSON。

1.首先查看提供JSON文件publicart.json,是比较简单的并列结构,无嵌套

在FME中是如下的显示

2.添加Sampler转换器

Sampler转换器说明:根据Sampling Type选项的选择,来保留要素的全部或者要素

的一个抽样。
3.添加JSONTemplater
构建ROOT模板、NEIGHBORHOOD模板和ART模板
涉及到JSON模板表达式管道,管道是动态对象构造表达式 ||
ROOT模板:
{|
    fme:process-features("NEIGHBORHOOD")
|}

NEIGHBORHOOD模板:

{
    fme:get-attribute("Neighborhood") : [
        fme:process-features("ART", "Neighborhood", fme:get-attribute("Neighborhood"))
        ]
}

ART模板

{
    "Name" : fme:get-attribute("Name"),
    "Title" : fme:get-attribute("Title"),
    "Latitude" : fme:get-attribute("Latitude"),
    "Longitude" : fme:get-attribute("Longitude")
}

4.添加JSONFormatter

JSONTemplater直接输出的JSON文件,未进行格式化阅读起来较为困难,可以使用JSONFormatter转换器对JSON文档进行格式化。

打开其参数并将 JSON 文档设置为 _result。然后,将“输出属性”设置为“text_line_data”。此属性名称保留用于使用文本文件编写器进行编写时使用。

第 1 部分:阅读简单消息

我们将使用 HTTPCaller 从 MetaWeather API 读取 JSON 消息,然后提取天气状态。此示例将展示从 JSON 消息创建属性的两种方法。首先,我们将使用 JSONFlattener 展平 JSON 以公开所有属性。其次,我们将使用 JSONExtractor 通过查询提取 JSON 的特定部分。

1.添加Creator转换器

2.添加 HTTPCaller转换器

在 HTTPCaller 参数中,粘贴以下 URL 作为请求 URL,并将 HTTP 方法设置为 GET:

https://www.metaweather.com/api/location/9807/

2.添加 AttributeFileReader

如果 API 关闭,请将 AttributeFileReader 添加到 HTTPCaller 的 Rejected 端口。这将读取本文的“文件”部分中提供的本地vancouverweather.json文件。
打开 AttributeFileReader 参数,将“源文件名”设置为vancouverweather.json路径,然后将“文件内容”更改为“_response_body”。我们将使用系统默认编码。

【主义其中的编码方式要改为上述的System Default,否则到JSONFlattener转换器会报错】

3. 选择要保留的属性

我们只对保留 HTTPCaller 或 AttributeFileReader 的 _response_body 属性感兴趣。将 AttributeKeeper 转换器添加到 HTTPCaller 输出端口和 AttributeFileReader 输出端口。在参数中,将“保持”属性设置为“_response_body,然后单击”确定“。

4. 使用 JSONFlattener 创建属性

为了访问单个属性,例如天气状态和温度,我们需要扁平化 JSON。添加一个 JSONFlattener 转换器并将其连接到参数 AttributeKeeper,为 JSON 文档选择_response_body。

在启用功能缓存的情况下运行工作区,然后在 Visual Preview 中选择单个功能。“功能信息”窗口显示_response_body具有许多未公开的属性(数量将根据响应而变化),其中包含我们需要的所有信息。

JSONFlattener 工作流有助于将所有 JSON 值转换为 FME 属性。然后,挑战就变成了选择使用 AttributeExposer 公开哪些属性。

5. 提取 JSON 以查找今天的天气状态名称

如果我们对某个元素或属性感兴趣,我们可以使用 JSONExtractor 将其直接提取到属性中,而不是使用 JSONFlattener 展平 JSON。要查找今天的天气,我们需要提取父元素并公开子元素。将 JSONExtractor 转换器连接到 AttributeKeeper。

在 JSONExtractor 参数中,将“源 JSON 文档”设置为“_response_body”,然后将“目标属性”设置为“Weather”

对于 JSON Query,请输入:

json["consolidated_weather"][0]["weather_state_name"] 

        此查询将提取名为 consolidated_weather 的父元素,然后提取数组中的第一个元素(即 0),然后提取名称 weather_state_name 的值。这个 API 为我们提供了 5 天的天气预报,但我们只对今天的天气感兴趣。这就是为什么只查询第一个数组的原因。在不查看 JSON 结构的情况下编写 JSON 查询可能具有挑战性;在后面的步骤中,我们将介绍编写查询的策略。

6. 提取 JSON 以查找今天的温度

接下来,我们需要提取温度。在同一个 JSONExtractor 中,将另一个 Target Attribute 设置为 Temperature,然后将 JSON 查询设置为:

json["consolidated_weather"][0]["the_temp"] 

7. 为 JSON 转换器构建 JSON 查询的策略

查找查询以访问天气信息可能具有挑战性。这里有两个主要选项:首先,可以使用 Visual Preview 仔细查看 JSON 结构,并基于该结构生成查询:

提示:使用 JSONFormatter 漂亮地打印 _response_body 属性,使其更易于在可视化预览中阅读。

第二个选项是临时将 FeatureReader 添加到画布并读取 JSON URL。单击参数并将架构扫描模式设置为“JSON 查询”。然后在“查询”下,单击省略号 [...] 以显示 JSON 树。在树中,展开 JSON,然后展开 consolidated_weather,然后单击其下的子weather_state_name。复制“所选项”框中指示的 JSON 查询,此查询与我们输入到 JSONExtractor 中的查询相同。

8. 检查数据

运行工作区并检查 JSONExtractor。您将看到 Weather 和 Temperature 属性已创建,并且具有从 JSON 中提取的值。运行时,结果会有所不同,因为它是实时 JSON 源。

第 2 部分:提取复杂消息

在前面的示例中,我们读取 JSON 并使用 JSONFlattener 和 JSONExtractor 检查输出。在此示例中,我们将使用 JSONFragmenter 来处理嵌套程度更高的 JSON。我们将从 JSON 中提取纬度和经度值以创建点。

1. 使用文本文件阅读器读取 JSON

在空白工作区或上一个工作区的其他部分中,添加文本文件阅读器。读取 VanTraffic.json 文件。在“参数”中,将“一次读取整个文件”设置为“是”,单击“确定”。

我们之所以使用文本文件读取器而不是 JSON 读取器读取 JSON 数据,是因为我们希望 JSON 包含在一个名为 text_line_data 的属性中。如果我们使用 JSON 阅读器读取 JSON,则每一行都将是包含在其自身属性(包括括号)中的单独记录。

2. 添加 JSONFragmenter 以将 JSON 分解为单个属性

将 JSONFragmenter 连接到text_line读取器功能类型。在参数中,将 JSON 属性设置为 text_line_data,并将 JSON 查询设置为:

json["features"][*]

如果愿意,可以使用本文第一部分(步骤 7)中所述的方法生成此查询。然后,将“平展查询结果转换为属性”更改为“是”,并确保“递归平展”对象/数组“设置为”是“。对话框应如下所示:

3. 公开感兴趣的属性

添加 AttributeExposer 转换器。在其参数中,输入以下属性。或者,执行部分运行并使用省略号 [...] 选择所需的属性。

4. 创建点

在 AttributeExposer 之后添加一个 VertexCreator 转换器。在参数中,将 X 值设置为属性 geometry.coordinates{},在“列表元素选择”对话框中,输入 0 作为坐标。这将读取数组中的第一个坐标,即经度值。对 Y 值重复此操作,输入 1 作为坐标。这将读取数组中的第二个坐标,即纬度值。对话框应如下所示:

5. 将坐标投影到 LL84 中

6. 检查结果

测试了存在问题,JSONFragmenter转换器rejected,具体问题未知。

如何将JSON转换为Microsoft Excel

1.添加JOSN读模块,dataset中填入https://wind.waqi.info/mapq/bounds/?bounds=-90,-180,90,180

其中参数,架构模式选择自动。

JSON展平后如下所示

2.添加 VertexCreator

VertexCreator 用于从 JSON 数据集中提取 X 和 Y 坐标。在本例中,我们将打开 VertexCreator 参数,并指定 X 值将读取 “lon” JSON 属性,Y 值将读取 “lat” JSON 属性。

3. 添加 AttributeManager
在示例工作区中,AttributeManager 用于根据需要删除和重命名属性。
AttributeManager 还用于验证“aqi”值 - 将值“-”转换为<null>以便它可以用于算术表达式或统计计算。单击“AirQualityIndex”属性值的下拉列表,然后选择“条件语句”。将 Conditional 语句设置为以下内容。
If aqi = '-' then AirQualityIndex = <null> else AirQualityIndex = aqi

4.添加 Excel Writer

将表定义为自动

结果

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值