精华内容
下载资源
问答
  • 得出结论是,基于有关时空浮游植物分布生物发光“原位”测量的空间数据,有可能创建区域性算法,以从浮游植物数值估计(叶绿素“ a”)过渡到一天时间生物发光潜力夜间逆任务解决方案。
  • 基于区域物流网络结构演化相关理论,针对绍兴地区区域物流网络结构演化,运用了赫佛因德指数(HI)模型和区域分布非均衡系数(α)模型进行深入分析论证。因研究需要,结合绍兴地区城市的空间地理分布,文章把绍兴地区...
  • 本文应用点轴理论和空间结构理论,对区域经济和社会进行了分析和对比,分析了武广高铁沿线区域及其运营近五年来的区域旅游经济动态变化,揭示了高速交通对区域经济影响。提出将武广高铁沿线旅游经济区分为核心...
  • 尤其是,它产生了通过扩展希尔伯特空间方法获得的“磁性中心选择”的非阿贝尔模拟,但已应用于最近引入的3D晶格规理论的融合基础。 我们指出,纠缠熵的不同定义可能与(压缩)真空状态的选择有关。
  • 凡是与空间数据的结构随机性, 或空间相关性依赖性,或空间格局与变异有关研究,并对这些数据进 行最优无偏内插估计, 或模拟这些数据离散性、波动 性时,皆可应用地统计学的理论与方法 生态学研究中生物或...
  • 分子对接计算是在受体活性位点区域通过空间结构互补能量最小化原则来搜寻配体与受体是否能产生相互作用以及它们之间最佳结合模式。分子对接思想起源于Fisher E”钥匙锁模型”,主要强调是空间形状匹配...

    分子对接(Molecular Docking)理论

    所谓分子对接就是两个或多个分子之间通过几何匹配和能量匹配相互识别找到最佳匹配模式的过程。分子对接对酶学研究和药物设计中有重要的应用意义。

    分子对接计算是在受体活性位点区域通过空间结构互补和能量最小化原则来搜寻配体与受体是否能产生相互作用以及它们之间的最佳结合模式。分子对接的思想起源于Fisher E的”钥匙和锁模型”,主要强调的是空间形状的匹配。但配体和受体的识别要比这个模型更加复杂。首先,配体和受体在对接过程中会由于相互适应而产生构象的变化。其次,分子对接还要求能量匹配,对接过程中结合自由能的变化决定了两个分子是否能够结合以及结合的强度。

    1958年D.E.Koshland提出分子识别过程中的诱导契合概念,受体分子活性中心的结构原本并非与底物完全吻合,但其是柔软和可塑的。当配体与受体相遇时,可诱导受体构象发生相应的变化,从而便于他们的结合进而引起相应的反应。

    分子对接方法根据不同的简化程度分为三类:刚性对接、半柔性对接和柔性对接。刚性对接指在对接过程中,受体和配体的构象不发生变化,适合研究比较大的体系如蛋白-蛋白之间以及蛋白-核酸之间,计算简单,主要考虑对象之间的契合程度。半柔性对接常用于小分子和大分子的对接,在对接过程中,小分子的构象可以在一定范围内变化,但大分子是刚性的。这样既可以在一定程度上考察柔性的影响,又能保持较高的计算效率。在药物设计和虚拟筛选过程中一般采用半柔性的分子对接方法。柔性对接方法一般用于精确研究分子之间的识别情况,由于允许对接体系的构象变化,可以提高对接准确性但耗时较长。

    分子对接的目的是找到底物分子和受体分子最佳结合位置及其结合强度,最终可以获得配体和受体的结合构象,但这样的构象可以有很多,一般认为自由能最小的构象存在的概率最高。搜寻最佳构象就要用到构象搜索方法,常用的有系统搜索法和非系统搜索法。系统搜索法通过改变每个扭转角评估所有可能的结合构象,进而选取能量最低的。这一方法计算量非常大。因此通常使用非系统搜索法来寻找能量较低构象,常用方法有:分子动力学方法、随机搜索、遗传算法、距离几何算法等。随机搜索又包括完全随机算法、蒙特卡罗法和模拟退火法等。

    AutoDock Vina是The Scripp Research Institute的Olson科研小组开发的分子对接软件包,使用拉马克遗传算法提高效率。软件把遗传算法和局部搜索结合在一起,遗传算法用于全局搜索,而局部搜索用于能量优化。为了加快计算速度,AutoDock Vina采用格点(grid)计算。首先在受体活性氨基酸附近划定一个长方体区域作为搜索空间,扫描不同类型的原子计算格点能量,在搜索空间内,调整配体的构象、位置和方向,进而评分、排序获得能量最低的构象作为输出结果。

    对范德华相互作用的计算:每个格点上保存的范德华能量的值的数目与要对接的配体上的原子类型数目相同。如果一个配体中含有C、H、O三种原子类型,那么每个葛店需要用单个探针原子与来计算其与受体之间的范德华相互作用值。当配体与受体进行分子对接时,配体中某个原子和受体之间的相互作用能通过周围8个格点上的这种原子类型为探针的格点值用内插法得到。

    静电相互作用的计算采用静电势格点。当配体与受体对接时,某个原子和受体之间的静电相互作用能通过周围格点上静电势以及原子上的部分电荷计算得到。

    蛋白和小分子可视化

    例子文件是一个分辨率为2艾的X-射线衍射晶体结构(PDB ID: 1HSG),其为HIV-1蛋白酶与药物茚地那韦(indinavir)结合在一起的构象。软件PyMOL用来观察HIV-蛋白酶、结合位点和药物分子的结构。

    显示蛋白结构并做样式处理

    1. 下载HIV-1蛋白酶的PDB结构(https://files.rcsb.org/download/1HSG.pdb),存储到一个不含中文和空格的目录下。

    2. 启动PyMOL,依次点选File-Open-1hsg.pdb导入PDB文件,会看到如下界面

      image

    3. 首先在右侧的对象控制面板,依次点选行allH列-Hide: everything(如左图所示),然后浩瀚无际的没有月亮的夜空出现在我们面前。

    4. 在右侧的对象控制面板,依次点选行1hsgS列-Show: cartoon,然后点选C列-By chain显色,这时可以看到如右图所示的同源二聚体。

      image

    image.png

    左图展示对象控制面板,右图展示蛋白同源二聚体

    显示与蛋白结合的小分子化合物和水分子

    1. 从蛋白结构的PDB文件(PDB文件格式解析见后面)或PDB官网的信息(如下图所示)可以看到,1hsg结构中包含配体药物indinavir,其残基的名字为MK1

    image.png

    1. 在PyMOL的命令行处输入PyMOL> select indinavir, resn MK1,回车,会看到 如下画面变化。

      image

    image.png

    左图展示输入的命令和输入命令前的结构图,右图展示输入命令后的结构图,药物分子的结构呈被选定状态(红色空心块)。

    1. 在右侧的对象控制面板,依次点选行indinavirS列-Show stick,再点选C列选择一种不同的颜色。在屏幕无图处点击鼠标,取消小分子药物的选择状态。这时可以清晰的看到小分子的结构和空间位置(如下左图),随意拖动鼠标旋转或放大查看药物分子与蛋白的结合方式。PyMOL鼠标操作:按住左键移动旋转,按住右键移动放大,按住中键移动,观察结合位点所在的位置;滚动滚轮调节景深,化学结构会以 溶解形式出现。

    2. 显示水分子。水分子的残基名字为HOH,运行命令PyMOL> select H2O, resn HOH调出水分子。然后点选S-Show spheresC-red。再运行PyMOL> set sphere_scale, 0.2设置水球的大小。

      image

    image

    左图小分子的结构图及其与蛋白的结合位点,右图展示蛋白、小分子、水分子(红色圆球)的空间构象。

    1. 如果要存储结果,则在命令行输入png E:/docking/1shg.png保存当前结果。

    准备docking需要的受体(蛋白)和配体(化合物)

    Docking算法需要每个原子带有电荷并且需要标记原子的属性。这些信息通常未包含在PDB文件中。我们需要在对蛋白和小分子的PDB文件预处理,生成PDBQT文件同时包含以上信息和PDB文件中的原子坐标信息。进一步地对于“柔性配体docking”,我们还需要定义配体的柔性部分和刚性部分。所有这些都可以通过软件AutoDock Tools (adt)来完成。

    Docking algorithms require each atom to have a charge and an atom type that describes its properties. However, the PDB structure lacks these. So, we have to prep the protein and ligand files to include these values along with the atomic coordinates. Furthermore, for flexible ligand docking, we should also define ligand bonds that are rotatable. All this will be done in a tool called AutoDock Tools (adt).

    准备受体蛋白

    1. PDB文件(1hsg.pdb)中包含了蛋白、配体和水分子;首先提取出蛋白的坐标,即以关键字ATOMTER开头的行 (具体解释和例子见后面PDB格式解析)存储到文件1hsg_prot.pdb
    • 在windows下,我们可以手动选择,或者利用Excel的筛选功能。

    • 在Linux下,使用命令egrep "^(ATOM|TER)" 1hsg.pdb >1hsg_prot.pdb

    1. 启动AutoDockTools
    • windows直接双击图标就可

    • Linux可以使用命令adt &

    1. 依次点选File-Read Molecule-1hsg_prot.pdb加载蛋白分子。
    • ADT中按住左键拖动旋转分子结构;点击中键滚动缩放;按住右键移动晶体位置。
    1. 更改展示方式:依次点选Color-By Atom Type-All Geometries-OK

    2. 加氢:晶体结构中通常缺少氢原子的坐标 (因为氢原子电子少,且质子核对电子吸引能力弱,因此很难定位,具体见http://www.uh.edu/~chembi/ChemSocRev_Jones_critical.pdf)。但是在docking过程中,氢原子尤其是极性氢原子对计算静电作用是必须的。因此我们需要给蛋白加上氢原子,依次点选Edit-Hydrogen-Add-Polar only-OK(之所以选择Polar only是因为vina的官方视频里面是这么选择的,后面我们会做一个测试,最终会证明这个地方是不是选极性氢对最终结果没有影响)。这时氢原子会以白色短线形式出现。

      image

    image.png

    增加氢原子前(左)和后(右)蛋白结构显示

    1. 存储对蛋白的每个原子所做的修改和原子类型判断:依次点选Grid-Macromolecule-Choose-1HSG_protein-Slect Molecule。ADT会弹出一个信息框包含程序所做的处理,比如合并非极性氢原子,计算原子局部电荷和判断原子类型,并提示保存Save-1hsg_prot.pdbqt。打开文件,查看最后两列,分别为每个原子的电量和类型 (详见后面PDBQT文件格式解析)。
    • 1hsg_prot.pdbqt为只加了极性氢的结果

    • 1hsg_prot_all_h.pdbqt为加了所有氢的结果

      这两个文件只在原子电量部分有所不同,经测试发现这两种处理对docking的结果没有影响,最后输出的日志文件和结果文件相同。

    1. 在受体蛋白定义配体结合的3D搜索空间: 如果我们事先不知道结合位点,理论上可以定义一个长方体盒子包含整个蛋白或者随便一个特定区域 (下文PDB文件解析中会提到PDB文件中有时会包含活性位点信息)。

      依次点选Grid-Grid box将会在蛋白上画出一个长方体,并且有一个弹出框。在弹出框中,拖拽刻度线查看长方体的变化,完成设置。在这个例子中,我们知道结合位点,就选取以其为中心的一个小空间。设置Spacing (angstrom)1埃 (这实际是一个换算系数, 相当于步长; 默认为0.375,是C-C单键长度的1/4,最大为1。spacing值与(各个维度上的点的数目+1)的乘机就是长方体Grid box的大小)。在我们调整的过程中,可以看到随着这个数值的变大,立方体也被放大了。另外我们设置x,y,z center16,25,4,number of points in (x,y,z)-dimension30,30,30(最大为126,必须为偶数,AutoDock会自动再每一维再加一个点)。记下我们设置的这些点,下面会用到。

      在刻度转盘处点击右键会弹出一个窗口,输入数字回车即可设置GRID的中心坐标和大小。较大的number of points in (xyz)-dimension和较小的Spacing会增加搜索的精度,同时需要花费更多的计算时间。

    2. 设置受体的柔性残基:在ADT中依次点选Flexible Residues-Input-Choose Macromolecule-1hsg_protselect-select from string-Residue: ARG8-Add-Dismiss, 8号ARG氨基酸残基就被选中了。

      再依次点选Flexible Residues-Choose Torsions in Currently Selected Residues将选择的残基标记为柔性残基并设置可扭转的数量。在分子显示窗口中分别点击两个残基上CA和CB原子之间的建,使之变为非扭转的(紫色显示),这样两个残基中的32个键中有6个是可扭转的。这里设置配体的柔性残基或者使CA-CB的键为刚性都是可选操作。放在教程中只是用来展示怎么操作的,无其它指导意义。

      Flexible Residues-Output-Save Flexible PDBQT保存柔性残基文件。Flexible Residues-Output-Save Rigid PDBQT保存柔性残基文件。

    3. 关掉grid和删除proteinGrid Options-File-Close w/out savingEdit-Delete-Delete Molecule-1hsg_prot-Continue

    准备配体

    1. 与蛋白结构类似,配体的结构也缺少氢原子,我们需要添加氢原子并且定义哪些键是可以旋转的以用于柔性docking。

    2. 从PDB结构中提取配体的原子位置。indinavir的配体残基名字为MK1,以HETATM开头的行表示非核心多聚体的成分 (heteroatoms)(具体见PDB文件格式解释)。

    • Linux系统下,运行grep "^HETATM.*MK1" 1hsg.pdb >indinavir.pdb

    • Windows系统下,直接拷贝到文件indinavir.pdb

    1. 将结构读入ADT;依次点选File-Read Molecule-indinavir.pdb;Color-By Atom Type-All Geometreies-OK

    2. 晶体结构中通常缺少氢原子 (因为氢原子电子少,且质子核对电子吸引能力弱,因此很难定位,具体见http://www.uh.edu/~chembi/ChemSocRev_Jones_critical.pdf)。但是在docking过程中,氢原子,尤其是极性氢原子对计算静电作用是必须的。因此我们需要给配体加上氢原子,Edit-Hydrogen-Add-Polar only-OK(之所以选择Polar only是因为vina的官方视频里面是这么选择的)。这时氢原子会以白色短线形式出现。

    image

    image.png

    增加氢原子前(左)和后(右)化合物结构显示

    1. 在ADT中定义此化合物为配体,以便ADT为其计算局部电荷(partial charges)和设置可旋转配体键。依次点选Ligand-input-Choose-indinavir-Select Molecule for AutoDock4。这时会有一个弹出框显示ADT所做的操作,包括合并非极性氢(只在添加了的情况下)、计算电荷电量和设置旋转键。然后点选Ligand-Output-Save as PDBQT存储结果。
    • indinavir.pdbqt为只加了极性氢的结果

    • indinavir_all_h.pdbqt为加了所以氢的结果

    1. 查看ADT检测出的旋转键,依次点选Ligand-Torsion Tree-Choose Torsions,可以看到Number of rotatable bonds=14/32

    准备docking配置文件

    docking配置文件包含了输入的受体(蛋白)、配体(化合物)和搜索参数的信息,为一个文本文件,名字任意,可以为conf.txt,内容如下

    receptor = 1hsg_prot.pdbqt
    ligand   = indinavir.pdbqt
    num_modes = 50
    out = dockingResult.pdbqt
    log = docking.log
    center_x = 16
    center_y = 25
    center_z = 4
    size_x = 30
    size_y = 30
    size_z = 30
    seed = 2009
    
    • receptor和ligand为输入文件的名字,与conf.txt在同一目录下; out为输出文件的名字;log为输出日志文件的名字。

    • centerhe和size定义搜索空间的位置和大小。

    • num_modes设置最多显示的结合模型,鉴于只输出符合能量值要求的结果,最后输出的结合模型数量可能少于这一数值。

    • seed设置随机数生成的种子,可以为任意整数。如果想重现之前的分析结果就需要使用相同的seed。

    Docking 小分子化合物indinavir到HIV-1蛋白酶

    1. 使用AutoDock Vina执行docking预测。
    • 在windows命令行提示符或linux终端下运行命令 vina --config conf.txt,大概需要几分钟时间。
    1. 输出结果包含两个文件,构象文件dockingResult.pdbqt和日志文件docking.log
    Detected 4 CPUs
    Reading input ... done.
    Setting up the scoring function ... done.
    Analyzing the binding site ... done.
    Using random seed: 2009
    Performing search ... done.
    Refining results ... done.
    
    mode |   affinity | dist from best mode
       | (kcal/mol) | rmsd l.b.| rmsd u.b.
    -----+------------+----------+----------
     1        -11.5      0.000      0.000
     2        -10.6      1.425      4.304
     3        -10.4      2.042     10.990
     4        -10.3      2.034     10.326
     5        -10.2      2.517      4.774
     6        -10.1      1.933     10.911
     7         -9.9      2.176     10.884
     8         -9.8      1.794      3.600
     9         -9.6      1.981     10.865
    10         -9.5      2.431     10.943
    11         -9.3      2.417     10.370
    12         -8.9      2.404     10.285
    13         -8.8      4.058     10.904
    14         -8.7      5.574     11.291
    15         -8.7      4.441      8.312
    16         -8.6      5.659      8.929
    17         -8.6      4.404      8.275
    18         -8.5      5.630      8.900
    Writing output ... done.
    

    The key results in a docking log are the docked structures found at the end of each run,  the energies of these docked structures and their similarities to each other. The similarity of docked structures is measured by computing the root-mean-square-deviation,  rmsd, between the coordinates of the atoms. The docking results consist of the PDBQ of the Cartesian coordinates of the atoms in the docked molecule,  along with the state variables that describe this docked conformation and position.

    • dockingResult.pdbqt: 包含所有docking的模式,通常第一个为结合最好的构象,但如果前几个能量值相差不大时也有例外。

    • docking.log: 日志文件,包含结合能量值(第一列,越低越稳定,默认由低到高排序,所以第一个为最好的构象)、每个构象与第一个构象的距离、每个构象与第一个构象的差别。

    PyMOL可视化docking结果。

    打开PyMOL,依次点选File-Open文件类型选择All Files-选取结果dockingResult.pdbqt文件原始蛋白和配体的pdb文件原教程的pdbqt文件

    • dockingResult.pdbqt: 增加非极性氢的docking结果

    • dockingResultAllH.pdbqt: 增加所有氢的docking结果

    • original_tutorial_result.pdbqt:原教程中的docking结果

    image

    image

    image

    Docking结果展示。左图为蛋白与全部小分子的构象展示;中图为本教程预测的小分子构象(蓝色)与标准构象(白色)的吻合程度,红色框起来的区域为预测不准确区域。右图为本教程预测的小分子构象(蓝色)与原教程预测的小分子构象(粉色)的比较。白色化合物为原PDB晶体结构中配体的构象,视为金标准。蓝色为本教程的只加极性氢的预测结果。粉红色为原教程结果。黄色为本教程加所有氢的结果 (与蓝色构象完全一致,因此显示不出。可在实际操作时尝试隐藏和显示不同的分子观看效果)。

    展开全文
  • 《计算几何:算法与应用(第3...计算几何是计算机理论科学的一个重要分支,自20世纪70年代末从算法设计与分析中独立出来起,已经有了巨大的发展,不仅产生了一系列重要的理论成果,也在众多实际领域中得到了广泛的应用
  • 会计理论考试题

    2012-03-07 21:04:40
    A、文件占用的空间变大 B、发生异常蜂鸣声 C、屏幕显示异常图形 D、机内电扇不转 2. Windows98支持下面___C__网络协议。 A、Net BEUI B、IPX/SPX C、TCP/IP D、Banyan VINES 3.为了方便人们记忆;阅读编程,...
  • 每个通道均包含柱面望远、准直镜头、一体化空间干涉组件成像镜头,可以同时探测不同高度层OH自由基辐亮度,具有光通量大、结构稳定、小型化等特点。以紫外波段(308.2~309.8 nm)光谱分辨率优于0.01 nm要求...
  • 第11章至第16章结合实际问题,继续讨论了若干几何算法及其数据结构,包括高维凸包、空间二分及BSP树、运动规划、网格生成及四叉树、最短路径查找及可见性图、单纯性区域查找及划分树切分树等,这些也是对前十章...
  • 地统计学,是指以具有空间分布特点的区域化变量理论为基础,研究自然现象空间变异与空间结构的一门学科。它是针对像矿产、资源、生物群落、地貌、地球物理、地质、生态、土壤、气象、农业等有着特定地域分布特征...

    地统计学,是指以具有空间分布特点的区域化变量理论为基础,研究自然现象的空间变异与空间结构的一门学科。它是针对像矿产、资源、生物群落、地貌、地球物理、地质、生态、土壤、气象、农业等有着特定的地域分布特征而发展的统计学。由于最先在地学领域应用,故称地统计学。地统计学的主要理论是统计学家马特龙创立的,经过不断完善和改进,目前已成为具有坚实理论基础和实用价值的数学工具。

    地统计学的应用范围十分广泛,不仅可以研究空间分布数据的结构性和随机性、空间相关性和依赖性、空间格局与变异,还可以对空间数据进行最优无偏内插,以及模拟空间数据的离散性及波动性。地统计学由分析空间变异与结构的变异函数及其参数和空间局部估计的Kriging(克里格)插值法两个主要部分组成,例如气象领域的应用,主要使用Kriging法进行降水、温度等要素的最优内插的研究及气候对农业影响方面的研究。

    总之:地统计最主要是通过插值分析实现的。地统计是ArcGIS一个扩展模块,一定要把扩展模块选中,才能操作。

    一、地统计

      使用地统计找异常值,测试数据:chp15\插值分析\kk.gdb\pnt,分析Z字段

    1.打开地统计工具条,地统计分析下拉菜单->地统计向导

    873a105b8387df8969c5fbc508ec6364.png

     地统计向导菜单位置

     2.确定后,选地统计方法->克里金法/协调克里金法,右边源数据集选pnt,数据字段Z,见下图:

    49b15c2029ab9fb4ebdd1c2eb7544a8e.png

     克里金法/协调克里金法

       3.下一步,单击普通克里金法;左边表面输出类型选“预测”。该向导的每一步中,可通过拖动内部面板(窗口)之间的分界线来调整它们的大小。

    f1b5f6ec06c5ff59588b50bdd9328620.png

     普通克里金法

    4.  下一步,将显示半变异函数/协方差模型,这样便可检查测量点之间的空间关系。您可假设距离较近的事物比距离较远的事物更相似。通过半变异函数可探索该假设。通过拟合半变异函数模型来获得数据中空间关系的过程被称为变异分析。

    0f1f4b9a58973f432b612800df6b7061.png

    地统计向导半变异函数

    5.  单击下一步。十字光标显示没有测量值的位置。要预测出十字光标处的值,可利用已测量位置的值。通过使用周围的点以及之前拟合出的半变异函数/协方差模型,可预测出未测量位置的值。

    e3edbcbdf60c54c92519e6776350430b.png

     搜索领域

    6.  单击下一步。交叉验证图让您了解模型对未知位置的值所做预测的准确程度,已测量值是原来的Z,已预测值是通过周围的点,预测的值,错误是两者的差值。

    0d3844ff0df13d3b6d7bd6b03452da2e.png

     交叉验证

    7.  在右下角导出结果表,错误的绝对值大于10是可能有问题的(我们实际工作可能需要多次过滤,具体值也可以根据项目情况设置),使用“帅选(Select)”工具查询小于10的记录,条件是abs(Error)<10,取绝对值使用abs()函数。

    b09d46ac47ab2fcf8754f665674e8820.png

    查询Error绝对值小于10的数据

    注意:该结果是下面插值分析的原始数据。

    二、插值分析

    插值可以根据有限的样本数据点预测栅格中的像元值。它可以预测任何地理点数据(如高程、降雨、化学物质浓度和噪声等级等)的未知值。

    下面列出了可用的插值方法。

    1.  反距离权重法(Idw)工具:所使用的插值方法可通过对各个待处理像元邻域中的样本数据点取平均值来估计像元值。点到要估计的像元的中心越近,则其在平均过程中的影响或权重越大。

    2.  克里金法(Kriging)工具:是通过一组具有Z值的分散点生成估计表面的高级地统计过程。与其他插值方法不同,选择用于生成输出表面的最佳估算方法之前应对由Z值表示的现象的空间行为进行全面研究。

    3.  自然邻域法(NaturalNeighbor)工具:可找到距查询点最近的输入样本子集,并基于区域大小按比例对这些样本应用权重来进行插值。

    4.  样条函数法(Spline)工具:所使用的插值方法使用可最小化整体表面曲率的数学函数来估计值,以生成恰好经过输入点的平滑表面。

    5.  含障碍的样条函数(SplineWithBarriers)工具:使用的方法类似于样条函数法工具中使用的技术,其主要差异是此工具兼顾在输入障碍和输入点数据中编码的不连续性。

    6.  地形转栅格(TopoToRaster)工具:依据文件实现地形转栅格工具所使用插值技术是旨在用于创建可更准确地表示自然水系表面的表面,而且通过这种技术创建的表面可更好的保留输入等值线数据中的山脊线和河流网络。使用的算法基于澳大利亚国立大学的 Hutchinson 等研究人员开发的 ANUDEM。

    7.  趋势面法(Trend)工具:是一种可将由数学函数(多项式)定义的平滑表面与输入样本点进行拟合的全局多项式插值法。趋势表面会逐渐变化,并捕捉数据中的粗尺度模式。

    插值方法有很多,我们不一一举例,不同的插值方法,使用的数据不一样,效果也不一样。使用上面结果数据,我们保存在:chp15\插值分析\kk.gdb\CrossValidationResult_Select,可以直接使用。注意一定先把异常值去掉,通过下面两个方法测试地形转栅格和克里金两种插值,比较优劣。

    1.  生成等值线,人工观察等值线,比较优劣。

    2.  数据取一半插值,另一半验证。

    先生成点的范围,使用“最小边界几何(MinimumBoundingGeometry)”工具

    b002c79597cccf9c3408eca545f607b4.png

     获得点的最小外接多边形

    2.1生成等值线比较插值方法

    1.使用地形转栅格,操作界面如下,类型选PointElevation,因为原始数据为点,一个Boundary,设置输出栅格范围,像元大小我们输入3,可以给更小的值。

    6751b95cdb996c9e2a1fa072dab85d2f.png

    地形转栅格生成DEM设置

    生成等值线,等值线间距为10米

    ad2e1cee55489300c7a1f575bff51252.png

    DEM生成等值线

    2.使用克里金法插值。像元大小也设置成3,界面如下:

    3170f99496a428294068385eae6551ee.png

    克里金插值

    点击环境按钮,设置环境,不设置生成的栅格DEM是点外接矩形,这里需要多边形。界面上面处理范围,选FW,给定是最大矩形范围,如下图:

    0cc01f7e4d09128e2b40df8f92889c6c.png

    环境变量设置处理范围

    环境设置,界面下面:栅格分析->淹膜中选fw

    8c2bb3f9d26ca8886fa14cd58384656c.png

    环境变量设置栅格淹膜

    下一步,使用“等值线(Contour)”工具,等值线间距也是10米

    看下图,粗线是地形转栅格,细线是克里金插值,看到地形转栅格效果好一些。

    1d5e46da4c0585ca24f6a521c12f0467.png

    两种插值等值线比较

    2.2 取半数据验证插值方法

    我们随机取一半数据,使用“子集要素(SubsetFeatures)”工具,使用这一半,命名为f1,验证另一半,得到另一半使用“擦除(Erase)”工具,原始总数据被前一半擦除,剩下就是另一半, 命名为f2,看那个插值方法误差小。

    415ec0932f75c8b25e0e7f73dff728ca.png

     子集要素获得50%

    503f9b237326f86e36e5f01a634165bc.png

    擦除获得另外50%

    使用f1,做地形转栅格,获得栅格TopoToR_f11数据,操作界面类似图15-26,如下,f1类型一个选PointElevation,因为原始为点,fw选Boundary,设置输出栅格范围,像元大小我们输入3,使用“值提取至点(ExtractValuesToPoints)”工具,同过TopoToR_f11获得f2的高程,增加字段d1,计算和原始高程差。

    b0276c3030280a77f04833d193f173dd.png

     通过DEM获得点高程值

    使用f1,做克里金法插值,设置环境,获得栅格Kriging_f11数据,操作方法和上面基本一致,像元大小我们输入3,使用“值提取至点(ExtractValuesToPoints)”工具,同过Kriging_f11获得f2的高程,增加字段d2,计算和原始高程差。d1,d2统计结果如下,d2的标准差大一些,其他两种差不多。

    39c2d8e57ac1fbc98c23106260c1ae99.png

     两个插值比较

    展开全文
  • 我这人不善于背理论的教条,喜欢把书本上那些生硬的话跟现实生活中常见 的事物联系起来理解记忆。 直白点儿说:值类型就是现金,要用直接用;引用类型是存折,要用还得先去银行取现。 声明一个值类型变量,编译器...
  • 线性化处理曲线中非线性响应区域以解决传统多次曝光动态范围变换存在非线性失真假象问题, 然后应用图像融合技术对多次曝光获取原始图像数据进行融合, 运用反投影算法重构样品三维成像, 从而获得具有复杂空间...
  • 克里金插值也称作空间局部插值法,或空间自协方差最佳插值法,它以变异函数理论和结构分析为基础, 在特定区域内对区域化变量进行无偏最优估计,被广泛应用于土壤制图领域,是一种非常重要地统计学方法。...

    克里金插值也称作空间局部插值法,或空间自协方差最佳插值法,它以变异函数理论和结构分析为基础, 在特定区域内对区域化变量进行无偏最优估计,被广泛应用于土壤制图领域,是一种非常重要的地统计学方法。


    克里金算法已有开源的实现。克里金算法中有三个重要函数:


    (1)kriging.train(t,x,y,model,sigma2,alpha)。使用gaussian、exponential或spherical模型对数据集进行训练,返回的是一个variogram对象。


    (2)kriging.grid(polygons,variogram,width)。使用刚才的variogram对象使polygons描述的地理位置内的格网元素具备不一样的预测值。


    (3)kriging.plot(canvas,grid,xlim,ylim,colors)。将得到的格网grid渲染至canvas上。


    本文介绍openlayer结合kriging和turf实现空间的克里金插值。使用turf来处理网格数据,生成等值面,提升交互性能,效果会更好。


    (1)定义插值参数、矢量数据源和矢量图层,并添加到地图容器中。

    let params = {        mapCenter: [121.483101, 31.227036],        maxValue: 100,        krigingModel: 'spherical', //model还可选'gaussian','spherical',exponential        krigingSigma2: 0,        krigingAlpha: 100,        canvasAlpha: 0.75, //canvas图层透明度        colors: ['#006837',            '#1a9850',            '#66bd63',            '#a6d96a',            '#d9ef8b',            '#ffffbf',            '#fee08b',            '#fdae61',            '#f46d43',            '#d73027',            '#a50026']    };    var map = new ol.Map ({        target: 'map',        layers: [            new ol.layer.Tile({                title: '天地图矢量图层',                source: new ol.source.XYZ({                    url: 'http://t0.tianditu.com/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=你的key值',                    crossOrigin: 'anonymous',                    wrapX: false                })            }),            new ol.layer.Tile({                title: '天地图矢量注记图层',                source: new ol.source.XYZ({                    url: 'http://t0.tianditu.com/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=你的key值',                    attributions: '天地图的属性描述',                    crossOrigin: 'anonymous',                    wrapX: false                })            })        ],        view: new ol.View({            center: params.mapCenter,            projection: 'EPSG:4326',            zoom: 16        })    });    let WFSVectorSource = new ol.source.Vector();    let WFSVectorLayer = new ol.layer.Vector({        source: WFSVectorSource    });    map.addLayer(WFSVectorLayer);

    (2)添加地图框选交互操作

    //添加选择和框选控件,按住Ctr键,使用鼠标框选采样点    let select = new ol.interaction.Select();    map.addInteraction(select);    let dragBox = new ol.interaction.DragBox({        condition: ol.events.condition.platformModifierKeyOnly    });    map.addInteraction(dragBox);

    (3)创建随机的20个点,包括点的属性值

    //创建20个位置随机、属性值随机的特征点    for (let i = 0; i < 20; i++) {        let feature = new ol.Feature({            geometry: new ol.geom.Point(                [                    params.mapCenter[0] + Math.random() * 0.01 - .005,                    params.mapCenter[1] + Math.random() * 0.01 - .005                ]            ),            value: Math.round(Math.random() * params.maxValue)        });        feature.setStyle(            new ol.style.Style({                image: new ol.style.Circle({                    radius: 6,                    fill: new ol.style.Fill({                        color: '#00F'                    })                })            })        );        WFSVectorSource.addFeature(feature);    }

    (4)设置框选事件

    //设置框选事件    let selectedFeatures = select.getFeatures();    dragBox.on('boxend', () => {        let extent = dragBox.getGeometry().getExtent();        WFSVectorSource.forEachFeatureIntersectingExtent(extent, (feature) => {            selectedFeatures.push(feature);        });        drawKriging(extent);    });    dragBox.on('boxstart', () => {        selectedFeatures.clear();    });

    (5)利用网格计算点集

    //利用网格计算点集    const gridFeatureCollection = function (grid, xlim, ylim) {        var range =grid.zlim[1] - grid.zlim[0];        var i, j, x, y, z;        var n = grid.length; // 列数        var m = grid[0].length; //行数        var pointArray = [];        for (i = 0; i < n ; i++) {            for (j = 0; j < m; j++) {                x = (i) * grid.width + grid.xlim[0];                y = (j) * grid.width + grid.ylim[0];                z = (grid[i][j] - grid.zlim[0]) / range;                if (z < 0.0) {                    z = 0.0                }                if (z > 1.0) {                    z = 1.0                }                pointArray.push(turf.point([x, y], { value: z }));            }        }        return pointArray;    };

    (6)绘制kriging插值图

    //绘制kriging插值图    let vectorLayer = null;    const drawKriging = (extent) => {        let values = [], lngs = [], lats = [];        selectedFeatures.forEach(feature => {            values.push(feature.values_.value);            lngs.push(feature.values_.geometry.flatCoordinates[0]);            lats.push(feature.values_.geometry.flatCoordinates[1]);        });        if (values.length > 3) {            let variogram = kriging.train(                values,                lngs,                lats,                params.krigingModel,                params.krigingSigma2,                params.krigingAlpha            );            let polygons = [];            polygons.push([                [extent[0], extent[1]], [extent[0], extent[3]],                [extent[2], extent[3]], [extent[2], extent[1]]            ]);            let grid = kriging.grid(polygons, variogram, (extent[2] - extent[0]) / 500);            let dragboxExtent = extent;            if (vectorLayer !== null) {                map.removeLayer(vectorLayer);            }            var vectorSource = new ol.source.Vector();            vectorLayer = new ol.layer.Vector({                source: vectorSource,                opacity: 0.7,                style: function (feature) {                    var style = new ol.style.Style({                        fill: new ol.style.Fill({                            color: params.colors[parseFloat(feature.get('value').split('-')[1]) * 10]                        })                    })                    return style;                }            })            //使用turf渲染等值面/线            let fc = gridFeatureCollection(grid, [extent[0], extent[2]], [extent[1], extent[3]]);            var collection = turf.featureCollection(fc);            var breaks = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0];            var isobands = turf.isobands(collection, breaks, { zProperty: 'value' });            function sortArea(a,b) {                return turf.area(b)-turf.area(a);            }            //按照面积对图层进行排序,规避turf的一个bug            isobands.features.sort(sortArea)            var polyFeatures = new ol.format.GeoJSON().readFeatures(isobands, {                featureProjection: 'EPSG:4326'            })            vectorSource.addFeatures(polyFeatures);            map.addLayer(vectorLayer);        } else {            alert('有效样点个数不足,无法插值');        }    }    let extent = [params.mapCenter[0] - .005, params.mapCenter[1] - .005, params.mapCenter[0] + .005, params.mapCenter[1] + .005];    WFSVectorSource.forEachFeatureIntersectingExtent(extent, (feature) => {        selectedFeatures.push(feature);    });    drawKriging(extent);

    最终的效果如图所示:

    0be3b4866d64b93aff7cf4e6ea3c66d4.png

    展开全文
  • 针对这一状况,本文从理论与应用两方面对各类LSP传感器进行回顾梳理,一方面利用基于准静态近似下的本征模式理论为各类LSP相关的现象提供一个统一的解析理论框架,同时对各类相关的应用,包括拉曼散射、红外吸收、荧光...
  • 作为一个具体的应用,我们分析了真实的单重态扩展的标准模型,并通过单步一阶转换识别参数空间区域,并将我们的发现与使用完全摄动法获得的结果进行比较。 根据我们的非扰动结果,我们在对撞机引力波实验中讨论...
  • 这些算子是在“小希尔伯特空间”上定义的,该参数将系统的微小变形参数化为远离其原始状态,并且它们不依赖于理论的整个希尔伯特空间结构。 我们从这些算子的光谱中提取了一类类似熵的量,这些量具测量状态之间的...
  • 说明以灾害链为中心构建灾害链风险评估模型考虑了空间和时间上叠加,并对灾种间作用关系进行了厘清, 真实、定量、准确地刻画灾害链式演变过程所带来风险, 能为区域性灾害风险管理提供可靠的理论依据.
  •  GIS针对特定的应用任务,存储事物的空间数据属性数据,记录事物之间的关系演变过程。它可根据事物的地理坐标对其进行管理、检索、评价、分析、结果输出等处理,提供决策支持、动态模拟、统计分析、预测预报等...
  • GIS地理信息系统是以地理空间数据库为基础,在计算机软硬件支持下,运用系统工程信息科学的理论,科学管理综合分析具有空间内涵地理数据,以提供管理、决策等所需信息技术系统。简单说,地理信息系统...
  • 与物料输送中常用其他设备相比,AGV小车活动区域无需铺设轨道、支座架等固定装置,不受场地、道路和空间的限制。因此,在自动化物流系统中,最能充分地体现其自动性和柔性,实现高效、经济、灵活无人化生产,...
  • 姜爱萍编著的《混沌时间序列的小波 神经网络预测方法及其优化研究》对此进行了深入分 析研究,主要研究了小 波神经网络的构造、学习优化以及小波神经网络在 混沌时间序 列预测中的应用,构建了适应于混沌时间...
  • 贵阳区块链白皮书

    2017-02-24 11:18:36
    此白皮书是贵阳市联合国内知名区块链研究机构大数据应用企业编撰,以主权区块链为重点,在块数据“绳网结构理论”指导下,形成跨区域、跨场景、跨部门应用的区块链立体空间。分析了应用基础,涵盖了贵阳市在政用...
  • 国内外主流三维GIS软件

    热门讨论 2011-03-14 13:38:59
    我国GIS经过三十多年发展,理论和技术日趋成熟,在传统二维GIS已不能满足应用需求情况下,三维GIS应运而生,并成为GIS重要发展方向之一。上世纪八十年代末以来,空间信息三维可视化技术成为业界研究热点并以...
  •  本书从图形学最基础光栅扫描、区域填充、画直线圆弧等算法讲起,详细介绍了线裁剪和面裁剪、凸区域裁剪区域裁剪异同,景物空间消隐算法图像空间消隐算法差别, 具体讲述了二叉空间剖分(BSP)、八叉...
  • 针对开切眼附近冲击地压事故,通过理论研究现场勘查,探索了开切眼附近冲击地压发生原因,提出了基于支承压力估算合理开切眼平面位置确定方法。研究结果表明:开切眼布置在上覆岩层自重应力、采空区传递应力、构造...
  • 有限元方法数学基础.pdf

    热门讨论 2009-11-27 00:19:31
    本书适合高等院校计算数学和应用数学专业研究生及高年级本科生,也可作为有兴趣于数学理论方面工程师参考书。 目录: 引论第1章 变分原理1·1 可微二次凸泛函极小化问题1·2 不可微凸泛函极小化问题1·3...
  • 1.克里金插值克里金插值也称作空间局部插值法,或空间自协方差最佳插值法,它以变异函数理论和结构分析为基础, 在特定区域内对区域化变量进行无偏最优估计,被广泛应用于土壤制图领域,是一种非常重要...

    be0974175f1bbc1054bf51b4e0805e46.png

    0.OpenLayers

    OpenLayers是一个开源的Javascript库,用来在Web浏览器显示地图。它提供API接口创建类似于Google MapsBing Maps的基于web的地理应用。

    1.克里金插值

    克里金插值也称作空间局部插值法,或空间自协方差最佳插值法,它以变异函数理论和结构分析为基础, 在特定区域内对区域化变量进行无偏最优估计,被广泛应用于土壤制图领域,是一种非常重要的地统计学方法。
    具体算法解释见xg1990的文章《克里金(Kriging)插值的原理与公式推导》(https://zhuanlan.zhihu.com/p/25377842)

    2.算法实现

    克里金插值算法有开源的实现,项目的GitHub地址:kriging.js(https://github.com/oeo4b/kriging.js)

    这里重点介绍其中的三个函数:

    • kriging.train(t, x, y, model, sigma2, alpha):使用gaussianexponentialspherical模型对数据集进行训练,返回的是一个variogram对象;

    • kriging.grid(polygons,variogram,width);使用刚才的variogram对象使polygons描述的地理位置内的格网元素具备不一样的预测值;

    • kriging.plot(canvas,grid,xlim,ylim,colors);将得到的格网grid渲染至canvas上。

    3.使用ImageCanvas

    上面说到,使用kriging.plot可以将格网数据渲染至canvas上。但是要将canvas叠加到地图上,还是需要借助OpenLayers的ImageCanvas组件(https://openlayers.org/en/latest/apidoc/module-ol_source_ImageCanvas-ImageCanvasSource.html)。

    7e5f27c48cdbc006cf5deffdd62295e7.png效果预览

    let params={    mapCenter:[114.360456, 30.538622],    maxValue:100,    krigingModel:'exponential',//model还可选'gaussian','spherical'    krigingSigma2:0,    krigingAlpha:100,    canvasAlpha:0.9,//canvas图层透明度    colors:["#006837", "#1a9850", "#66bd63", "#a6d96a", "#d9ef8b", "#ffffbf",        "#fee08b", "#fdae61", "#f46d43", "#d73027", "#a50026"],};let baseLayer = new ol.layer.Tile({    title: "base",    source: new ol.source.OSM()});let map = new ol.Map({    target: 'map',    layers: [baseLayer],    view: new ol.View({        center: params.mapCenter,        projection: 'EPSG:4326',        zoom: 16    })});let WFSVectorSource=new ol.source.Vector();let WFSVectorLayer=new ol.layer.Vector(    {        source:WFSVectorSource,    });map.addLayer(WFSVectorLayer);//添加选择和框选控件,按住Ctrl/⌘键,使用鼠标框选采样点let select = new ol.interaction.Select();map.addInteraction(select);let dragBox = new ol.interaction.DragBox({    condition: ol.events.condition.platformModifierKeyOnly});map.addInteraction(dragBox);//创建10个位置随机、属性值随机的特征点for (let i = 0; i < 10; i++) {    let feature = new ol.Feature({        geometry: new ol.geom.Point([params.mapCenter[0]+Math.random()*0.01-.005,params.mapCenter[1]+Math.random()*0.01-.005]), value: Math.round(Math.random()*params.maxValue)    });    feature.setStyle(new ol.style.Style({        image: new ol.style.Circle({            radius: 6,            fill: new ol.style.Fill({color: "#00F"})        })    }));    WFSVectorSource.addFeature(feature);}//设置框选事件let selectedFeatures = select.getFeatures();dragBox.on('boxend', ()=>{    let extent = dragBox.getGeometry().getExtent();    WFSVectorSource.forEachFeatureIntersectingExtent(extent, (feature)=> {        selectedFeatures.push(feature);    });    drawKriging(extent);});dragBox.on('boxstart', ()=>{    selectedFeatures.clear();});//绘制kriging插值图let canvasLayer=null;const drawKriging=(extent)=>{    let values=[],lngs=[],lats=[];    selectedFeatures.forEach(feature=>{        values.push(feature.values_.value);        lngs.push(feature.values_.geometry.flatCoordinates[0]);        lats.push(feature.values_.geometry.flatCoordinates[1]);    });    if (values.length>3){        let variogram=kriging.train(values,lngs,lats,            params.krigingModel,params.krigingSigma2,params.krigingAlpha);        let polygons=[];        polygons.push([[extent[0],extent[1]],[extent[0],extent[3]],            [extent[2],extent[3]],[extent[2],extent[1]]]);        let grid=kriging.grid(polygons,variogram,(extent[2]-extent[0])/200);        let dragboxExtent=extent;        //移除已有图层        if (canvasLayer !== null){            map.removeLayer(canvasLayer);        }        //创建新图层        canvasLayer=new ol.layer.Image({            source: new ol.source.ImageCanvas({                canvasFunction:(extent, resolution, pixelRatio, size, projection) =>{                    let canvas = document.createElement('canvas');                    canvas.width = size[0];                    canvas.height = size[1];                    canvas.style.display='block';                    //设置canvas透明度                    canvas.getContext('2d').globalAlpha=params.canvasAlpha;                                              //使用分层设色渲染                    kriging.plot(canvas,grid,                        [extent[0],extent[2]],[extent[1],extent[3]],params.colors);                    return canvas;                },                projection: 'EPSG:4326'            })        })        //向map添加图层        map.addLayer(canvasLayer);    }else {        alert("有效样点个数不足,无法插值");    }}//首次加载,自动渲染一次差值图let extent = [params.mapCenter[0]-.005,params.mapCenter[1]-.005,params.mapCenter[0]+.005,params.mapCenter[1]+.005];    WFSVectorSource.forEachFeatureIntersectingExtent(extent, (feature)=> {        selectedFeatures.push(feature);    });drawKriging(extent);

    4. 使用turfjs

    使用imageCanvase方法比较简便,但是有一些性能上的问题,
        网格切分比较小的时候,总体的网格数增加,每次重新渲染都要将整个网格数组遍历一次,交互体验不是很好;
        网格是以方块的形式呈现的,视觉效果不如曲线和多边形。
         使用了turf.js来处理网格数据,生成等值面,提升了交互性能,效果也更好看一点

    f05de0e8021d4c677cda378647df1102.png

    <html> <head>    <title>title>    <link rel="stylesheet" href="./include/ol.css" type="text/css" />    <script src="./include/ol.js">script>    <script src="./include/kriging.js">script>    <script src='./include/turf.js'>script>head><style>style> <body>    <div id="map" class="map">div>    <script>        let params = {            mapCenter: [121.483101, 31.227036],            maxValue: 100,            krigingModel: 'spherical',//model还可选'gaussian','spherical',exponential            krigingSigma2: 0,            krigingAlpha: 100,            canvasAlpha: 0.75,//canvas图层透明度            colors: ["#006837", "#1a9850", "#66bd63", "#a6d96a", "#d9ef8b", "#ffffbf",                "#fee08b", "#fdae61", "#f46d43", "#d73027", "#a50026"],        };        let baseLayer = new ol.layer.Tile({            title: "base",            source: new ol.source.OSM()        });        let map = new ol.Map({            target: 'map',            layers: [baseLayer],            view: new ol.View({                center: params.mapCenter,                projection: 'EPSG:4326',                zoom: 16            })        });        let WFSVectorSource = new ol.source.Vector();        let WFSVectorLayer = new ol.layer.Vector(            {                source: WFSVectorSource,            });        map.addLayer(WFSVectorLayer);                //添加选择和框选控件,按住Ctr键,使用鼠标框选采样点        let select = new ol.interaction.Select();        map.addInteraction(select);        let dragBox = new ol.interaction.DragBox({            condition: ol.events.condition.platformModifierKeyOnly        });        map.addInteraction(dragBox);          //创建15个位置随机、属性值随机的特征点        for (let i = 0; i < 15; i++) {            let feature = new ol.Feature({                geometry: new ol.geom.Point(                    [                        params.mapCenter[0] + Math.random() * 0.01 - .005,                        params.mapCenter[1] + Math.random() * 0.01 - .005                    ]                ),                value: Math.round(Math.random() * params.maxValue)            });            feature.setStyle(new ol.style.Style({                image: new ol.style.Circle({                    radius: 6,                    fill: new ol.style.Fill({ color: "#00F" })                })            }));            WFSVectorSource.addFeature(feature);        }            //设置框选事件        let selectedFeatures = select.getFeatures();        dragBox.on('boxend', () => {            let extent = dragBox.getGeometry().getExtent();            WFSVectorSource.forEachFeatureIntersectingExtent(extent, (feature) => {                selectedFeatures.push(feature);            });            drawKriging(extent);        });        dragBox.on('boxstart', () => {            selectedFeatures.clear();        });         //利用网格计算点集        const gridFeatureCollection = function (grid, xlim, ylim) {            var range =grid.zlim[1] - grid.zlim[0];            var i, j, x, y, z;            var n = grid.length;//列数            var m = grid[0].length;//行数            var pointArray = [];            for (i = 0; i < n ; i++)                for (j = 0; j < m ; j++) {                    x = (i) * grid.width + grid.xlim[0];                    y = (j) * grid.width + grid.ylim[0];                    z = (grid[i][j] - grid.zlim[0]) / range;                    if (z < 0.0) z = 0.0;                    if (z > 1.0) z = 1.0;                    pointArray.push(turf.point([x, y], { value: z }));                }            return pointArray;        }        //绘制kriging插值图        let vectorLayer = null;        const drawKriging = (extent) => {            let values = [], lngs = [], lats = [];            selectedFeatures.forEach(feature => {                values.push(feature.values_.value);                lngs.push(feature.values_.geometry.flatCoordinates[0]);                lats.push(feature.values_.geometry.flatCoordinates[1]);            });            if (values.length > 3) {                let variogram = kriging.train(                    values,                    lngs,                    lats,                    params.krigingModel,                    params.krigingSigma2,                    params.krigingAlpha                );                let polygons = [];                polygons.push([                    [extent[0], extent[1]], [extent[0], extent[3]],                    [extent[2], extent[3]], [extent[2], extent[1]]                ]);                let grid = kriging.grid(polygons, variogram, (extent[2] - extent[0]) / 500);                let dragboxExtent = extent;                 if (vectorLayer !== null) {                    map.removeLayer(vectorLayer);                }                var vectorSource = new ol.source.Vector();                vectorLayer = new ol.layer.Vector(                    {                        source: vectorSource,                        opacity: 0.7,                        style: function (feature) {                                                        var style = new ol.style.Style({                                fill: new ol.style.Fill({                                    color: params.colors[parseFloat(feature.get('value').split('-')[1]) * 10]                                })                            })                            return style;                        }                    }                )                //使用turf渲染等值面/线                let fc = gridFeatureCollection(grid,                    [extent[0], extent[2]], [extent[1], extent[3]]);                var collection = turf.featureCollection(fc);                var breaks = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0];                var isobands = turf.isobands(collection, breaks, { zProperty: 'value' });                function sortArea(a,b){                    return turf.area(b)-turf.area(a);                }                //按照面积对图层进行排序,规避turf的一个bug                isobands.features.sort(sortArea)                var polyFeatures = new ol.format.GeoJSON().readFeatures(isobands, {                    featureProjection: 'EPSG:4326'                })                vectorSource.addFeatures(polyFeatures);                 map.addLayer(vectorLayer);            } else {                alert("有效样点个数不足,无法插值");            }        }         let extent = [params.mapCenter[0] - .005, params.mapCenter[1] - .005, params.mapCenter[0] + .005, params.mapCenter[1] + .005];        WFSVectorSource.forEachFeatureIntersectingExtent(extent, (feature) => {            selectedFeatures.push(feature);        });        drawKriging(extent);script>body> html>
     

    【OpenLayers】OpenLayers概述

    【OpenLayers】实现简单的地图显示

    【OpenLayers】地图控件之缩放控件

    【OpenLayers】归属控件与全屏控件

    【OpenLayers】地图控件之坐标拾取控件和鹰眼控件

    【OpenLayers】地图控件之旋转控件与比例尺控件

    【OpenLayers】实现图层切换控件

    【OpenLayers】多源数据加载之数据组织

    【OpenLayers】多源数据加载之瓦片地图原理一

    【OpenLayers】多源数据加载之瓦片地图原理二

    【OpenLayers】多源数据加载之用最简单的方式加载瓦片地图

    【OpenLayers】多源数据加载之使用XYZ的方式加载瓦片地图

    【OpenLayers】多源数据加载之详解OpenLayers的瓦片坐标系

    【OpenLayers】多源数据加载之离线瓦片地图

    【OpenLayers】多源数据加载之矢量地图

    【OpenLayers】多源数据加载之WMS(一)

    【OpenLayers】多源数据加载之WMS(二)

    【OpenLayers】多源数据加载之矢量切片

    【OpenLayers】多源数据加载之WMTS

    【OpenLayers】图形绘制之设置图形的样式

    【OpenLayers】图形绘制之编辑图形

    【OpenLayers】使用GeoJSON数据渲染热力图

    【OpenLayers】实现“上一视图”、“下一视图”的视图切换功能

    【OpenLayers】图文标注

    【OpenLayers】聚合标注

    【OpenLayers】图层卷帘(Layer Swipe)

    【OpenLayers】Drag-and-Drop Image Vector

    END

     

    请:右下点在看963ab490a57d9f45ecb558b753f6af89.gif,右上点【···】分享

    631615be9a25ca717fa3f50a3ef234e1.png

    关注我

    发现更多精彩

    展开全文
  • 分子对接技术

    千次阅读 2019-09-23 19:39:26
    分子对接(Molecular Docking)理论 所谓分子对接就是两个或多个分子之间通过几何匹配能量匹配相互识别找到最佳匹配...分子对接计算是在受体活性位点区域通过空间结构互补能量最小化原则来搜寻配体与受体是否能...
  • 引用类型原始类型具有不同特征用法,它们包括:大小速度问题,这种类型以哪种类型数据结构存储,当引用类型原始类型用作某个类实例数据时所指定缺省值。对象引用实例变量缺省值为 null,而原始...

空空如也

空空如也

1 2 3 4
收藏数 61
精华内容 24
关键字:

区域和空间结构理论的应用