Bulk RNA-seq上下游分析

news2024/11/17 23:41:06

Bulk-RNA-seq上下游分析还是相对简单的,这次我以mouse为例,进行Bulk-RNA-seq上下游分析,并进行对应的图片绘制。

上游分析

1.软件准备

#安装所需软件
sudo apt install fastqc
sudo apt install hisat2
sudo apt install cutadapt
sudo apt install subread
conda install -c bioconda multiqc
conda install trim-galore
#新建文件夹
mkdir anntation bam cleandata genome QC rawdata results

2.文件准备

#下载fasta和gtf文件
wget -P genome/ -c https://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_mouse/release_M25/GRCm38.p6.genome.fa.gz
wget -P anntation/ -c https://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_mouse/release_M25/gencode.vM25.annotation.gtf.gz
gzip -dk genome/GRCm38.p6.genome.fa.gz #解压参考基因组
gzip -dk anntation/gencode.vM25.annotation.gtf.gz #解压基因注释文件
#Aspera下载fastq数据,比sra-tools快太多了,具体下载链接在EBI数据库中下载样本的TSV文件
#这里我们用的是单端SE测序的文件,挺古老,但是不管双端PE单端SE区别不大。
for i in {1..4}
do
    ascp -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh -l 100M -T -P33001 -k 1 era-fasp@fasp.sra.ebi.ac.uk:/vol1/fastq/SRR137/00${i}/SRR137492${i}/SRR137492${i}.fastq.gz ./rawdata
done

3.trim_galore数据质控

通过fastqc质控,看一下测序数据的质量,看看哪些需要调整一下。fastq文件过滤这里我们用了trim_galore,除此之外fastp也很优秀,两者功能类似,但我认为fastp更好。

for i in 'ls ./rawdata/*.fastq.gz'
do
    fastqc $i -o QC/ --noextract
    multiqc ./QC/*.zip -o ./QC
    ./TrimGalore-0.6.7/trim_galore --quality 25 --fastqc --phred33 --length 25 -j 10 \
        --output_dir cleandata ${i}
done
#双端过滤可以加--paired,在末尾输入正反链

4.hisat2比对

比对用的hisat2,比较常用,其他的比对工具还有gencode数据库的star和tophat2等。

#比对
#构建fasta的index
hisat2-build genome/GRCm38.p6.genome.fa ./genome/mm10

for i in 'ls cleandata/*.gz'
do
    x=${i%_trimmed.fq.gz}
    y=${x#cleandata/}
    hisat2 -p 10  -x genome/mm10  -U $i  -S bam/$y.sam |tee $y.alignment.log #比对
    samtools view -bS bam/$y.sam | samtools sort -@ 8 -o bam/$y-sort.bam #sort
    samtools index bam/$y-sort.bam #索引
done
-p 线程
-U 单端测序,双端用-1 1.fa.gz -2 2.fq.gz
-S 输出bam文件名
-x 参考基因组

5.featureCounts定量


#计算count
featureCounts \
    -T 10 \
    -g gene_name \ #得到的count矩阵的行名,gene_id or gene_name比较常用
    -p \
    -a annotation/gencode.vM25.annotation.gtf \ #gtf基因注释文件
    -o results/final_featureCounts.txt \ #结果count矩阵
    bam/*.bam
    
#-T 线程
#-g gtf第9列为key=value的格式,包括gene_id,gene_name等
#-p PE时计算fragment,SE时计算read(SE时read和fragment一样)

这样我们就得到后续下游分析所需的count矩阵了。

下游分析

在分析之前需要下载一系列的R包
install.packages( ) 下载一些常规的包
BiocManager::install( ) 下载bioconductor上的包

#说实话我忘记哪些包需要下载了,但是遇到没有的包用install.packages( )或BiocManager::install( )都试一遍就行。
install.packages('ggplot2')
install.packages('stingr')
BiocManager::install('DESeq2')
BiocManager::install('org.Mm.eg.db')
BiocManager::install('clusterProfiler')

1.文件预处理

注意DESseq2用的是原始的count矩阵,也就是上一步我们得到的结果,不需要对测序深度和基因长度进行处理(RPKM、FPRM、CPM)。也不需要normal化,DESeq2有一套自己的处理方法。

rm(list=ls())
options(stringsAsFactors = F)
library(DESeq2) #负二项分布的广义线性模型来做差异表达做检验


#读取文件,final_featureCounts.txt为上一步得到的count矩阵数据
data <- read.table("final_featureCounts.txt", header=TRUE, skip=1, row.names=1)
#调整列名,最终数据行名为基因,列名为样本名,因为最开始输出的列名是bam文件的全名,所以gsub替换掉,仅保留样品名。
colnames(data) <- gsub(".bam", "", colnames(data), fixed=TRUE)
countdata <- data[ , 6:ncol(data)]
colnames(countdata)=gsub('.sort','',colnames(countdata))
#预过滤,基因至少在75%样品中表达,否则就过滤,看自己样本具体情况,最少也得40% or 50%吧。
countdata=countdata[rowSums(countdata>0) >= floor(0.75*ncol(countdata)),]


#读取分组文件,样品的顺序和count矩阵中的要一致
metadata <- read.table("metadata.txt", header=TRUE,row.names = 1)
metadata$Group=factor(metadata$Group,levels = c('A','B'))

矩阵修剪后的结果如下,其实样品一般3v3比较好,这种2v2说服力还是差一些。
在这里插入图片描述
分组文件如下图
在这里插入图片描述

2.DESeq2差异分析

在差异分析过程中我们需要用cluster或者PCA看一下样品的聚类情况,以剔除不合群的样品,这个时候需要对矩阵进行一个类似log10(x+1)的处理,但这个处理后的数据仅仅是用来观察样品聚类情况,与我们进行的差异分析无关。

#DEseq2矩阵构建
dds <- DESeqDataSetFromMatrix(countData=countdata, colData=metadata, design=~Group)
#normalize
dds <- DESeq(dds)


#PCA和cluster检查分组情况
library(ggplot2)
#rlog标准化,通过标准化矩阵看一下样品的PCA和显著性差异基因热图,对count整体标准化
dds_rlog <- rlog(dds, blind=FALSE)
#三种标准化的方法(DESeq2强烈不建议输入文件用归一化过的数据,这里这样处理主要是为了后续画PCA/热图/火山图等)
#1.ntd <- normTransform(dds)或log2(dds+1) 	    #简单的取log2(dds+1)(logarithm)
#2.rld <- rlog(dds, blind=FALSE) 			    #rlog适用于表达量分散以及低表达量占比高 (regularized logarithm)
#2.vsd <- vst(dds, blind=FALSE) 				#对于大样本,vsd更快(varianceStabilizingTransformation)
dds_rlog1=assay(dds_rlog) #用assay才能看具体矩阵大小
plotPCA(dds_rlog, intgroup="Group", ntop=5000) +
  theme_bw() + # 修改主体
  geom_point(size=5) + # 增加点大小
  #scale_y_continuous(limits=c(-10, 20)) +
  ggtitle(label="Principal Component Analysis (PCA)",
          subtitle="Top 500 most variable genes")
#cluster
plot(hclust(dist(t(dds_rlog1))), labels=colData(dds)$protocol)
plot(hclust(dist(t(dds_rlog1))), labels=colData(dds)$time)

PCA结果,利用这个图以及下面的cluster图,我们可以剔除一些离群的样本。
在这里插入图片描述
hclust函数利用欧氏距离计算的层次聚类图。
在这里插入图片描述

#差异分析
res <- results(dds, 
               contrast=c("Group", "A", "B"), #谁和谁比对,前面是研究群体,后面的对照群体
               pAdjustMethod="fdr", alpha=0.05) #显著性方法
res <- na.omit(res)
res <- res[order(res$padj),] #res就是差异分析结果,用as.data.frame(res)可以转出来
summary(res)
mcols(res, use.names=TRUE)


#保存差异分析结果,把counts在样本内做了标准化,从而使不同样本的同一个基因具有可比性
resdata <- merge(as.data.frame(res), as.data.frame(counts(dds, normalized=TRUE)), by="row.names", sort=FALSE)
write.csv(resdata, file="LoGlu_HiGlu_mm39_diff.csv", row.names=FALSE)


#提取显著差异基因
diff_gene <- subset(res, padj < 0.05 & (log2FoldChange > 1 | log2FoldChange < -1))
write.table(x=as.data.frame(diff_gene), file="results_gene_annotated_significant.txt", sep="\t", quote=F, col.names=NA)

差异分析的阈值可以根据自己的数据来判断。一般就是取padj < 0.05, |logFC| > 1或2。

3.绘图

#Top40基因热图
mat <- assay(dds_rlog[row.names(diff_gene)])[1:40, ]
#选择用来作图的列,行名对应样品,Group列对应样品分组
annotation_col <- data.frame(
  Group=factor(colData(dds_rlog)$Group),
  row.names=rownames(colData(dds_rlog))
)
#定义颜色,Group列与上一步一致,定义具体分组标签对应的颜色
ann_colors <- list(
  Group=c(A="lightblue", B="darkorange")
)


library(pheatmap)
library(RColorBrewer)
pheatmap(mat=mat, 
         color=colorRampPalette(c('green','black',"red"))(20), 
         scale="row", # Scale genes to Z-score (how many standard deviations)
         annotation_col=annotation_col, # Add multiple annotations to the samples
         annotation_colors=ann_colors,# Change the default colors of the annotations
         fontsize=6.5, # Make fonts smaller
         cellwidth=55, # Make the cells wider
         show_colnames=F)

在这里插入图片描述

#差异基因与basemean关系
plotMA(res, ylim=c(-5, 5))
plotDispEsts(dds)


#差异最大基因它们的normalized count的比较
top_gene <- rownames(res)[which.max(res$log2FoldChange)]
low_gene <- rownames(res)[which.min(res$log2FoldChange)]
plotCounts(dds=dds, 
           gene=top_gene, 
           intgroup="Group", 
           normalized=TRUE, 
           transform=TRUE)
plotCounts(dds=dds, 
           gene=low_gene, 
           intgroup="Group", 
           normalized=TRUE, 
           transform=TRUE)


#差异分析基因的火山图
library(dplyr)
vol_data <- data.frame(gene=row.names(res),
                       pval=-log10(res$padj),
                       lfc=res$log2FoldChange)
# 设定上调与下调颜色
vol_data <- mutate(vol_data,
                   color=ifelse(vol_data$lfc > 1 & vol_data$pval > 1.3 ,"Increased",
                         ifelse(vol_data$lfc < -1 & vol_data$pval > 1.3 ,"Decreased",'nonsignificant'))
)
vol_data$pval[1:5]=325  #过低的p值截断
vol <- ggplot(vol_data, aes(x=lfc, y=pval, color=color))+ 
  ggtitle(label="Volcano Plot", subtitle="Colored by fold-change direction") +
  geom_point(size=2.5, alpha=0.8, na.rm=T) +
  scale_color_manual(name="Directionality",
                     values=c(Increased="red", Decreased="blue",
                              nonsignificant="darkgray")) +
  theme_bw(base_size=14) +
  theme(legend.position="right") +
  xlab(expression(log[2]("A" / "B"))) +
  ylab(expression(-log[10]("adjusted p-value"))) +
  geom_hline(yintercept=1.3, colour="black",lty=2,lwd=0.3)+
  geom_vline(xintercept=c(-1,1), colour="black",lty=2,lwd=0.3)+
  scale_x_continuous(limits = c(-8,8))

ggsave(vol,filename = '1.vol.pdf',width = 8,height = 6)

火山图中有个问题,就是某些基因的P值太小,有的时候p值还会等于0,这是因为数值超出的R显示的范围,我的建议是截断这些p值,不然过小的p值会导致图形很难看。
在这里插入图片描述

4.富集分析

富集分析其实通俗的讲就是看得到的基因是否真的比正常情况下随机分布的要多。比如某物种总基因3万,某通路总基因500,我们分析得到3000个基因,如果正常分布的话应该有50个基因落在这条通路中,但实际上落在这条通路的基因有100个,显著的高于正常情况,所显著富集。

rm(list = ls())#清空环境变量
options(stringsAsFactors = F)##字符不作为因子读入
library(org.Mm.eg.db)
library(clusterProfiler)
a=read.table('results_gene_annotated_significant.txt',header = T,check.names = F)

#转基因格式,从symbol转ENTREZID,用到小鼠的db包
gene.df <- bitr(rownames(a), fromType="SYMBOL",
                toType="ENTREZID", 
                OrgDb = "org.Mm.eg.db",drop =T) #小鼠db包
#KEGG
kk.diff<- enrichKEGG(gene         = gene.df$ENTREZID,
                     organism     = 'mmu', #mmu是小鼠
                     pvalueCutoff = 0.05,  #adjust p
                     pAdjustMethod='fdr')  #p值矫正方法

kk.diff@result$Description=gsub('\'','',kk.diff@result$Description)
write.table(kk.diff,file="2.KEGG.txt",sep="\t",quote=F,row.names = F)
#GO
kk <- enrichGO(gene = gene.df$ENTREZID,
               OrgDb = 'org.Mm.eg.db', 
               pvalueCutoff =0.05, 
               #qvalueCutoff =1,
               pAdjustMethod='fdr',
               ont="all", #BP,CC,MF
               readable =T
               #,maxGSSize = 2000
               )
kk@result$Description=gsub('\'','',kk@result$Description)
write.table(kk,file="2.GO.txt",sep="\t",quote=F,row.names = F)  

enrich里的pvalue代表的是adj.pvalue,如果你需要的通路p值大于0.05,你可以pvalueCutoff = 1,qvalueCutoff =1 输出所有通路,然后自己在结果中筛选。实际上选择pvalue还是选择adjust pvalue看个人。
ont表示GO的种类,包括CC,MF,BP,也可以使用all全部输出。
maxGSSize表示通路的大小,默认只要500个基因以下的通路,自行选择,比如可以设置maxGSSize = 1000或者2000,再大的话就没有意义了。
之后就是绘图,有各种类型,包括基因数排序,p值排序,自己选择适合自己的就行。

##GO plot
a=read.table('2.GO.txt',header = T,sep = '\t')
library(stringr)
x=as.data.frame(str_split_fixed(a$GeneRatio,'/',n=2))
a$GeneRatio=as.numeric(x$V1)/as.numeric(x$V2)


b=a[a$p.adjust<=0.05,]
b=b[order(b$Count,decreasing = T),]
b=b[10:1,]
b$Description=factor(b$Description,levels = b$Description)

library(ggplot2)
p1=ggplot()+geom_point(data = b,aes(x=GeneRatio,y=Description,
                                 size=Count,color=p.adjust))+
  scale_y_discrete(position = 'right')+ #调整y轴坐标位置,right or left
  scale_color_gradient(low = "#a313b9", high = "#ebdeed",name='P.adjust')+#low = "#E61F19", high = "#f6bdbb"
  theme_bw()+
  theme(plot.title = element_text(hjust = 0.5))+
  labs(y='',title = 'GO')+
  #facet_grid(ONTOLOGY~.,scales = 'free',space = 'free')+
  theme(plot.margin = margin(t=10,b=10,r=10,l=10))+
  theme(panel.grid = element_line(size=0.2))+
  scale_size_continuous(range = c(0.05,6)
                        #,limits = c(20,600),breaks=c(100,300,500)
                        )
ggsave(p1,filename = '3.GO.pdf',width =7,height = 4.5)

在这里插入图片描述

rm(list = ls())#清空环境变量
options(stringsAsFactors = F)##字符不作为因子读入
a=read.table('2.KEGG.txt',header = T,sep = '\t')
a$Description=gsub(' - Mus musculus.+','',a$Description)
library(stringr)
x=as.data.frame(str_split_fixed(a$GeneRatio,'/',n=2))
a$GeneRatio=as.numeric(x$V1)/as.numeric(x$V2)


b=a[a$pvalue<=0.05,]

b=b[order(b$Count,decreasing = T),]

b=b[10:1,]


library(ggplot2)
p1=ggplot()+geom_point(data = b,aes(x=GeneRatio,y=Description,
                                 size=Count,color=pvalue))+
  scale_y_discrete(limits=b$Description)+
  scale_color_gradient(low = "red", high = "blue")+
  theme_bw()+
  theme(plot.title = element_text(hjust = 0.5))+
  labs(y='',title = 'KEGG')+
  theme(plot.margin = margin(t=10,b=10,r=10,l=10))+
  scale_size_continuous(range = c(0.2,5))+
  theme(panel.grid = element_line(size=0.2))


ggsave(p1,filename = '3.KEGG.pdf',width =7.2,height = 4.5)

在这里插入图片描述

rm(list = ls())#清空环境变量
options(stringsAsFactors = F)##字符不作为因子读入
a=read.table('2.KEGG.txt',header = T,sep = '\t')
a$Description=gsub(' - Mus musculus.+','',a$Description)
library(stringr)
x=as.data.frame(str_split_fixed(a$GeneRatio,'/',n=2))
a$GeneRatio=as.numeric(x$V1)/as.numeric(x$V2)


b=a[a$pvalue<=0.05,]

b=b[order(b$pvalue,decreasing = F),]

b=b[10:1,]


library(ggplot2)
p1=ggplot()+
  geom_bar(data=b,aes(x=-log10(pvalue),y=Description),
           stat = 'identity',fill='#f3d130')+
  scale_y_discrete(limits=b$Description)+
  theme_bw()+
  scale_x_continuous(expand = c(0,0),limits = c(0,max(-log10(b$pvalue))+1))


ggsave(p1,filename = '3.KEGG.pdf',width =7.2,height = 4.5)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1222331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习第5天:多项式回归与学习曲线

文章目录 多项式回归介绍 方法与代码 方法描述 分离多项式 学习曲线的作用 场景 学习曲线介绍 欠拟合曲线 示例 结论 过拟合曲线 示例 ​结论 多项式回归介绍 当数据不是线性时我们该如何处理呢&#xff0c;考虑如下数据 import matplotlib.pyplot as plt impo…

皮具生产ERP都有哪些功能?企业应当如选型

箱包皮具型号多、款式多、营销渠道广泛&#xff0c;各个销售平台的管理模式各不相同&#xff0c;而皮具生产企业经营策略和管理模式的差异&#xff0c;也导致企业在市场竞争力等方面参差不齐。 此外&#xff0c;不同的客户有不同的需求&#xff0c;再加上皮具行业竞争的加剧&a…

【鸿蒙应用ArkTS开发系列】- 云开发入门简介

目录 概述开发流程工程概览工程模板工程结构 工程创建与配置 概述 HarmonyOS云开发是DevEco Studio新推出的功能&#xff0c;可以让您在一个项目工程中&#xff0c;使用一种语言完成端侧和云侧功能的开发。 基于AppGallery Connect Serverless构建的云侧能力&#xff0c;开发…

直线插补-逐点比较法

直线插补-逐点比较法 逐点比较法四个节拍的工作流程如图所示举例1 逐点比较法 逐点比较法逐点比较法是通过逐点比较刀具与所需插补曲线之间的相对位置&#xff0c;确定刀具的进给方向&#xff0c;进而加工出工件轮廓的插补方法。刀具从加工起点开始&#xff0c;按照“靠近曲线…

ssrf学习笔记总结

SSRF概述 ​ 服务器会根据用户提交的URL 发送一个HTTP 请求。使用用户指定的URL&#xff0c;Web 应用可以获取图片或者文件资源等。典型的例子是百度识图功能。 ​ 如果没有对用户提交URL 和远端服务器所返回的信息做合适的验证或过滤&#xff0c;就有可能存在“请求伪造”的…

mount /dev/mapper/centos-root on sysroot failed处理

今天发现centos7重启开不进去系统 通过查看日志主要告警如下 修复挂载目录 xfs_repair /dev/mapper/centos-root不行加-L参数 xfs_repair -L /dev/mapper/centos-root重启 reboot

软件测试基础-01

目标&#xff1a; 1.软件测试的定义&#xff1b; 2.7种测试分类的区别&#xff1b; 3.质量模型的重点5项&#xff1b; 4.测试流程的6个步骤&#xff1b; 5.测试模板8要素&#xff1b; 就业方向&#xff1a; 1.功能测试接口测试 2.功能测试性能测试 3.功能测试web自动化…

DAY57 739. 每日温度 + 496.下一个更大元素 I

739. 每日温度 题目要求&#xff1a; 请根据每日 气温 列表&#xff0c;重新生成一个列表。对应位置的输出为&#xff1a;要想观测到更高的气温&#xff0c;至少需要等待的天数。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 例如&#xff0c;给定一个列…

ChatGPT暂时停止开通puls,可能迎来封号高峰期

前言: 前两日,chat gpt的创始人 San Altman在网上发表了,由于注册的使用量超过了他们的承受能力,为了确保每个人的良好使用体验,chat gpt将暂时停止开通gpt plus。 情况: 前段时间好像出现了官网崩溃的情况,就连api key都受到了影响,所以现在就开始了暂时停止puls的注…

OpenAI的Whisper蒸馏:蒸馏后的Distil-Whisper速度提升6倍

1 Distil-Whisper诞生 Whisper 是 OpenAI 研发并开源的一个自动语音识别&#xff08;ASR&#xff0c;Automatic Speech Recognition&#xff09;模型&#xff0c;他们通过从网络上收集了 68 万小时的多语言&#xff08;98 种语言&#xff09;和多任务&#xff08;multitask&am…

零代码编程:用ChatGPT自动合并多个Word文件

一个文件夹中有多个docx格式的word文档&#xff1a; 想要把它们都合并成一个文件&#xff0c;然后打印&#xff0c;可以在ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个处理word内容的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹…

lvgl 画圆弧时进入 HardFault

目录 一、现象描述 lvgl 版本 二、问题分析 lvgl 需要的资源新建mcu 工程时默认分配的资源问题解决 一、现象描述 移植完lvgl 之后&#xff0c;能正常显示label&#xff0c;但是button arc 等复杂的控件都不能正常显示。调用官方的画圆弧demo 时&#xff0c;在多次调用 _lv…

机器学习第4天:模型优化方法—梯度下降

文章目录 前言 梯度下降原理简述 介绍 可能的问题 批量梯度下降 随机梯度下降 基本算法 存在的问题 退火算法 代码演示 小批量梯度下降 前言 若没有机器学习基础&#xff0c;建议先阅读同一系列以下文章 机器学习第1天&#xff1a;概念与体系漫游-CSDN博客 机器学习…

C语言第入门——第十六课

目录 一、分治策略与递归 二、递归 1.求解n的阶乘 2.输入整数、倒序输出 3.输入整数、正序输出 4.计算第n位Fibonacci数列 ​编辑5.无序整数数组打印 6.找到对应数组下标 一、分治策略与递归 在我们遇到大问题的时候&#xff0c;我们的正确做法是将它分解成小问题&a…

3DMAX平铺插件MaxTiles教程

MaxTiles 结合了一组材质和地图插件&#xff0c;任何建筑师或 3D 可视化艺术家都会喜欢。与静态位图纹理不同&#xff0c;MaxTiles 材质可以更改键合图案、替换和混合砖块、更改边缘、随机化颜色、位置、表面等等。MaxTiles 结合了以下功能&#xff1a; 墙壁和瓷砖 – 用于创建…

【计算思维】蓝桥杯STEMA 科技素养考试真题及解析 5

1、要把下面4张图片重新排列成蜗牛的画像&#xff0c;该如何排列这些图片 A、 B、 C、 D、 答案&#xff1a;A 2、将下图的绳子沿虚线剪开后&#xff0c;绳子被分成了()部分 A、6 B、7 C、8 D、9 答案&#xff1a;C 3、下面的立体图形&#xff0c;沿箭头方向看去&#…

“世亚智博会,世亚软博会”双展联动,3月上海,4月杭州,6月北京

2024世亚智博会与世亚软博会双展联动&#xff0c;3月上海&#xff0c;4月杭州&#xff0c;6月北京&#xff0c;历经多年沉淀与打磨&#xff0c;随着扩张速度的不断加快&#xff0c;参展企业的数量也水涨船高&#xff0c;引领行业前沿趋势&#xff0c;已成为智能产业和软件行业的…

【uniapp】Google Maps

话不多说 直接上干货 提前申请谷歌地图账号一、新建地图 使用h5获取当前定位或者使用三方uniapp插件 var coords ""navigator.geolocation.getCurrentPosition(function(position) {coords {lat: position.coords.latitude,lng: position.coords.longitude};lats …

windows安装wsl2以及ubuntu

查看自己系统的版本 必须运行 Windows 10 版本 2004 及更高版本&#xff08;内部版本 19041 及更高版本&#xff09;或 Windows 11 才能使用以下命令 在设置&#xff0c;系统里面就能看到 开启windows功能 直接winQ搜 开启hyber-V、使用于Linux的Windows子系统、虚拟机平…

让资产权利归于建设者:Kiosk使过程变得更简单

区块链凭借着其将人的权利地位置于平台之上的能力&#xff0c;可以重塑互联网&#xff0c;而自托管为个人提供了控制和管理其资产和数据的能力。链上交易支持建设者和客户之间的点对点交易。这些特质联合起来&#xff0c;可以将数字世界从基于价值提取的模式转变为基于价值创造…