使用 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"""
}
这应该提供以下结果:
distance | abbrev | name | location | country | city | elevation |
---|---|---|---|---|---|---|
273418.05776847183 | HAM | Hamburg | POINT (10.005647830925 53.6320011640866) | Germany | Norderstedt | 17.0 |
337534.653466062 | TXL | Berlin-Tegel Int'l | POINT (13.2903090925074 52.5544287044101) | Germany | Hohen Neuendorf | 38.0 |
483713.15032266214 | OSL | Oslo Gardermoen | POINT (11.0991032762581 60.1935783171386) | Norway | Oslo | 208.0 |
522538.03148094116 | BMA | Bromma | POINT (17.9456175406145 59.3555902065112) | Sweden | Stockholm | 15.0 |
522538.03148094116 | ARN | Arlanda | POINT (17.9307299016916 59.6511203397372) | Sweden | Stockholm | 38.0 |
624274.8274399083 | DUS | Düsseldorf Int'l | POINT (6.76494446612174 51.2781820420774) | Germany | Düsseldorf | 45.0 |
633388.6966435644 | PRG | Ruzyn | POINT (14.2674849854076 50.1076511703671) | Czechia | Prague | 381.0 |
635911.1873311149 | AMS | Schiphol | POINT (4.76437693232812 52.3089323889822) | Netherlands | Hoofddorp | -3.0 |
670864.137958866 | FRA | Frankfurt Int'l | POINT (8.57182286907608 50.0506770895207) | Germany | Frankfurt | 111.0 |
683239.2529970079 | WAW | Okecie Int'l | POINT (20.9727263383587 52.171026749259) | Poland | Piaseczno | 111.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 表示的长度范围:
centroid | count | region |
---|---|---|
POINT (-12.139086859300733 31.024386116624648) | 126 | null |
POINT (-83.10398317873478 42.300230911932886) | 3 | Detroit |
POINT (39.74537850357592 47.21613017376512) | 3 | городской округ Батайск |
POINT (-156.80986787192523 20.476673701778054) | 3 | Hawaii |
POINT (-73.94515332765877 40.70366442203522) | 3 | City of New York |
POINT (-83.10398317873478 42.300230911932886) | 3 | Detroit |
POINT (-76.66873019188643 24.306286952923983) | 2 | New Providence |
POINT (-3.0252167768776417 51.39245774131268) | 2 | Cardiff |
POINT (-115.40993484668434 32.73126147687435) | 2 | Municipio de Mexicali |
POINT (41.790108773857355 50.302146775648) | 2 | Центральный район |
POINT (-73.88902732171118 45.57078813901171) | 2 | Montré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 使用
作者:来自 Elastic Craig Taverner 如何使用 Kibana 和 csv 采集处理器将地理空间数据采集到 Elasticsearch 中,以便在 Elasticsearch 查询语言 (ES|QL) 中进行搜索。Elasticsearch 具有强大的地理空间搜索功能,现在 ES|QL 也具备这些功能&am…...
demo说明
代码说明 MDIO总线的注册和初始化:分配并注册MDIO总线,用于与PHY设备通信。 网络设备的创建:分配网络设备(如以太网接口)。 PHY设备连接:通过phy_connect函数连接PHY设备,指定回调函数my_adj…...
【c++篇】:从基础到实践--c++内存管理技巧与模版编程基础
✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:c篇–CSDN博客 文章目录 前言一.c/c内存分布二.c/c的动态内存管理方式2.1.c语言的动态内存管…...
如何减小 Maven 项目生成的 JAR 包体积 提升运维效率
在使用 Maven 构建 Java 项目时,有时需要减小生成的 JAR 包的体积,以提高部署效率或减少资源消耗。以下是一些有效的方法来减小 JAR 包的体积: 排除不必要的依赖打包时,依赖jar包独立于应用jar包 1. 排除不必要的依赖 通过排除项目…...
Python自动化会议记录与摘要生成
前言 在现代工作环境中,会议是团队沟通和决策的重要方式。然而,整理会议记录和生成摘要往往是一项耗时且容易出错的任务。幸运的是,借助Python编程语言以及一些强大的库,我们可以自动化这一过程,让机器帮助我们完成这…...
SwiftUI 中 List 或 Form 子视图关联的 swipeAction 导致展开动画异常的解决
问题现象 小伙伴们都知道,在 SwiftUI 中更快捷的增强 List 或 Form 子视图(Cell)交互功能的方法是使用 swipeAction 修改器。不过,对其使用稍有不慎也会横生枝节。 如上图所示,不适当的设置 Cell 视图布局会使 swipeAction 无法生成正确的收缩和展开动画。对此我们有什么…...
Apache Paimon Catalog
Paimon Catalog可以持久化元数据,当前支持两种类型的metastore: 文件系统(默认):将元数据和表文件存储在文件系统中。hive:在 hive metastore中存储元数据。用户可以直接从 Hive 访问表。 2.2.1 文件系统…...
C++基础:三个字符串也能搞大小?
上一篇说了三个整数比较大小,按照顺序输入的,这次我们看看字符串的,顺便把那个简化以下: 题目:这次输入三个字符串。如果用户输入“Stenbeck", “Hemingway”,“Fitzgerald”,输出将是“Fitzgerald,Hemingway&…...
了解AIGC——自然语言处理与生成
AIGC——自然语言处理与生成:揭秘AI如何生成语言 近年来,AIGC(AI Generated Content)技术迅猛发展,自然语言处理(Natural Language Processing, NLP)与生成技术的结合,使得机器不仅…...
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。…...
人脸应用实例:性别年龄预测
在当今科技飞速发展的时代,人脸识别技术已经从科幻电影走进了我们的日常生活。通过算法来识别人脸的特征,进而判断身份、年龄和性别,这一技术正逐步改变着我们的生活方式。今天,我们就来探讨一下基于深度学习的人脸应用实例——性…...
学习threejs,通过THREE.Raycaster给模型绑定点击事件
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.Raycaster光线投射概…...
Jackson Json序列化反序列化的两个坑
Jackson is a suite of data-processing tools for Java (and the JVM platform) Jackson最常用的Json序列化功能,引入如下的包即可: <properties>...<!-- Use the latest version whenever possible. --><jackson.version>2.17.1<…...
k8s_Pod健康检查
Kubernetes 3种探针介绍 LivenessProbe(存活探针) LivenessProbe 用于检查容器是否仍然活着。如果探针检测到容器已经失去响应,Kubernetes 将重启该容器。这通常用来修复由于内部状态错误或死锁引起的程序失效问题。 作用:检测容器…...
基于DDPG算法的股票量化交易
项目源码获取方式见文章末尾! 回复暗号:13,免费获取600多个深度学习项目资料,快来加入社群一起学习吧。 **《------往期经典推荐------》**项目名称 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接口。 注意:用户发生点击行为或者发起支付回调后,才可以调起订阅消息界面 requestSubscribeMessage() {uni.requestSubscribeMessage({tmplIds: [],//需要订阅的消息模板的id的集合,一次调用最多可…...
网络原理(传输层)->TCP协议解
前言 大家好!我是小帅,今天我们来学习TCP协议,个人主页 文章目录 1. TCP协议2. TCP的核心机制2.1TCP核心机制一:确认应答2.2 TCP核心机制二:超时重传2.3 TCP核心机制三:连接管理2.4 TCP核心机制四…...
oracle imp和exp 导入不同库的用户和表空间
参考: oracle 导入(imp)数据时的表空间(tablespace users)问题_imp tablespace-CSDN博客 网上的解决办法大概都是这种,但是实际测试19c数据库并不能成功,所以最后采取在导出文件上强行修改表空间的办法,改完后再继续执行导出导入…...
滚珠丝杆的精度级别如何分?
滚珠丝杆是一种常见的线性传动装置,广泛应用于各种机械设备和自动化系统中。滚珠丝杆的精度等级划分是评估其传动精度和运动平稳度的重要标准,滚珠丝杆的精度级别划分主要基于传动中实际移动距离与理想移动距离的偏差,偏差越小,精…...
ComfyUI初体验
ComfyUI 我就不过多介绍了,安装和基础使用可以看下面大佬的视频,感觉自己靠图文描述的效果不一定好,大家看视频比较方便。 ComfyUI全球爆红,AI绘画进入“工作流时代”?做最好懂的Comfy UI入门教程:Stable D…...
DPI-C动态库so的使用
文章目录 前言一、方法介绍二、demo演示2.1 文件准备2.2 执行仿真2.3 仿真结果 总结 前言 在做IC验证EDA仿真过程中,有时候需要调用C实现的参考模块,我们可以利用DPI-C的功能,实现SV侧调用C侧的函数。 在具体实现过程中,我们可以…...
Java避坑案例 - 高并发场景下的分布式缓存策略
文章目录 概述缓存常见问题及解决方案把 Redis 当作数据库常用的数据淘汰策略如何选择合适的驱逐算法 缓存雪崩问题复现解决方案 缓存击穿(热点缓存失效)问题复现解决方案 缓存穿透问题复现解决方案缓存穿透 vs 缓存击穿 缓存与数据库的一致性先更新缓存…...
Python中的字符串修剪:strip()、lstrip() 和 rstrip()
Python中的字符串修剪 Python 中的字符串修剪:strip()、lstrip() 和 rstrip()strip()lstrip()rstrip()应用场景结论 Python 中的字符串修剪:strip()、lstrip() 和 rstrip() 在 Python 开发中,我们经常需要处理字符串,其中一项常见…...
K8S配置storage-class
简介 Kubernetes支持NFS存储,需要安装nfs-subdir-external-provisioner,它是一个存储资源自动调配器,它可将现有的NFS服务器通过持久卷声明来支持Kubernetes持久卷的动态分配。该组件是对Kubernetes NFS-Client Provisioner的扩展࿰…...
多线程——线程池
目录 前言 一、什么是线程池 1.引入线程池的原因 2.线程池的介绍 二、标准库中的线程池 1.构造方法 2.方法参数 (1)corePoolSize 与 maximumPoolSize (2)keepAliveTime 与 unit (3)workQueue&am…...
VScode插件:前端每日一题
大文件上传如何做断点续传? 在前端实现大文件上传的断点续传,通常会将文件切片并分块上传,记录每块的上传状态,以便在中断或失败时只上传未完成的部分。以下是实现断点续传的主要步骤和思路: 1. 文件切片 (File Slici…...
Android跨进程通信
1、跨进程通信的几种方式 在 Android 中,跨进程通信 (IPC, Inter-Process Communication) 方式有多种,主要用于在不同的应用或进程之间传递数据。常见的跨进程通信方式包括: AIDL (Android Interface Definition Language) • 描述ÿ…...
【初阶数据结构】计数排序 :感受非比较排序的魅力
文章目录 前言1. 什么是计数排序?2. 计数排序的算法思路2.1 绝对位置和相对位置2.2 根据计数数组的信息来确认 3. 计数排序的代码4. 算法分析5. 计数排序的优缺点6.计数排序的应用场景 前言 如果大家仔细思考的话,可能会发现这么一个问题。我们学的七大…...
前后双差速轮之LQR控制
在之前的代码中,我们实现了前后两对双差速轮AGV的运动学正解和逆解。但为了实现对AGV的精确路径跟踪和姿态控制,我们需要引入控制算法。线性二次型调节器(LQR)是一种常用的最优控制方法,可以有效地将系统的状态误差最小化。本文将详细说明如何在之前的C++代码中加入LQR控制…...
提供服务好的网站归档系统/百度网络优化推广公司
类似于文本框里面hint文字在初始化的时候显示或者隐藏的操作,就要用到setOnFocusChangeListener的 首先我觉得不是太必要~ 毕竟当你输入东西时,默认文字自然会消失 当然如果你执意要这样做 你可以在onCreate方法中通过findViewById找到该Edi…...
龙华app网站制作/优化设计四年级上册数学答案
linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另 外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命…...
网站备案 地址/最近的国际新闻热点
说起操作系统是如何启动的,首先有必要了解一下操作系统诞生的历史背景。通过了解历史背景,我们才能明确操作系统基本的工作逻辑。 操作系统诞生的历史背景 1936年,著名计算机学家图灵提出了图灵机的架构,控制器通过读写数据实现…...
商城网站建设 优帮云/做网页设计的软件
更多干货 分布式实战(干货) spring cloud 实战(干货) mybatis 实战(干货) spring boot 实战(干货) React 入门实战(干货) 构建中小型互联网企业架构&…...
苏州网站优化企业/网络推广专员是干什么的
前言 在本篇文章开始前,我想想来回答一个问题:我为什么要写这一篇关于面试的文章? 原因有三:第一,我想为每一个为梦想时刻准备着的”有心人“尽一份自己的力量,提供一份高度精华的Java面试清单࿱…...
wordpress博客管理/个人可以做推广的平台有哪些
与数组的区别: 数组的长度是固定的,集合的长度是可变的。数组用来存放基本类型的数据,集合用来存放对象的引用。 1、集合类接口的常用方法 COllection接口是层次结构中的根接口,该接口提供了添加和删除元素、管理数据的方法。…...