注意:以下翻译的准确性尚未经过验证。这是使用 AIP ↗ 从原始英文文本进行的机器翻译。
地图微件将对象集或对象数据显示为可配置的、交互式的地理空间可视化。
这些地图可视化由两种类型的图层组成:
地图微件支持通过MapboxGL ↗进行地图渲染。如果用户的浏览器不支持WebGL,地图微件将通过Leaflet ↗进行渲染。
地图微件使用Mapbox作为其基础地图图像的主要来源,并支持"Internal"样式(基础地图图像的自定义来源),用于无法代理Mapbox的安全网络。要了解有关网络地图技术的更多信息,请参阅Mapbox文档 ↗。
下面的截图显示了配置好的地图微件示例,显示了各种图层类型:
在地图微件中,覆盖图层在地图的基础图层上以点或形状表示数据。地图微件包含以下类型的覆盖图层:
点图层使用点或标记在地图上表示单个对象,通过地理哈希属性(以纬度-经度对的形式存储)绘制。可以根据所绘制对象的属性来设置点的颜色、图标类型和大小。
有关配置信息,请参阅下面的配置点图层部分。
示例:一张显示医院位置的地图,点的颜色根据可用医院床位的数量来表示。
聚类图层非常适合基于地理哈希位置属性的大型对象集。聚类与点类似,但不是为每个对象绘制一个单独的标记,而是根据其地理邻近性将要绘制的对象聚合为聚类,可以配置聚类的大小和/或颜色以表示给定区域内的对象数量(或其他聚合函数,例如该区域内对象属性的总和或平均值)。
有关配置信息,请参阅下面的配置聚类图层部分。
示例:一张显示全国各地气象站大致地理分布的地图。
地图微件的等值线图层显示根据某个属性或该区域所代表对象的聚合结果来着色的区域(例如国家或省份)。这提供了一种可视化不同区域间差异或模式的方法,并可选择查看这些值随时间的变化。
有关配置信息,请参阅下面的配置等值线图层部分。
为了支持在函数中对H3六边形进行自定义聚合,等值线图层也可以用于将H3六边形映射为单独的区域。请参阅下面的为H3配置等值线图层部分。
示例:一张显示各州人口密度的地图,每个州根据其人口密度着色。
线段图层将单个对象绘制为连接两个点的线段。
有关配置信息,请参阅下面的配置线段图层部分。
示例:一张显示航线的地图,其中起始机场通过代表航线的线段连接到目的机场。
静态图层显示无法动态筛选且来自非对象数据源的信息。这些图层通常在为同一地图上的其他数据图层提供背景信息时最有用。图层的数据可以以GeoJSON ↗格式提供或通过矢量图层提供。
有关配置信息,请参阅下面的配置静态图层部分。
示例:显示各个区域可能发生不利天气事件风险的图层。
已保存图层显示在地图图层编辑器中配置并保存为单独资源的地图图层。这些图层可以跨多个应用程序共享,通常用于在Foundry中以一致的方式提供背景信息。
下图显示了新添加且尚未配置的地图微件及其配置面板。
对于地图微件,核心配置选项如下:
是
后会详细显示。有关更多信息,请参阅下面的配置绘图控制部分。是
后会详细显示。有关更多信息,请参阅下面的配置时间步进控制部分。对于点图层,主要配置选项如下:
重要
、特定
或无
)。对于聚类图层,主要配置选项如下:
%
为值格式器。指定的值应为d3-format字符串 ↗。对于等值线图层,主要配置选项如下:
等值线边界来源
是支持的三种来源的详细信息:Mapbox、GeoJSON和矢量。重要
、特定
或无
)。等值线边界来源: 要配置等值线图层,必须指定将定义显示区域的边界的来源。边界数据有几种可能的来源:
geoshape
或字符串
类型的属性)。要为H3配置等值线图层以支持在地图微件上显示的自定义聚合,您需要在Ontology Manager中配置一个对象类型,例如" H3 Hexagon",其中每个对象是所需分辨率的H3六边形,具有唯一标识每个六边形及其关联的GeoJSON形状的属性。下面提供了对象类型属性的示例:
hex_index
:每个H3六边形的唯一标识符。示例值:82f25ffffffffff
hex_geojson
:H3六边形的GeoJSON几何。示例值:{"type":"Polygon","coordinates":[[[-114.88722592804382,-74.86647343694071],[-110.43933775312789,-76.04791578897344],[-103.98485051466383,-75.45226049628374],[-103.08914246618076,-73.75952697882984],[-107.50751324842204,-72.74554847287561],[-112.95182804024837,-73.26746640072781],[-114.88722592804382,-74.86647343694071]]]}
然后可以按如下方式应用地图微件的配置选项:
hex_index
)hex_geojson
然后,您可以使用非聚合值配置选项配置基于函数的属性,以按H3六边形聚合对象集输入并在地图微件中显示值。例如,下面的函数将计算输入对象集内每个H3六边形的派生COVID检测阳性率:
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
import { Function, Double, FunctionsMap} from "@foundry/functions-api"; import { Objects, ObjectSet, CovidPositive, CovidTest, H3Hexagon} from "@foundry/ontology-api"; // 定义一个类 MyFunctions export class MyFunctions { // 使用装饰器 @Function() 声明一个函数 calculateCovidPositivityRate @Function() public async calculateCovidPositivityRate(hexes: ObjectSet<H3Hexagon>, positives: ObjectSet<CovidPositive>, tests: ObjectSet<CovidTest>): Promise<FunctionsMap<H3Hexagon, Double>> { const map = new FunctionsMap<H3Hexagon, Double>(); // 设置最大桶数为6000,以便允许对所有 H3 六边形和分辨率2进行聚合 const max_buckets = {maxBuckets: 6000} // 将阳性病例根据 H3 六边形索引分组并计数 const positives_bucketed = await positives .groupBy(positive => positive.hex_index.exactValues(max_buckets)) .count(); // 将分组结果转换为 Map,以提高查找效率 const positives_hex_map = new Map(); positives_bucketed.buckets.forEach((bucket: any) => { positives_hex_map.set(bucket.key, bucket.value); }); // 将检测结果根据 H3 六边形索引分组并计数 const tests_bucketed = await tests .groupBy(test => test.hex_index.exactValues(max_buckets)) .count(); const tests_hex_map = new Map(); tests_bucketed.buckets.forEach(bucket => { tests_hex_map.set(bucket.key, bucket.value); }); // 遍历所有 H3 六边形,计算阳性率,并将结果存入 map hexes.all().forEach(hex => { const positive_count = positives_hex_map.get(hex.hex_index); const test_count = tests_hex_map.get(hex.hex_index); if ((positive_count !== undefined) && (test_count !== undefined)) { map.set(hex, positive_count/test_count * 100); } }); return map; } }
注意,如果您使用H3六边形分辨率2,并希望绘制所有5,882个六边形,您需要将搜索结果页数增加到6。
对于线条图层,主要的配置选项如下:
线条图层源
下是支持的三种源的详细信息:点对点、GeoJSON和Vector。重要
、特定
或无
)。线条图层源: 以下是加载源信息以指定如何在线条图层上绘制线条的不同方法:
地形形状
或字符串
的属性)。对于静态图层,主要的配置选项如下:
重要
、特定
或无
)。聚合值系列可以通过三种方式配置:简单聚合、函数聚合和派生聚合。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
@Function() public costToVolume(expenses: ObjectSet<Expense>): FunctionsMap<string, Double> { const map = new FunctionsMap<string, Double>(); // 根据国家分组计算每个国家的总成本 const costsPerCountry = expenses .groupBy(expense => expense.countryId.topValues()) .sum(expense => expense.cost); // 根据国家分组计算每个国家的总交易量 const volumePerCountry = expenses .groupBy(expense => expense.countryId.topValues()) .sum(expense => expense.volume); // 遍历成本数据,并计算每个国家的成本与交易量的比率 costsPerCountry.buckets.forEach(bucket => { // 查找对应国家的交易量 var volume = volumePerCountry.buckets.find(b => b.key === bucket.key); // 将国家与其成本/交易量比率存入map中 map.set(bucket.key, bucket.value / volume); }); return map; }
该代码定义了一个名为 costToVolume
的函数,该函数接受一个 expenses
集合,返回一个映射,每个国家的键对应其成本与交易量的比率。代码首先按照国家对支出进行分组,然后分别求出每个国家的总成本和总交易量,最后计算出每个国家的成本与交易量的比率并存入结果映射中。
(people under 30/ total population)
表示。非聚合值系列可以通过三种方式配置:静态属性、函数支持的属性和时间序列属性。
Copied!1 2 3 4 5 6 7 8 9 10 11 12
@Function() public countryPositivityRate(countries: ObjectSet<Country>): FunctionsMap<Country, Double> { const positivityRatePerCountry = new FunctionsMap<Country, Double>(); countries.all().forEach(country => { // 计算每个国家的阳性率 var positivityRate = country.dailyNewCases / country.dailyNewPositiveTests; // 将计算的阳性率存入positivityRatePerCountry映射中 positivityRatePerCountry.set(country, positivityRate); }); // 返回每个国家的阳性率映射 return positivityRatePerCountry; }
在下面的示例中,Country
对象有一个时间序列属性 COVID19 New Cases
,它存储了该国每天观察到的新冠肺炎新病例的历史记录。然后,一个时间序列变换将这个每日病例计数转换为一个记录病例变化率的时间序列。最后,一个时间序列汇总器将变换后的时间序列中的最新值提供给地图数据层;也就是说,它计算出已知的最后一个病例变化率。颜色配置面板对地图进行样式设置,以突出国家之间的这一数值对比。有关时间序列变换和汇总器的更多信息,请参见 Workshop 中的时间序列属性,有关颜色方案配置的更多信息,请参见下面的颜色配置部分。
下面的截图显示了颜色配置的配置选项。
颜色配置的配置选项如下:
颜色配置: 颜色可以通过三种方式设置:
线边框样式: 线图层或其他图层类型边框样式的配置。
值格式器: 允许以不同格式表示值。例如,要将值表示为百分比,请配置 %
作为值格式器。指定的值应该是一个 d3-format 字符串 ↗。
以下是选择、可见性和事件配置的主要配置选项:
True
将禁用一次选择多个对象的功能。每次选择将删除上一次选择。True
允许在第一次加载地图时隐藏图层。如果图层是组的一部分,则考虑为第一个图层配置的设置。下面的截图显示了一个配置好的地图微件,显示了不同形状及其配置面板:
对于绘图控件,核心配置选项如下:
#F29D49
,这是浅橙色的十六进制代码。0
到 1
,最大不透明度为 1
。#F29D49
,这是浅橙色的十六进制代码。#F29D49
,这是浅橙色的十六进制代码。0
到 1
,最大不透明度为 1
。#F29D49
,这是浅橙色的十六进制代码。地图微件有一个内置的时间步进器,允许用户“步进”前进和/或后退,以查看地图上数据随时间的变化。
时间步进器通过将对象集筛选器(对应于用户选择的时间窗口)发布到配置的对象集筛选变量来工作。此筛选变量可以用于筛选支持地图上一个或多个图层的对象集,以仅返回与该时间窗口相关的对象。
为了利用时间步进器,我们建议使用包含某些单位时间内某些测量值的对象的时间对象。每个对象应具有可以筛选的日期或时间戳属性,这样筛选给定时间窗口的对象将允许您加载单个对象(或聚合该窗口中的对象),以获取要在地图上显示的数据。
下面的截图显示了配置好的时间步进器的示例地图:
下面的截图显示了时间步进器控件的配置选项:
时间步进器的核心配置选项如下:
下面的截图显示了一个视口筛选的示例配置。
视口筛选输出一个对象集筛选变量;这允许根据微件中地图的可见边界筛选正在映射的对象集。例如,对于映射机场位置的地图,如果用户放大到美国,视口筛选将生成一个筛选变量,该变量允许筛选对象集以仅包含美国机场的对象。
对于使用视口筛选的等值线图层,映射的对象类型需要具有地理哈希属性;这可以是区域的中心点。