当前位置: 首页 > news >正文

使用 Kibana 将地理空间数据导入 Elasticsearch 以供 ES|QL 使用

作者:来自 Elastic Craig Taverner

如何使用 Kibana 和 csv 采集处理器将地理空间数据采集到 Elasticsearch 中,以便在 Elasticsearch 查询语言 (ES|QL) 中进行搜索。Elasticsearch 具有强大的地理空间搜索功能,现在 ES|QL 也具备这些功能,大大提高了易用性和 OGC 熟悉度。但要使用这些功能,我们需要地理空间数据。

我们最近发布了一篇博文,介绍了如何使用 ES|QL(Elasticsearch 新的、功能强大的管道查询语言)中的新地理空间搜索功能。要使用这些功能,你需要在 Elasticsearch 中拥有地理空间数据。因此,在这篇博文中,我们将向你展示如何提取地理空间数据,以及如何在 ES|QL 查询中使用它。

使用 Kibana 导入 CSV 数据

我们在上一篇博客中用于示例的数据基于我们内部用于集成测试的数据。为了方便起见,我们将其以几个 CSV 文件的形式包含在此处,可以使用 Kibana 轻松导入。数据包括机场、城市和城市边界。你可以从以下位置下载数据:

  • airports.csv
    • 这包含三个数据集的合并:
      • 来自 Natural Earth 的机场(名称、位置和相关数据)
      • 来自 SimpleMaps 的城市位置
      • 来自全球机场数据库的机场海拔
  • airport_city_boundaries.csv
    • 这包含来自上述机场和城市名称与一个新来源的合并:
      • 来自 OpenStreetMap 的城市边界

正如你所猜到的,我们花了一些时间将这些数据源合并到上面的两个文件中,目的是能够测试 ES|QL 的地理空间功能。这可能与你的特定数据需求不完全相同,但希望这能让你了解什么是可能的。具体来说,我们想演示一些有趣的事情:

  • 将带有地理空间字段的数据与其他可索引数据一起导入
  • 导入 geo_point 和 geo_shape 数据并在查询中一起使用它们
  • 将数据导入可以使用空间关系连接的两个索引
  • 创建摄取管道以方便将来的导入(超越 Kibana)
  • 摄取处理器的一些示例,如 csv、convert 和 split

虽然我们将在本博客中讨论如何使用 CSV 数据,但重要的是要了解有几种使用 Kibana 添加地理数据的方法。在地图应用程序中,你可以上传分隔数据,如 CSV、GeoJSON 和 ESRI ShapeFiles,也可以直接在地图中绘制形状。对于本博客,我们将重点介绍从 Kibana 主页导入 CSV 文件。

导入机场数据

第一个文件 airports.csv 有一些需要处理的特殊情况。首先,列之间有多余的空白符,这在典型的 CSV 文件中并不常见。其次,type 字段是一个多值字段,需要将其拆分为单独的字段。最后,一些字段不是字符串类型,需要转换为正确的类型。所有这些都可以使用 Kibana 的 CSV 导入功能来完成。

从 Kibana 主页开始。有一个名为 “Get started by adding integrations” 的部分,其中有一个名为 “Upload a file” 的链接:

单击此链接,你将进入 “Upload file” 页面。在这里,你可以拖放 airports.csv 文件,Kibana 将分析该文件并向你显示数据预览。它应该自动将分隔符检测为逗号,并将第一行检测为标题行。但是,它可能没有修剪列之间的多余空格,也没有确定字段的类型,假设所有字段都是 text 或 keyword。我们需要解决这个问题。

单击 “Override settings” 并选中 “Should trim fields” 复选框,然后单击 “Apply” 关闭设置。现在我们需要修复字段的类型。这在下一页上可用,因此继续并单击 “Import”。

首先选择一个索引名称,然后选择 “Advanced” 以进入字段映射和提取处理器页面。

在这里,我们需要更改索引的字段映射以及用于导入数据的提取管道。首先,虽然 Kibana 很可能会自动检测 scalerank 字段做为 long 类型,但它错误地将 location 和 city_location 字段视为 keyword。将它们编辑为 geo_point,最终得到如下所示的映射:

{"properties": {"abbrev":        { "type": "keyword" },"city":          { "type": "keyword" },"city_location": { "type": "geo_point" },"country":       { "type": "keyword" },"elevation":     { "type": "double" },"location":      { "type": "geo_point" },"name":          { "type": "text" },"scalerank":     { "type": "long" },"type":          { "type": "keyword" }}
}

这里你可以灵活处理,但请注意, 你选择的类型会影响字段的索引方式以及可能的查询类型。例如,如果你将 location 保留为 keyword,则无法对其执行任何地理空间搜索查询。同样,如果你将 elevation 保留为 text,则无法对其执行数值范围查询。

现在是时候修复摄取管道了。如果 Kibana 自动检测到 scalerank 为上面的 long,它还会添加一个处理器来将字段转换为 long。我们需要为 elevation 字段添加一个类似的处理器,这次将其转换为 double。编辑管道以确保你已完成此转换。在保存之前,我们还需要进行一次转换,将 type 字段拆分为多个字段。使用以下配置向管道添加 split 处理器:

{"split": {"field": "type","separator": ":","ignore_missing": true}
}

最终的摄取管道应如下所示:

{"description": "Ingest pipeline created by text structure finder","processors": [{"csv": {"field": "message","target_fields": ["abbrev","name","scalerank","type","location","country","city","city_location","elevation"],"ignore_missing": false,"trim": true}},{"convert": {"field": "scalerank","type": "long","ignore_missing": true}},{"convert": {"field": "elevation","type": "double","ignore_missing": true}},{"split": {"field": "type","separator": ":","ignore_missing": true}},{"remove": {"field": "message"}}]
}
请注意,我们没有为 location 和 city_location 字段添加转换处理器。这是因为字段映射中的 geo_point 类型已经理解这些字段中数据的 WKT 格式。geo_point 类型可以理解多种格式,包括 WKT、GeoJSON 等。例如,如果我们在 CSV 文件中有两列用于 latitude 和 longitude,我们就需要添加 script 或 set 处理器以将它们组合成单个 geo_point 字段(例如“set”:{“field”:“location”,“value”:“{{lat}},{{lon}}”})。我们现在可以导入文件了。单击 Import,数据将使用我们刚刚定义的映射和摄取管道导入索引。如果摄取数据时出现任何错误,Kibana 会在此处报告这些错误,因此你可以编辑源数据或摄取管道并重试。

请注意,已创建了新的采集管道。你可以通过转到 Kibana 的 Stack Management 部分并选择 Ingest Pipelines 来查看。在这里,你可以看到我们刚刚创建的管道,并在必要时对其进行编辑。事实上,Ingest Pipelines 部分可用于创建和测试采集管道,如果你计划进行更复杂的采集,这是一个非常有用的功能。

如果你想立即探索这些数据,请跳到后面的部分,但如果你还想导入城市边界,请继续阅读。

导入城市边界

airport_city_boundaries.csv 中提供的城市边界文件比上一个示例导入起来简单一些。它包含一个 city_boundary 字段,该字段是城市边界的 WKT 表示形式,为 POLYGON,以及一个 city_location 字段,该字段是城市位置的 geo_point 表示形式。我们可以以与机场数据类似的方式导入这些数据,但有一些不同:

  • 我们需要选择覆盖设置 “Has header row”,因为该设置无法自动检测到
  • 我们不需要修剪字段,因为数据中已经没有多余的空格
  • 我们不需要编辑提取管道,因为所有类型都是字符串或空间类型
  • 但是,我们必须编辑字段映射以将 city_boundary 字段设置为 geo_shape,将 city_location 字段设置为 geo_point

我们最终的字段映射如下所示:

{"properties": {"abbrev":        { "type": "keyword" },"airport":       { "type": "keyword" },"city":          { "type": "keyword" },"city_boundary": { "type": "geo_shape" },"city_location": { "type": "geo_point" },"region":        { "type": "text" }}
}

与之前的 airports.csv 导入一样,只需单击 “Import” 即可将数据导入索引。数据将与我们编辑的映射和 Kibana 定义的提取管道一起导入。

使用开发工具探索数据

在 Kibana 中,通常使用 “Discover” 探索索引数据。但是,如果你打算使用 ES|QL 查询编写自己的应用程序,尝试访问原始 Elasticsearch API 可能会更有趣。Kibana 有一个方便的控制台,可用于尝试编写查询。这称为 “Dev Tools” 控制台,可以在 Kibana 侧边栏中找到。此控制台直接与 Elasticsearch 集群对话,可用于运行查询、创建索引等。

尝试以下操作:

POST /_query?error_trace=true&format=txt
{"query": """
FROM airports
| EVAL distance = ST_DISTANCE(city_location, TO_GEOPOINT("POINT(12.565 55.673)"))
| WHERE distance < 1000000 AND scalerank < 6 AND distance > 10000
| SORT distance ASC
| KEEP distance, abbrev, name, location, country, city, elevation
| LIMIT 10"""
}

这应该提供以下结果:

distanceabbrevnamelocationcountrycityelevation
273418.05776847183HAMHamburgPOINT (10.005647830925 53.6320011640866)GermanyNorderstedt17.0
337534.653466062TXLBerlin-Tegel Int'lPOINT (13.2903090925074 52.5544287044101)GermanyHohen Neuendorf38.0
483713.15032266214OSLOslo GardermoenPOINT (11.0991032762581 60.1935783171386)NorwayOslo208.0
522538.03148094116BMABrommaPOINT (17.9456175406145 59.3555902065112)SwedenStockholm15.0
522538.03148094116ARNArlandaPOINT (17.9307299016916 59.6511203397372)SwedenStockholm38.0
624274.8274399083DUSDüsseldorf Int'lPOINT (6.76494446612174 51.2781820420774)GermanyDüsseldorf45.0
633388.6966435644PRGRuzynPOINT (14.2674849854076 50.1076511703671)CzechiaPrague381.0
635911.1873311149AMSSchipholPOINT (4.76437693232812 52.3089323889822)NetherlandsHoofddorp-3.0
670864.137958866FRAFrankfurt Int'lPOINT (8.57182286907608 50.0506770895207)GermanyFrankfurt111.0
683239.2529970079WAWOkecie Int'lPOINT (20.9727263383587 52.171026749259)PolandPiaseczno111.0

使用地图可视化数据

Kibana Maps 是一款强大的地理空间数据可视化工具。它可用于创建具有多个图层的地图,每个图层代表不同的数据集。数据可以以各种方式进行过滤、聚合和样式化。在本节中,我们将向你展示如何使用我们在上一节中导入的数据在 Kibana Maps 中创建地图。

在 Kibana 菜单中,导航至 Analytics->Maps 以打开新的地图视图。单击 “Add Layer” 并选择 “Documents”,选择数据视图 airports,然后编辑图层样式以使用海拔字段为标记着色,这样我们就可以轻松看到每个机场的高度。

单击 “Keep changes” 保存地图:

现在添加第二个图层,这次选择 airport_city_boundaries 数据视图。这次,我们将使用 city_boundary 字段来设置图层样式,并将填充颜色设置为浅蓝色。这将在地图上显示城市边界。确保重新排序图层以确保机场标记位于顶部。

空间连接

ES|QL 不支持 JOIN 命令,但你可以使用 ENRICH 命令实现特殊连接。此命令的操作类似于 SQL 中的 “左连接 - left join”,允许你根据两个数据集之间的空间关系使用来自另一个索引的数据来丰富来自一个索引的结果。

例如,让我们通过查找包含机场位置的城市边界来丰富机场表的结果,其中包含有关机场所服务城市的其他信息,然后对结果进行一些统计:

FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary
| STATScentroid = ST_CENTROID_AGG(location),count = COUNT(city_location)BY region
| SORT count DESC
| LIMIT 10

如果你在没有先准备丰富索引的情况下运行此查询,你将收到类似以下的错误消息:

cannot find enrich policy [city_boundaries]

这是因为,正如我们之前提到的,ES|QL 不支持真正的 JOIN 命令。其中一个重要原因是 Elasticsearch 是一个分布式系统,而连接是昂贵的操作,很难扩展。然而,ENRICH 命令可以非常高效,因为它利用了专门准备的丰富索引,这些索引在集群中重复,从而可以在每个节点上执行本地连接。

为了更好地理解这一点,让我们关注上面查询中的 ENRICH 命令:

FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary

此命令指示 Elasticsearch 丰富从 airports 索引检索到的结果,并在原始索引的 city_location 字段和 airport_city_boundaries 索引的 city_boundary 字段之间执行相交(intersects)连接,我们在之前的几个示例中使用过该字段。但其中一些信息在此查询中并不清晰可见。我们看到的是丰富策略 city_boundaries 的名称,缺失的信息封装在该策略定义中。

{"geo_match": {"indices": "airport_city_boundaries","match_field": "city_boundary","enrich_fields": ["city", "airport", "region", "city_boundary"]}
}

在这里我们可以看到它将执行 geo_match 查询(默认为 intersects),要匹配的字段是 city_boundary,而 enrich_fields 是我们要添加到原始文档的字段。其中一个字段,即 region,实际上被用作 STATS 命令的分组键,如果没有这个“左连接”功能,我们就无法做到这一点。有关丰富策略的更多信息,请参阅 enrich 文档。

Elasticsearch 中的丰富索引和策略最初设计用于在索引时丰富数据,使用来自另一个准备好的丰富索引的数据。然而,在 ES|QL 中,ENRICH 命令在查询时工作,并且不需要使用摄取管道。这实际上使它非常类似于 SQL LEFT JOIN,只是你不能连接任何两个索引,只能连接左侧的普通索引和右侧专门准备的丰富索引。

无论哪种情况,无论是用于摄取管道还是在 ES|QL 中使用,都需要执行一些准备步骤来设置丰富索引和策略。我们已经导入了上述 airport_city_boundaries 索引,但这不能直接用作 ENRICH 命令中的丰富索引。我们首先需要执行两个步骤:

  • 创建上述丰富策略以定义源索引、源索引中要匹配的字段以及匹配后要返回的字段。
  • 执行此策略以创建丰富索引。这将构建一个特殊的内部索引,通过将原始源索引读入更高效的数据结构并在集群中复制。

可以使用以下命令创建丰富策略:

PUT /_enrich/policy/city_boundaries
{"match": {"indices": "airport_city_boundaries","match_field": "city_boundary","enrich_fields": ["city", "airport", "region", "city_boundary"]}
}

可以使用以下命令执行该策略:

POST /_enrich/policy/city_boundaries/_execute

请注意,如果你更改 airport_city_boundaries 索引的内容,则需要重新执行此策略才能看到 enrich 索引中反映的更改。现在让我们再次运行原始 ES|QL 查询:

FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary
| STATScentroid = ST_CENTROID_AGG(location),count = COUNT(city_location)BY region
| SORT count DESC
| LIMIT 10

这将返回拥有最多机场的前 5 个地区,以及所有具有匹配区域的机场的质心,以及这些区域内城市边界的 WKT 表示的长度范围:

centroidcountregion
POINT (-12.139086859300733 31.024386116624648)126null
POINT (-83.10398317873478 42.300230911932886)3Detroit
POINT (39.74537850357592 47.21613017376512)3городской округ Батайск
POINT (-156.80986787192523 20.476673701778054)3Hawaii
POINT (-73.94515332765877 40.70366442203522)3City of New York
POINT (-83.10398317873478 42.300230911932886)3Detroit
POINT (-76.66873019188643 24.306286952923983)2New Providence
POINT (-3.0252167768776417 51.39245774131268)2Cardiff
POINT (-115.40993484668434 32.73126147687435)2Municipio de Mexicali
POINT (41.790108773857355 50.302146775648)2Центральный район
POINT (-73.88902732171118 45.57078813901171)2Montréal

你可能还会注意到,最常见的区域为 null。这意味着什么?回想一下,我将此命令比作 SQL 中的 “左连接 - left join”,这意味着如果未找到机场的匹配城市边界,则仍会返回机场,但 airport_city_boundaries 索引中的字段值为 null。结果发现有 125 个机场未找到匹配的 city_boundary,而一个机场的匹配项的 region 字段为空。这导致结果中有 126 个机场没有区域。如果你的用例要求所有机场都可以与城市边界匹配,则需要获取其他数据来填补空白。需要确定两件事:

  • airport_city_boundaries 索引中的哪些记录没有 city_boundary 字段
  • airports 索引中的哪些记录与 ENRICH 命令不匹配(即不相交)

Kibana Maps 中的 ES|QL

Kibana 在 Maps 应用程序中添加了对 Spatial ES|QL 的支持。这意味着你现在可以使用 ES|QL 在 Elasticsearch 中搜索地理空间数据,并在地图上将结果可视化。

添加图层菜单中有一个新的图层选项,称为 “ES|QL”。与迄今为止描述的所有地理空间功能一样,该选项处于 “技术预览” 状态。选择此选项可让您根据 ES|QL 查询的结果向地图添加图层。例如,你可以向地图添加一个显示世界上所有机场的图层。

或者你可以添加一个显示 airport_city_boundaries 索引中的多边形的图层,或者更好的是,上面的复杂 ENRICH 查询如何生成每个地区有多少个机场的统计数据?

下一步是什么?

上一篇地理空间搜索博客重点介绍了如何使用 ST_INTERSECTS 等函数执行搜索,这些函数自 Elasticsearch 8.14 起可用。这篇博客向你展示了如何导入我们用于这些搜索的数据。但是,Elasticsearch 8.15 附带了一个特别有趣的函数:ST_DISTANCE,可用于执行有效的空间距离搜索,这将是下一篇博客的主题!

准备好自己尝试一下了吗?开始免费试用。

想要获得 Elastic 认证?了解下一次 Elasticsearch 工程师培训何时举行!

原文:Using Kibana to ingest geospatial data into Elasticsearch for use in ES|QL - Search Labs

相关文章:

使用 Kibana 将地理空间数据导入 Elasticsearch 以供 ES|QL 使用

作者&#xff1a;来自 Elastic Craig Taverner 如何使用 Kibana 和 csv 采集处理器将地理空间数据采集到 Elasticsearch 中&#xff0c;以便在 Elasticsearch 查询语言 (ES|QL) 中进行搜索。Elasticsearch 具有强大的地理空间搜索功能&#xff0c;现在 ES|QL 也具备这些功能&am…...

demo说明

代码说明 MDIO总线的注册和初始化&#xff1a;分配并注册MDIO总线&#xff0c;用于与PHY设备通信。 网络设备的创建&#xff1a;分配网络设备&#xff08;如以太网接口&#xff09;。 PHY设备连接&#xff1a;通过phy_connect函数连接PHY设备&#xff0c;指定回调函数my_adj…...

【c++篇】:从基础到实践--c++内存管理技巧与模版编程基础

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 前言一.c/c内存分布二.c/c的动态内存管理方式2.1.c语言的动态内存管…...

如何减小 Maven 项目生成的 JAR 包体积 提升运维效率

在使用 Maven 构建 Java 项目时&#xff0c;有时需要减小生成的 JAR 包的体积&#xff0c;以提高部署效率或减少资源消耗。以下是一些有效的方法来减小 JAR 包的体积&#xff1a; 排除不必要的依赖打包时&#xff0c;依赖jar包独立于应用jar包 1. 排除不必要的依赖 通过排除项目…...

Python自动化会议记录与摘要生成

前言 在现代工作环境中&#xff0c;会议是团队沟通和决策的重要方式。然而&#xff0c;整理会议记录和生成摘要往往是一项耗时且容易出错的任务。幸运的是&#xff0c;借助Python编程语言以及一些强大的库&#xff0c;我们可以自动化这一过程&#xff0c;让机器帮助我们完成这…...

SwiftUI 中 List 或 Form 子视图关联的 swipeAction 导致展开动画异常的解决

问题现象 小伙伴们都知道,在 SwiftUI 中更快捷的增强 List 或 Form 子视图(Cell)交互功能的方法是使用 swipeAction 修改器。不过,对其使用稍有不慎也会横生枝节。 如上图所示,不适当的设置 Cell 视图布局会使 swipeAction 无法生成正确的收缩和展开动画。对此我们有什么…...

Apache Paimon Catalog

Paimon Catalog可以持久化元数据&#xff0c;当前支持两种类型的metastore&#xff1a; 文件系统&#xff08;默认&#xff09;&#xff1a;将元数据和表文件存储在文件系统中。hive&#xff1a;在 hive metastore中存储元数据。用户可以直接从 Hive 访问表。 2.2.1 文件系统…...

C++基础:三个字符串也能搞大小?

上一篇说了三个整数比较大小&#xff0c;按照顺序输入的&#xff0c;这次我们看看字符串的&#xff0c;顺便把那个简化以下&#xff1a; 题目:这次输入三个字符串。如果用户输入“Stenbeck", “Hemingway”,“Fitzgerald”,输出将是“Fitzgerald&#xff0c;Hemingway&…...

了解AIGC——自然语言处理与生成

AIGC——自然语言处理与生成&#xff1a;揭秘AI如何生成语言 近年来&#xff0c;AIGC&#xff08;AI Generated Content&#xff09;技术迅猛发展&#xff0c;自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;与生成技术的结合&#xff0c;使得机器不仅…...

Modern CMake 简明教程(8)- 集成Qt

在项目中集成 Qt 库需要先使用 find_package 查找 Qt 的安装位置。对于 Qt4, CMake 使用 Module 模式进行查找(FindQt4.cmake 由 CMake 提供),而 对于 Qt5、Qt6,则是使用 Config 模式进行查找,相应的 config 文件位于类似下面的目录中 D:\Qt\5.15.2\msvc2019\lib\cmake。…...

人脸应用实例:性别年龄预测

在当今科技飞速发展的时代&#xff0c;人脸识别技术已经从科幻电影走进了我们的日常生活。通过算法来识别人脸的特征&#xff0c;进而判断身份、年龄和性别&#xff0c;这一技术正逐步改变着我们的生活方式。今天&#xff0c;我们就来探讨一下基于深度学习的人脸应用实例——性…...

学习threejs,通过THREE.Raycaster给模型绑定点击事件

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Raycaster光线投射概…...

Jackson Json序列化反序列化的两个坑

Jackson is a suite of data-processing tools for Java (and the JVM platform) Jackson最常用的Json序列化功能&#xff0c;引入如下的包即可&#xff1a; <properties>...<!-- Use the latest version whenever possible. --><jackson.version>2.17.1<…...

k8s_Pod健康检查

Kubernetes 3种探针介绍 LivenessProbe&#xff08;存活探针&#xff09; LivenessProbe 用于检查容器是否仍然活着。如果探针检测到容器已经失去响应&#xff0c;Kubernetes 将重启该容器。这通常用来修复由于内部状态错误或死锁引起的程序失效问题。 作用&#xff1a;检测容器…...

基于DDPG算法的股票量化交易

项目源码获取方式见文章末尾&#xff01; 回复暗号&#xff1a;13&#xff0c;免费获取600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 **《------往期经典推荐------》**项目名称 1.【基于PyQTFaceNet卷积神经网络实现的学生人脸识别考勤系统】 2.【卫星图像道…...

eIQ笔记(UI介绍+Loss曲线+OpenART例程)

This is a very beginner-friendly article ^o^ 目录 🍂一、训练器设置 input size: learning rate: learning rate decay: Epochs: Decay Rate: Linear Decay: Batch Size: Epochs to Train: QAT(Quantization Aware Training)量化感知训练: Pruning剪枝…...

微信小程序——消息订阅

首先用到的就是wx.requestSubscribeMessage接口。 注意&#xff1a;用户发生点击行为或者发起支付回调后&#xff0c;才可以调起订阅消息界面 requestSubscribeMessage() {uni.requestSubscribeMessage({tmplIds: [],//需要订阅的消息模板的id的集合&#xff0c;一次调用最多可…...

网络原理(传输层)->TCP协议解

前言 大家好&#xff01;我是小帅&#xff0c;今天我们来学习TCP协议&#xff0c;个人主页 文章目录 1. TCP协议2. TCP的核心机制2.1TCP核心机制一&#xff1a;确认应答2.2 TCP核心机制二&#xff1a;超时重传2.3 TCP核心机制三&#xff1a;连接管理2.4 TCP核心机制四&#xf…...

oracle imp和exp 导入不同库的用户和表空间

参考&#xff1a; oracle 导入(imp)数据时的表空间(tablespace users)问题_imp tablespace-CSDN博客 网上的解决办法大概都是这种&#xff0c;但是实际测试19c数据库并不能成功&#xff0c;所以最后采取在导出文件上强行修改表空间的办法&#xff0c;改完后再继续执行导出导入…...

滚珠丝杆的精度级别如何分?

滚珠丝杆是一种常见的线性传动装置&#xff0c;广泛应用于各种机械设备和自动化系统中。滚珠丝杆的精度等级划分是评估其传动精度和运动平稳度的重要标准&#xff0c;滚珠丝杆的精度级别划分主要基于传动中实际移动距离与理想移动距离的偏差&#xff0c;偏差越小&#xff0c;精…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...