我们付出一些成本,时间的或者其他,最终总能收获一些什么。
【由于上周,上班状态不是很好,事情多又杂,没有学习的劲头,就短暂的休息了一下下。双休爬山,给自己上了强度,今天才缓过来,下周又是五一了,估计要到五一后过渡一下,学习的劲头又能恢复了】
本教程系列概述了如何使用 FME 读取、写入和转换 JSON 数据。
【由于工作的需要,会频繁的使用到json文件中存储的wkt格式的坐标数据,需要将其转换成shp;或者人工确定json中某一固定属性对应的值等一些重复枯燥的人工核实任务,所以想看一下FME中能否有较好的解决方法】
JSON 读取器自动模式
1. 打开 FME Workbench 并添加 JSON 读取器
2.将 JSON 读取器架构扫描模式更改为 JSON 查询
表视图”将报告数据没有架构,但使用“要素信息窗口”会显示列表属性。仅包括天气的子数据,而不包括机场、城市等父数据:
案例中涉及的主要是将json中的点坐标暴露后,进行点要素的空间化,设置相关的样式,导出为KML格式。
1.添加JSON相关的读模块
根据教程中的下载相应的json数据,添加到读模块中
设置参数时,Schema Scan Mode为Auto(自动)
2.使用AttributeCreator将未暴露的坐标进行暴露,也可使用 AttributeExposer 转换器进行暴露
3.使用VertexCreator转换器,进行点坐标的空间化
4.使用CoordinateSystemSetter转换器,进行坐标系的设置,将坐标系定义为LL84
5.使用KMLPropertySetter转换器,设置fields.totalunits为点的标签
6.使用KMLStyler转换器,对样式进行设置
KMLStyler转换器说明:为一组输入到OGCKML写模块的要素创建公共样式。
7.添加KML写模块,属性定义采取自动的模式
没有安装谷歌地球,直接在FME中空间化的效果。
1.使用JSON读模块读取,读取floods.json文件
其中,items{}.floodArea.polygon 属性中存放了json文件的相关地址
我们必须提取链接到多边形数据的 URL,并使用它们将几何体读取到我们的工作空间。
对读模块的参数进行设置,将Schema Scan设置如下
对读模块进行预览,能看到floodArea.polygon已经被公开。
2.使用FeatureReader转换器
FeatureReader转换器说明:
“生成输出端口”对话框将询问您是否要提供用于生成输出端口的数据集,但在本例中,我们不需要这样做,因此我们可以单击“取消”。
示例中添加了KMLStyler转换器和KML写模块,上个例子中已经学习过,就直接使用Inspectors进行查看。
JSON 编写器提供了一种快速简便的方法来将数据转换为 JSON 格式。但是,它只适合编写不嵌套的平面 JSON。
分布说明
第1部分:编写JSON
1.读模块读取Excel文件,publicart.xlsx
点击参数,可以看到Excel表的详情
2.添加写模块
添加JSON写模块,在参数设置中,进行如下修改。
3.在notepad++中显示输出的json文件
这一点说明,FME 的 JSON 编写器最适合用于不需要嵌套的情况。
第2部分:编写GeoJSON
GeoJSON 是一种 JSON 规范,用于处理地理数据的几何编码。
文章详细介绍了如何使用 JSONTemplater 和文本文件编写器编写嵌套JSON。
1.首先查看提供JSON文件publicart.json,是比较简单的并列结构,无嵌套
在FME中是如下的显示
2.添加Sampler转换器
Sampler转换器说明:根据Sampling Type选项的选择,来保留要素的全部或者要素
![](https://img-blog.csdnimg.cn/direct/3a137498619c46efb751d7d188383ea0.png)
![](https://img-blog.csdnimg.cn/direct/1ce1f4c100244338b1284b93ddfd1a70.png)
{| 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,具体问题未知。
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 属性。
![](https://img-blog.csdnimg.cn/direct/7274f8dc830f4aa09cf899ed0622de32.png)
If aqi = '-' then AirQualityIndex = <null> else AirQualityIndex = aqi
4.添加 Excel Writer
将表定义为自动
结果