【R + Python】iNaturalist 网站图片下载 inat api

文章目录
- 一、iNaturalist 简介
- 二、R语言API:rinat
- 三、示例
- 3.1 获取观测数据
- 3.2 绘制可视化图像
- 函数用法
- 3.4 在区域网格中搜索
- 3.5 下载图片
- 3.51 提取图片 url
- 3.52 下载图片: R语言
- 3.53 下载图片: python
- 四、获取详细rinat包的文档
一、iNaturalist 简介
💻网址:https://www.inaturalist.org/
iNaturalist 是一个全球性的自然观察社区和生物多样性数据库,它允许用户记录和分享他们在自然界中的观察。这个平台由加州科学院(California Academy of Sciences)和国家地理学会(National Geographic Society)联合资助,并且得到了微软“AI for Earth”项目的支持,提供云计算资源和人工智能技术帮助提升图像识别能力。
用户可以在iNaturalist上记录他们遇到的各种生物,包括动物、植物、真菌等,并且可以上传相关的图片或描述。这些观察记录可以贡献给科学研究,帮助科学家和资源管理者了解生物多样性的分布和状况。iNaturalist社区鼓励用户参与讨论,鉴定物种,并与其他自然爱好者交流。
此外,iNaturalist还提供了一些额外的功能,比如创建项目(Projects)、运行生物多样性调查活动(Bioblitz)、以及通过图鉴(Life List)来管理和展示个人的自然观察记录。
iNaturalist不仅是一个数据记录平台,它还注重社区的建设和参与。它鼓励用户成为公民科学家,通过参与项目和活动来贡献自己的观察数据,这些数据可以被科学家用于研究和保护生物多样性。
总的来说,iNaturalist是一个强大的工具,它结合了社区的力量和科技的支持,旨在促进自然观察、生物多样性研究和环境保护。
🧩网站图片示例:

二、R语言API:rinat
R 语言提供了用于该网站的包。
rinat 是一个R语言的包,它提供了一个程序化接口来访问iNaturalist网站提供的API,以便下载由公民科学家提交的物种出现数据。这个包允许用户通过各种搜索参数来检索观察数据,例如物种名称、地点、日期、记录质量等。
以下是一些rinat包的主要功能:
-
获取观察数据:使用
get_inat_obs()函数,可以根据查询字符串、物种名称、地点、日期等条件来检索iNaturalist上的观察数据。 -
项目观察:通过
get_inat_obs_project()函数,可以获取特定项目的所有观察数据,如果知道项目的ID或iNaturalist上的slug名称。 -
观察详情:使用
get_inat_obs_id()函数,可以通过观察ID来检索特定观察的详细信息。 -
用户观察:
get_inat_obs_user()函数允许你获取特定用户的所有观察数据。 -
物种统计:
get_inat_taxon_stats()函数可以获取特定物种的统计信息。 -
用户统计:
get_inat_user_stats()函数可以获取特定用户的统计信息。 -
制图功能:
inat_map()函数可以快速创建基本地图,以可视化搜索结果。
安装rinat包的步骤如下:
- 通过CRAN安装最新版本:
install.packages("rinat")
- 或者,从GitHub安装开发版本:
remotes::install_github("ropensci/rinat")
三、示例
3.1 获取观测数据
以get_inat_obs函数为例: 参数
| 参数 | 描述 |
|---|---|
query | 查询字符串,用于进行一般搜索。 |
taxon_name | 根据 iNaturalist 分类名称进行过滤。注意,这也会选择后代分类单元的观测。名称可能不是唯一的,匹配多个分类时可能返回空结果。 |
taxon_id | 根据 iNaturalist 分类 ID 进行过滤。与 taxon_name 类似,也会选择后代分类单元的观测。 |
place_id | 根据 iNaturalist 地点 ID 进行过滤。 |
quality | 数据的质量等级,必须是 “casual”(随意)或 “research”(研究)。如果留空,则返回所有质量的数据。 |
geo | 仅返回有地理参考的结果。如果设置为 TRUE,将排除没有地理参考的数据。 |
annotation | 根据注解进行过滤。是一个长度为 2 的向量,第一个元素是术语 ID(例如 “1” 表示生命阶段),第二个元素是值 ID(例如 “2” 表示成体)。 |
year | 只返回指定年份的观测结果(只能是一个具体年份,不能是年份范围)。 |
month | 根据月份过滤观测结果,必须为 1 到 12 的数字。 |
day | 根据日期过滤观测结果,必须为 1 到 31 的数字。 |
bounds | 搜索范围的边界框,以经度(-180 到 180)和纬度(-90 到 90)表示。格式为 [南纬, 西经, 北纬, 东经],也可以提供 sf 或 sp 对象来确定边界框。 |
maxresults | 返回结果的最大数量,不应超过 10000。 |
meta | 布尔值。如果设置为 TRUE,函数输出将是一个包含元数据和数据框的列表;如果为 FALSE(默认),则只返回数据框。 |
返回值
- 返回一个包含请求的观测数据的数据框。
- 如果
meta = TRUE,则返回一个包含元数据和数据框的列表。
这个函数的过滤功能有时可能不稳定,尤其是 query 参数。在某些情况下,使用 taxon 字段进行科学名称过滤可能效果更好。
🟢搜索伦敦,2024年的图片:
library(rinat)
library(sf)# 这是伦敦的行政区划数据文件,我前一篇文章写了
London <- st_read('E:/Analysis/zenodo/data/admin/boundaries/London.shp')observations <- get_inat_obs(bounds = London ,quality ='research',maxresults = 10,year = 2024)
返回结果包含很多信息,打印返回数据的类型和列名:
> class(observations)
[1] "data.frame"
> colnames(observations)[1] "scientific_name" "datetime" "description" [4] "place_guess" "latitude" "longitude" [7] "tag_list" "common_name" "url"
[10] "image_url" "user_login" "id"
[13] "species_guess" "iconic_taxon_name" "taxon_id"
[16] "num_identification_agreements" "num_identification_disagreements" "observed_on_string"
[19] "observed_on" "time_observed_at" "time_zone"
[22] "positional_accuracy" "public_positional_accuracy" "geoprivacy"
[25] "taxon_geoprivacy" "coordinates_obscured" "positioning_method"
[28] "positioning_device" "user_id" "user_name"
[31] "created_at" "updated_at" "quality_grade"
[34] "license" "sound_url" "oauth_application_id"
[37] "captive_cultivated"
使用image_url就可以下载该图片。
比如这张:https://static.inaturalist.org/photos/444220864/medium.jpeg
3.2 绘制可视化图像
🟢(1) 简单的plot绘制,根据经纬度绘制点即可:
# 绘制观测点,设置颜色
plot(observations$longitude, observations$latitude, col = "blue", # 设置点的颜色为蓝色pch = 19, # 设置点的形状,19 是实心圆点xlab = "Longitude", ylab = "Latitude",main = "iNaturalist Observations in London 2024") # 设置图形标题

🟢(2)inat_map函数绘制
map <- inat_map(observations,map = 'world', subregion = "UK")
这个貌似只能精确到国家,比如我搜索的是伦敦的数据,但绘图是英国的。

inat_map() 函数用于绘制 iNaturalist 观测数据的地图。该函数不仅可以自动绘制地图,还可以返回一个 ggplot 对象,供用户进一步修改和添加图层。
函数用法
inat_map(data, map = "usa", subregion = ".", plot = TRUE)
| 参数 | 描述 |
|---|---|
data | 包含 iNaturalist 观测数据的数据框,通常通过 get_inat_obs() 获取,数据中必须包含经纬度。 |
map | 要绘制的地图区域,默认值为 "usa"(美国),可以参考 map 包的文档获取其他区域的名称。 |
subregion | 地图子区域名称,默认是 ".",即整个指定区域,也可以根据需求绘制更小的子区域。 |
plot | 逻辑值,默认值为 TRUE,表示直接绘制地图。如果为 FALSE,则返回一个 ggplot 对象,用户可以进一步修改。 |
🟢(3)使用ggplot2
library(ggplot2)# 将观测数据转换为 sf 对象,便于与伦敦边界一起绘制
# 使用 longitude 和 latitude 列作为坐标
observations_sf <- st_as_sf(observations, coords = c("longitude", "latitude"), crs = st_crs(London))# 使用 ggplot2 绘制伦敦边界和观测数据
ggplot() +geom_sf(data = London, fill = "lightgray", color = "black") + # 绘制伦敦边界geom_sf(data = observations_sf, aes(color = species_guess), size = 3) + # 绘制观测数据,使用 species_guess 作为颜色scale_color_viridis_d() + # 使用 Viridis 颜色刻度labs(title = "iNaturalist Observations in London 2024", color = "Species") + # 添加标题和颜色标签theme_minimal()

3.4 在区域网格中搜索
将目标区域分为多个网格,在每个网格中进行搜索,这样可以是的搜索结果更加均匀。
注意:网格尺度太大,或者搜索限制太宽松,会导致get_inat_obs函数返回太多值,会报错。
或者错误的边界会返回0个结果(网格区域表示为[南纬, 西经, 北纬, 东经],顺序不能错了)。

🔹🔹示例代码:
# 加载所需的包
library(rinat)
library(dplyr)
library(sf)
library(ggplot2)gc()# 读取伦敦边界 shapefile
London <- st_read('E:/Analysis/zenodo/data/admin/boundaries/London.shp')grid <- London %>%# 将伦敦边界转换为英国国家网格坐标系(OSGB 1936,EPSG:27700),这是一个常用的投影系统,适合用于测量距离(以米为单位)。st_transform(27700) %>% st_make_grid(cellsize = 10000) %>% st_sf() %>% mutate(cell = seq(1:nrow(.))) %>%select(cell, everything()) %>%st_transform(4326)# 统计每个网格的观测数据
observations_list <- lapply(1:nrow(grid), function(i) {g <- grid[i, ] # 选择第i个网格bbox <- st_bbox(g) # 获取边界框bounds <- c(bbox["ymin"], bbox["xmin"], bbox["ymax"], bbox["xmax"]) # [南纬, 西经, 北纬, 东经]print(paste("searching for observations in grid cell",i,"out of",nrow(grid)))# 获取每个网格区域内的 iNaturalist 观测数据,限制为10个obs <- get_inat_obs(bounds = bounds, maxresults = 10,quality = 'research',year = 2024) print(paste("..success..adding",nrow(obs),"records"))# 检查是否有观测数据返回if (nrow(obs) > 0) {return(obs)} else {return(NULL) # 没有数据返回NULL}
})# 将观测数据列表转换为数据框,去除NULL值
observations_df <- do.call(rbind, observations_list)# 将观测数据转换为 sf 对象
observations_sf <- st_as_sf(observations_df, coords = c("longitude", "latitude"), crs = st_crs(London))# 过滤观测数据,只保留在伦敦边界内的观测
observations_within_london <- observations_sf[st_intersects(observations_sf, London) %>% lengths > 0,] # 如果有观测数据,转换为 sf 对象
if (nrow(observations_within_london) > 0) {# 使用 ggplot2 绘制伦敦边界和观测数据ggplot() +geom_sf(data = London, fill = "lightgray", color = "black") + # 绘制伦敦边界geom_sf(data = observations_within_london, aes(color = species_guess), size = 3, show.legend = FALSE) + # 绘制观测数据scale_color_viridis_d() + # 使用 Viridis 颜色刻度labs(title = "iNaturalist Observations in London 2024", color = "Species") + # 添加标题theme_minimal()
} else {print("没有找到任何观测数据。")
}
3.5 下载图片
其实就是根据图片的url下载,很多语言都可以实现的。
3.51 提取图片 url
你也可以根据需要,保存更多的变量,比如经纬度之类的。
# 保存图片的url
inat_urls <- observations_within_london %>%st_drop_geometry() %>% # 去掉 geometry 列select(id,image_url)%>%mutate(id = paste0("i",id)) %>%filter(!is.na(id) & !is.na(image_url))library(tidyverse)
write_csv(inat_urls, paste0("./inat_urls_1.csv"))
3.52 下载图片: R语言
# 加载必要的包
library(tidyverse)# 读取 CSV 文件
inat_urls <- read_csv("./inat_urls_1.csv")# 确保 URL 列和 ID 列的名称正确
url_column <- "image_url"
id_column <- "id"# 创建一个下载目录(如果没有的话)
dir.create("images", showWarnings = FALSE)# 下载每个 URL 对应的图片
for (i in 1:nrow(inat_urls)) {# 获取当前 URL 和对应的 IDimage_url <- inat_urls[[url_column]][i]image_id <- inat_urls[[id_column]][i]# 生成保存图片的文件名,使用 IDimage_name <- paste0("images/", image_id, ".jpg") # 假设文件格式为 .jpg,调整为实际格式# 下载图片tryCatch({download.file(image_url, destfile = image_name, mode = "wb") # mode = "wb" 适用于二进制文件message(paste("Downloaded:", image_name))}, error = function(e) {message(paste("Failed to download:", image_url))})
}

3.53 下载图片: python
这是论文:Social media and deep learning reveal specific cultural preferences for biodiversity 的参考代码
下载中断后可以继续上次的下载,做法是:下载过的图片,在csv文件中会新增dl列,值设置为Y。

import time
import pandas as pd
import urllib.request
import urllib.error
import http
from io import BytesIOfrom PIL import Image, ImageFileImageFile.LOAD_TRUNCATED_IMAGES = True# csv 文件序号后缀
s = 1# Set directory
proj_dir = "E:/R_Language"# General functionsdef open_image(entry):"""function to open image"""img = [] # empty img list object as defaultimage_url = entry.iloc[1] # start with lowest resolution imageif image_url != image_url:print("...none available")image_url = []print(f"image found at {image_url}")if len(image_url) != 0:e = None # empty error objectn = 0 # create request error counterwhile True:try:response = urllib.request.urlopen(image_url)img = Image.open(BytesIO(response.read()))img = img.convert('RGB')img = [img.resize((400, 400))]breakexcept (urllib.error.ContentTooShortError, ConnectionResetError) as ex:print(ex)print('error...retrying...')n += 1if n > 10: # after ten error messages, move onbreaktime.sleep(1)continueexcept (urllib.error.HTTPError, http.client.IncompleteRead,urllib.error.URLError) as ex:print(ex)if str(ex) in ("HTTP Error 403: Forbidden", "HTTP Error 404: Not Found", "HTTP Error 410: Gone"):print('...does not exist...moving on...')e = exbreakelse:print('...retrying...')time.sleep(2)continuereturn (img)def next_id(df):"""function to load index of last downloaded image"""if 'dl' in df:df = df.iloc[:, 2]i = pd.Series.last_valid_index(df) + 1else:i = 0return (i)def main():# image_urls = pd.read_csv(f"{proj_dir}/data/inat/urls/inat_urls_{s}.csv")image_urls = pd.read_csv(f"{proj_dir}/inat_urls_{s}.csv")# image_dir = f"{proj_dir}/data/inat/imgs" # results file id (later split between atts and scenes)image_dir = f"{proj_dir}/images"start_i = next_id(image_urls)for i in range(start_i, len(image_urls)):print(f"Analysing image {i + 1} out of {len(image_urls)}")image = open_image(image_urls.iloc[i])if image: # if list is not emptyprint(f"...image exists, downloading...")image[0].save(f"{image_dir}/{image_urls.iloc[i, 0]}.jpg")image_urls.loc[i, 'dl'] = 'Y'# image_urls.to_csv(f"{proj_dir}/data/inat/urls/inat_urls_{s}.csv", sep=',', index=False)image_urls.to_csv(f"{proj_dir}/inat_urls_{s}.csv", sep=',', index=False)else:print(f"Image for metadata record {i + 1} does not exist, moving on...")image_urls.loc[i, 'dl'] = 'N'# image_urls.to_csv(f"{proj_dir}/data/inat/urls/inat_urls_{s}.csv", sep=',', index=False)image_urls.to_csv(f"{proj_dir}/inat_urls_{s}.csv", sep=',', index=False)if __name__ == '__main__':main()
四、获取详细rinat包的文档
在R的控制台输入相关函数的帮助,即可查看全部参数和详细说明:
如:
help(get_inat_obs)

相关文章:
【R + Python】iNaturalist 网站图片下载 inat api
文章目录 一、iNaturalist 简介二、R语言API:rinat三、示例3.1 获取观测数据3.2 绘制可视化图像函数用法 3.4 在区域网格中搜索3.5 下载图片3.51 提取图片 url3.52 下载图片: R语言3.53 下载图片: python 四、获取详细rinat包的文档 一、iNaturalist 简介 …...
C#与Sqlite数据库
1,一般的访问方式。 1.1,连接语句。 //sqlite 连接,支持相对位置,也支持绝对位置 Data Source../../Database/cater.db// 连接数据库,FailIfMissingfalse时若文件不存在会自动创建 string connStr "DataSourcetest.db;Vers…...
2019年计算机网络408真题解析
第一题: 解析:OSI参考模型第5层完成的功能 首先,我们需要对OSI参考模型很熟悉:从下到上依次是:物理层-数据链路层-网络层- 运输层-会话层-表示层-应用层,由此可知,题目要问的是会话层的主要功能…...
江协科技STM32学习- P21 ADC模数转换器
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...
[RK3566-Android11] 使用SPI方式点LED灯带-JE2815/WS2812,实现呼吸/渐变/随音量变化等效果
问题描述 之前写了一篇使用GPIO方式点亮LED灯带的文章 https://blog.csdn.net/jay547063443/article/details/134688745?fromshareblogdetail&sharetypeblogdetail&sharerId134688745&sharereferPC&sharesourcejay547063443&sharefromfrom_link 使用GPIO…...
PostgreSQL用load语句加载插件
文章目录 1. LOAD 语法2. 用途3. 示例4. 注意事项5. 其他相关命令6. 总结 在 PostgreSQL 中,LOAD 主要用于加载共享库,通常用于扩展功能或性能优化。以下是一些有关 LOAD 语句和 PostgreSQL 中的加载操作的关键信息: 1. LOAD 语法 LOAD 语句…...
一文了解:增强图像搜索之图像嵌入
图像嵌入在现代计算机视觉领域扮演着明星角色,它使得计算机能够像人类一样识别出各种各样的图像。由于计算机只能处理数字信息,我们需要将图像转换成数字向量,并存储在向量数据库中,这样就能迅速地检索到它们。 谈到嵌入技术&…...
yolov9目标检测/分割预测报错AttributeError: ‘list‘ object has no attribute ‘device‘常见汇总
这篇文章主要是对yolov9目标检测和目标分割预测测试时的报错,进行解决方案。 在说明解决方案前,严重投诉、吐槽一些博主发的一些文章,压根没用的解决方法,也不知道他们从哪里抄的,误人子弟、浪费时间。 我在解决前&…...
格姗知识圈博客网站开源了!
格姗知识圈博客 一个基于 Spring Boot、Spring Security、Vue3、Element Plus 的前后端分离的博客网站!本项目基本上是小格子一个人开发,由于工作和个人能力原因,部分技术都是边学习边开发,特别是前端(工作中是后端开…...
【C++】深入理解C++中的类型推导:从auto到decltype的应用与实践
C11引入了类型推导特性,旨在简化代码并提升开发效率。类型推导使开发者无需显式指定变量的类型,从而让代码更具可读性和灵活性。本文深入探讨了C11引入的auto、decltype和decltype(auto)等关键特性,通过分析其背后的设计理念、实际应用场景&a…...
使用Prometheus对微服务性能自定义指标监控
背景 随着云计算和容器化技术的不断发展,微服务架构逐渐成为现代软件开发的主流趋势。微服务架构将大型应用程序拆分成多个小型、独立的服务,每个服务都可以独立开发、部署和扩展。这种架构模式提高了系统的可伸缩性、灵活性和可靠性,但同时…...
深入解析 Lombok 的实现原理:以 @Builder 为例的实战演示(三)
文章目录 Lombok 的实现原理概述以 Builder 为例:解析 Lombok 如何生成 Builder 模式示例代码:没有 Lombok 的 Builder 模式使用 Lombok 的 Builder 简化代码 Lombok 如何实现 Builder:源码解析案例演示:自定义构造逻辑Lombok 的代…...
SEO基础:什么是SERP?【百度SEO专家】
SEO基础:什么是SERP? 大家好,我是林汉文(百度SEO专家),在进行SEO(搜索引擎优化)时,理解SERP是一个非常重要的基础概念。那么,究竟什么是SERP呢?本…...
HTML5教程(一)- 网页与开发工具
1. 什么是网页 网页 基于浏览器阅读的应用程序,是数据(文本、图像、视频、声音、链接等)展示的载体常见的是以 .html 或 .htm 结尾的文件 网站 使用 HTML 等制作的用于展示特定内容相关的网页集合。 2. 网页的组成 浏览器 代替用户向服务…...
Java进阶篇设计模式之二 ----- 工厂模式
前言 在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法。本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式、工厂方法和抽象工厂模式。 简单工厂模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法模式。…...
考研篇——数据结构王道3.2.2_队列的顺序实现
目录 1.实现方式说明2.代码实现2.12.1.1 代码12.1.2 代码22.1.3 代码3 2.22.2.1 代码42.2.5 代码52.2.6 代码6 总结 1.实现方式说明 多在选择题中考察 队尾指针(rear)有两种指向方式: 队尾指针指向队尾元素的位置,队尾指针指向…...
从零开始理解 Trie 树:高效字符串存储与查找的利器【自动补全、拼写检查】
题目分析 这道题让我们实现一个 Trie 类(也称为前缀树),以便高效地插入和查询字符串。前缀树是一种特殊的树形数据结构,适用于快速存储和检索字符串数据集中的键,比如实现 自动补全 和 拼写检查。 题目要求 Trie 类…...
关于sse、websocket与流式渲染
一、SSE是什么? 网络中的 SSE (Server-Sent Events) 是一种服务器向浏览器单向推送数据的机制,常用于需要实时更新的数据传输,如新闻推送、股票行情、聊天应用等。 SSE 的特点: 单向通信:服务器向客户端推送数据&…...
Python 语法与数据类型详解
Python 语法与数据类型详解 Python 以其简洁易读的语法和丰富多样的数据类型在编程领域占据重要地位。深入理解 Python 的语法和数据类型是掌握这门语言的关键。 一、Python 语法概述 (一)缩进规则 Python 独特的缩进规则是其语法的重要特征之一。与…...
LeetCode题练习与总结:扁平化嵌套列表迭代器--341
一、题目描述 给你一个嵌套的整数列表 nestedList 。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化,使之能够遍历这个列表中的所有整数。 实现扁平迭代器类 NestedIterato…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
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 开发者设计的强大库ÿ…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
