首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java动态编译优化——URLClassLoader 内存泄漏问题解决

Java动态编译优化——URLClassLoader 内存泄漏问题解决

作者头像
执笔记忆的空白
发布于 2020-12-24 02:17:22
发布于 2020-12-24 02:17:22
2.8K00
代码可运行
举报
文章被收录于专栏:Java日常Java日常
运行总次数:0
代码可运行

一、动态编译案例

要说动态编译内存泄漏,首先我们先看一个案例(网上搜动态编译的资料是千篇一律,只管实现功能,不管内存泄漏,并且都恬不知耻的标识为原创!!)

Java URLClassLoader 动态编译案例:https://cloud.tencent.com/developer/article/1764721

这篇文章和我google搜的其他文章、资料一样,属于JDK1.6以后的版本。确实能实现动态编译并加载,但是却存在严重的URLClassLoader内存泄漏的问题,并且存在SharedNameTable 和 ZipFileIndex的内存泄漏问题。

其中SharedNameTable问题我已经解决:参考

二、URLClassLoader问题分析和解决

1、问题发现

生产环境JVM的运行情况,OLD区爆满,FULlGC不停的执行,项目大概2小时挂掉了,如下图:

在使用VisualVM和 JProfile 两者工具远程分析 测试环境和生产环境的项目后,转储堆Dump文件,并转存到本地分析。 发现动态编译这块存在URLClassLoader的内存泄漏,如下图所示:

2、问题分析

URLClassLoader占了83%的内存空间,遂研究了一下动态编译这块的代码,原案例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import javax.tools.*;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;

public class DynamicCompile {
    private URLClassLoader parentClassLoader;
    private String classpath;
    public DynamicCompile() {
        this.parentClassLoader = (URLClassLoader) this.getClass().getClassLoader();
        this.buildClassPath();// 存在动态安装的问题,需要动态编译类路径
    }

    private void buildClassPath() {
        this.classpath = null;
        StringBuilder sb = new StringBuilder();
        for (URL url : this.parentClassLoader.getURLs()) {
            String p = url.getFile();
            sb.append(p).append(File.pathSeparator); //路径分割符linux为:window系统为;
        }
        this.classpath = sb.toString();
    }
    /**
     * 编译出类
     *
     * @param fullClassName 全路径的类名
     * @param javaCode      java代码
     *
     * @return 目标类
     */
    public Class<?> compileToClass(String fullClassName, String javaCode) throws Exception {
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
        ClassFileManager fileManager = new ClassFileManager(compiler.getStandardFileManager(diagnostics, null, null));

        List<JavaFileObject> jfiles = new ArrayList<>();
        jfiles.add(new CharSequenceJavaFileObject(fullClassName, javaCode));

        List<String> options = new ArrayList<>();
        options.add("-encoding");
        options.add("UTF-8");
        options.add("-classpath");
        options.add(this.classpath);

        JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, options, null, jfiles);
        boolean success = task.call();

        if (success) {
            JavaClassObject jco = fileManager.getJavaClassObject();
            DynamicClassLoader dynamicClassLoader = new DynamicClassLoader(this.parentClassLoader);
            //加载至内存
            return dynamicClassLoader.loadClass(fullClassName, jco);
        } else {
            for (Diagnostic diagnostic : diagnostics.getDiagnostics()) {
                String error = compileError(diagnostic);
                throw new RuntimeException(error);
            }
            throw new RuntimeException("compile error");
        }
    }

    private String compileError(Diagnostic diagnostic) {
        StringBuilder res = new StringBuilder();
        res.append("LineNumber:[").append(diagnostic.getLineNumber()).append("]\n");
        res.append("ColumnNumber:[").append(diagnostic.getColumnNumber()).append("]\n");
        res.append("Message:[").append(diagnostic.getMessage(null)).append("]\n");
        return res.toString();
    }
}

URLClassLoader这里使用的是全局变量,并且是获取的当前类的ClassLoader(总的) ,在最后加载完class后,并没有关闭操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
this.parentClassLoader = (URLClassLoader) this.getClass().getClassLoader();

我想,那么用完之后我给这个parentClassLoader进行close不就解决了? 我想的太简单了。

切忌:此处的URLClassLoader不能关闭,因为用的是当前所在类的ClassLoader,如果你关闭了,那么会导致你当前程序的其他类会ClassNotFoundException

3、问题解决(三种)。

1、因为这里使用的是源代码的内存级动态编译,即:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new CharSequenceJavaFileObject(fullClassName, javaCode)

所以,可以用自定义的FileManager 去获取classLoader ,参考:https://www.cnblogs.com/whuqin/p/4981948.html

但是这里因为是用的ClassLoader而不是URLClassLoader,其实也没法进行close。具体我没去测试有没有内存泄漏。

2、也可以使用源代码的文件级动态编译,去获取文件对应的URLClassLoader。

3、既然不能关闭全局的ClassLoader,又想用URLClassLoader,看了官网URLClassLoader的API后,想到其实可以自己new 一个URLClassLoader来处理动态编译后的Class加载。 毕竟自己new出来的可以直接关闭,不会影响全局类的加载,具体如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.yunerp.web.util.run.compile;

import org.apache.log4j.Logger;
import sun.misc.ClassLoaderUtil;

import javax.tools.DiagnosticCollector;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.ToolProvider;
import java.io.File;

import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;


public class DynamicEngine {

    private final Logger log = Logger.getLogger(this.getClass().getName());


    /**
     * @MethodName	: 创建classpath
     * @Description
     */
    private String buildClassPath() {
        StringBuilder sb = new StringBuilder();
        URLClassLoader parentClassLoader = (URLClassLoader) this.getClass().getClassLoader();
        for (URL url : parentClassLoader.getURLs()) {
            String p = url.getFile();
            sb.append(p).append(File.pathSeparator);
        }
        return sb.toString();
    }

    /**
     * @param fullClassName 类名
     * @param javaCode      类代码
     * @return Object
     * @throws IllegalAccessException
     * @throws InstantiationException
     * @MethodName    : 编译java代码到Object
     * @Description
     */
    public Class javaCodeToObject(String fullClassName, final String javaCode) throws IllegalAccessException, InstantiationException {

        DynamicClassLoader dynamicClassLoader = null;
        ClassFileManager fileManager = null;
        List<JavaFileObject> jfiles = null;
        JavaClassObject jco = null;
        URLClassLoader urlClassLoader = null;
        try {
            //获取系统编译器
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            
            // 建立DiagnosticCollector对象
            DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
            //设置系统属性
            System.setProperty("useJavaUtilZip", "true");
            // 建立用于保存被编译文件名的对象
            // 每个文件被保存在一个从JavaFileObject继承的类中
            fileManager = new ClassFileManager(compiler.getStandardFileManager(diagnostics, null, null));

            jfiles = new ArrayList<>();
            jfiles.add(new CharSequenceJavaFileObject(fullClassName, javaCode));

            //使用编译选项可以改变默认编译行为。编译选项是一个元素为String类型的Iterable集合
            List<String> options = new ArrayList<>();
            options.add("-encoding");
            options.add("UTF-8");
            options.add("-classpath");
            //获取系统构建路径
            options.add(buildClassPath());
            //不使用SharedNameTable (jdk1.7自带的软引用,会影响GC的回收,jdk1.9已经解决)
            options.add("-XDuseUnsharedTable");
            //设定使用javaUtilZip,避免zipFileIndex泄漏
            options.add("-XDuseJavaUtilZip");

            JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, options, null, jfiles);

            // 编译源程序
            boolean success = task.call();

            if (success) {
                //如果编译成功,用类加载器加载该类
                jco = fileManager.getJavaClassObject();
                URL[] urls = new URL[]{new File("").toURI().toURL()};
                //获取类加载器(每一个文件一个类加载器)
                urlClassLoader = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());
                dynamicClassLoader = new DynamicClassLoader(urlClassLoader);
                Class clazz = dynamicClassLoader.loadClass(fullClassName, jco);
                return clazz;
            } else {
                log.error("编译失败: "+ fullClassName);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                //卸载ClassLoader所加载的类
                if (dynamicClassLoader != null) {
                    dynamicClassLoader.close();
                    ClassLoaderUtil.releaseLoader(dynamicClassLoader);
                }
                if (urlClassLoader != null) {
                    urlClassLoader.close();
                }
                if (fileManager != null) {
                    fileManager.flush();
                    fileManager.close();
                }
                if (jco != null) {
                    jco.close();
                }
                jfiles = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

重新发布后,测试1天的结果如下:

至此:URLClassLoader问题解决,JVM的 OLD区正常,项目能正常运行一周左右(之前是2-4小时就内存泄漏挂掉了)

补充说明:

1、我这里使用URLClassLoader是new的一个空文件流,为什么选择这么做,因客观原因,必须要用源代码的内存级动态编译,这样我无法获取到文件的具体全路径。

2、其实可以优化的更彻底,即我去除options参数里面的classpath,这样就能不用全局的ClassLoader了, 一般来说,只要配置了环境变量CLASSPATH,项目运行就能获取到,但是不知道是否是服务器环境问题,开发和测试环境Linux没法取到classpath,导致编译失败。所以这里我还是保留了buildClassPath()方法。但是总体效果还是很明显了,虽然我有点强迫症。只能等后续有时间了再去研究了。

3、另外,代码中我加上了关于useJavaUtilZip的配置,以为能解决ZipFileIndex的问题,但是实际上这个问题仍然存在,但是影响不是那么大,等待后续或者其他人来研究了。

4、代码规范我没去格式化了,其实应该进行格式化一下,该封装方法的还是封装一下的好。

5、请各位看官尊重我的劳动成果,如转载,请标明原作地址,并在评论告知我一声,谢谢~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/12/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
GHSL: 1975-2030全球建筑体积的分布情况,以每 100 米网格单元立方米为单位
GHSL: Global building volume 1975-2030 (P2023A)
此星光明
2025/01/24
2600
GHSL: 1975-2030全球建筑体积的分布情况,以每 100 米网格单元立方米为单位
GHSL: 全球1975 年到 2030 年以 5 年间隔建成面积的分布情况(100m)
该栅格数据集描述了建成面积的分布情况,以每 100 米网格单元中的平方米为单位。 该数据集测量:a) 建筑总面积;b) 分配给主要非住宅(NRES)用途网格单元的建筑面积。 数据从 1975 年到 2030 年以 5 年为间隔进行时空内插或外推。 有关全球人类住区图层主要产品的完整信息,请参阅[全球人类住区图层数据包 2023 年报告](https://ghsl.jrc.ec.europa.eu/documents/GHSL_Data_Package_2023.pdf?t=1683540422)。 全球人类住区图层(GHSL)项目得到了欧盟委员会、联合研究中心以及区域和城市政策总司的支持。
此星光明
2025/01/27
1200
GHSL: 全球1975 年到 2030 年以 5 年间隔建成面积的分布情况(100m)
GHSL:全球2018 年建成面积(总建面和非住宅)的分布数据(10m分辨率)
GHSL: Global built-up surface 10m (P2023A)
此星光明
2025/01/21
1150
GHSL:全球2018 年建成面积(总建面和非住宅)的分布数据(10m分辨率)
GHSL: 1975 年至 2020 年的全球居住人口估计值以 5 年为间隔以及2025 年和 2030 年的人口预测值数据
该栅格数据集描述了居住人口的空间分布,以单元居民的绝对数量表示。 1975 年至 2020 年的居住人口估计值以 5 年为间隔,2025 年和 2030 年的人口预测值则来自 CIESIN GPWv4.11,这些人口预测值从普查或行政单位分解到网格单元,并参考了 GHSL 全球建成区地表图层中每一纪元建成区的分布、体积和分类。
此星光明
2025/01/21
1750
GHSL: 1975 年至 2020 年的全球居住人口估计值以 5 年为间隔以及2025 年和 2030 年的人口预测值数据
GHSL:1975-2030 年全球网格人口和建成面积数据为基础(5 年为间隔)
该栅格数据集采用联合国统计委员会推荐的 "城市化程度 "第一阶段方法,以全球人类地理信息系统(GHSL)项目生成的 1975-2030 年全球网格人口和建成面积数据为基础,以 5 年为间隔,对全球多时城乡进行了分类。 城市化程度图层是通过整合从大地遥感卫星和哨兵-2 数据 GHS-BUILT-S R2023 中提取的建成面积信息,以及从 CIESIN GPW v4.11[GHS-POP R2023] 中提取的网格人口数据生成的(https://developers.google.com/earth-engine/datasets/catalog/JRC_GHSL_P2023A_GHS_POP)。 该产品是在 GHS-BUILT-S 和 GHS-POP 更新的基础上对 2023 年发布的数据进行的更新。 结算模型在详细级别(第二级 - L2)提供。 有关全球人类居住图层主要产品的完整信息,请参阅[全球人类居住图层数据包 2023 报告](https://human-settlement.emergency.copernicus.eu/documents/GHSL_Data_Package_2023.pdf?t=1727170839)。 全球人类居住图层(GHSL)项目得到了欧盟委员会、联合研究中心以及区域和城市政策总局的支持。
此星光明
2025/01/27
1460
GHSL:1975-2030 年全球网格人口和建成面积数据为基础(5 年为间隔)
Google Earth Engine ——全球人类住区层(GHSL)数据集
The GHSL relies on the design and implementation of new spatial data mining technologies allowing to automatically process and extract analytics and knowledge from large amount of heterogeneous data including: global, fine-scale satellite image data streams, census data, and crowd sources or volunteered geographic information sources.
此星光明
2024/02/02
3240
Google Earth Engine ——全球人类住区层(GHSL)数据集
Google Earth Engine(GEE)——GHSL:全球人类住区层,建成网格 1975-1990-2000-2015 (P2016) 数据集
GHSL 依赖于新的空间数据挖掘技术的设计和实施,允许从大量异构数据中自动处理和提取分析和知识,这些数据包括:全球、精细规模的卫星图像数据流、人口普查数据和人群来源或自愿地理信息来源。
此星光明
2024/02/02
1700
Google Earth Engine(GEE)——GHSL:全球人类住区层,建成网格 1975-1990-2000-2015 (P2016) 数据集
Google Earth Engine(GEE)——GHSL 全球人口网格数据集250米分辨率
GHSL 依赖于新的空间数据挖掘技术的设计和实施,允许从大量异构数据中自动处理和提取分析和知识,这些数据包括:全球、精细规模的卫星图像数据流、人口普查数据和人群来源或自愿地理信息来源。
此星光明
2024/02/02
4940
Google Earth Engine(GEE)——GHSL 全球人口网格数据集250米分辨率
Google Earth Engine ——全球人类住区层(GHSL)项目由欧盟委员会人口的分布和密度250米分辨率数据集
GHSL依赖于新的空间数据挖掘技术的设计和实施,允许自动处理并从大量的异质数据中提取分析和知识,这些数据包括:全球的、精细的卫星图像数据流、人口普查数据、以及人群来源或自愿的地理信息来源。
此星光明
2024/02/02
2830
Google Earth Engine ——全球人类住区层(GHSL)项目由欧盟委员会人口的分布和密度250米分辨率数据集
Google Earth Engine ——GHS-MOD是GHSL采用的农村-城市住区分类MODel---城市化程度(DEGURBA)分类数据集
GHSL: Global Human Settlement Layers, Settlement Grid 1975-1990-2000-2014 (P2016)
此星光明
2024/02/02
2810
Google Earth Engine ——GHS-MOD是GHSL采用的农村-城市住区分类MODel---城市化程度(DEGURBA)分类数据集
GEE数据集—— 2020 年全球森林覆盖图10 米的空间分辨率
欧洲共同体联合研究中心的全球森林覆盖图以 10 米的空间分辨率提供了 2020 年森林存在和不存在的明确空间表示。
此星光明
2024/05/24
3040
GEE数据集—— 2020 年全球森林覆盖图10 米的空间分辨率
Google Earth Engine(GEE)——全球去除森林和建筑物的哥白尼30米DEM数据集
FABDEM(去除森林和建筑物的哥白尼30米DEM FABDEM(去除森林和建筑物的哥白尼DEM)从哥白尼GLO 30数字高程模型(DEM)中去除建筑物和树木高度的偏差(空中客车,2020年)。该数据以1角秒的网格间距(赤道上约30米)提供给全球。作者使用机器学习从哥白尼数字高程模型中去除建筑物和森林,首次产生了一个以1角秒(∼30米)网格间距去除建筑物和森林的全球高程地图。你可以在这里阅读该论文:
此星光明
2024/02/02
5060
Google Earth Engine(GEE)——全球去除森林和建筑物的哥白尼30米DEM数据集
城市研究的 GLObal 建筑高度(UT-GLOBUS):全球 1200 多个城市的建筑高度和城市冠层参数(UCPs)
德克萨斯大学--用于城市研究的 GLObal 建筑高度(UT-GLOBUS)数据集提供了全球 1200 多个城市的建筑高度和城市冠层参数(UCPs)。 该数据集将开放源空间测高(ICESat-2 和 GEDI)和粗分辨率城市冠层高程数据与机器学习模型相结合,以估算建筑物级别的信息。 数据集包括单个建筑多边形,其高度属性以米为单位,适合使用地理信息系统平台进行可视化。 UCP 以二进制文件格式提供,与天气研究和预报(WRF)预处理系统兼容。 UT-GLOBUS的主要目的是为从城市到街道尺度的建模应用提供一个数据集,特别是为WRF-Urban模型中的多层UCM推导UCP,以及为SOLWEIG模型提供建筑物高度。
此星光明
2025/02/05
2810
城市研究的 GLObal 建筑高度(UT-GLOBUS):全球 1200 多个城市的建筑高度和城市冠层参数(UCPs)
Google Earth Engine(GEE)——全球建筑物矢量图免费下载Open Buildings V1 Polygons
全球建筑物提取数据集(免费下载):微软/GlobalMLBuildingFootprints_此星光明2021年博客之星云计算Top3的博客-CSDN博客_建筑物提取数据集
此星光明
2024/02/02
3950
Google Earth Engine(GEE)——全球建筑物矢量图免费下载Open Buildings V1 Polygons
2000 年至 2022 年全球天然/半天然草地的年度概率图, 30 米的空间分辨率
该数据集以 30 米的空间分辨率提供了 2000 年至 2022 年全球天然/半天然草地的年度概率图。 由土地与碳实验室全球牧场观察计划制作,绘制的草地范围包括任何土地覆被类型,其中包含至少 30% 以禾本科和草本植物为主的干性或湿性低植被(小于 3 米),以及:最多 50% 的树冠覆盖(大于 5 米)、最多 70% 的其他木本植被(灌丛和开阔灌木地),以及在耕地和其他植被的镶嵌景观中最多 50% 的有效耕地覆盖。 草地范围分为两类:人工草地: 有意种植和管理草类和其他饲料植物的区域,以及明显表现出为人类特定用途(如放牧)而进行积极和繁重管理的原生草地植被区域。 天然/半天然草地: 相对未受干扰的原生草地/矮高植被,如草原和苔原,以及过去经历过不同程度人类活动的区域,由于历史上的土地使用和自然过程,这些区域可能混合了原生和外来物种。 一般来说,这些地区呈现出自然的植被变化模式,整个地貌中的水文关系清晰有序。 实施的方法考虑到了 GLAD Landsat ARD-2 图像),以及气候、地貌和邻近协变量、时空机器学习(每类随机森林)和超过 230 万个参考样本(在甚高分辨率图像中可视化解读)。 使用自定义概率阈值(基于五倍空间交叉验证以及平衡的精度和召回值)得出优势类图,耕地和天然/半天然草地概率阈值分别为 0.32 和 0.42。 局限性: 非洲东南部(津巴布韦和莫桑比克)和澳大利亚东部(穆尔加生态区的灌木林地和林地)的草地范围部分预测不足。 在非洲北部、阿拉伯半岛、澳大利亚西部、新西兰、玻利维亚中部和马托格罗索州(巴西)的部分地区,耕地被误划为草原。 由于大地遥感卫星 7 SLC 的故障,在地块层面可以看到草地概率的规则条纹,尤其是在 2012 年。 在乌拉圭、阿根廷西南部、安哥拉南部和非洲萨赫勒地区,较粗分辨率图层(可达性地图和 MODIS 产品)的使用引入了曲线宏观误差(由于基于立方平分的降尺度策略)。 用户需要了解这些局限性和已知问题;同时仔细考虑这些问题,以确保在初始预测阶段适当使用地图。 GPW 正在积极通过 Geo-Wiki 平台收集系统反馈,验证当前版本并改进数据集的未来版本。
此星光明
2025/02/02
840
2000 年至 2022 年全球天然/半天然草地的年度概率图, 30 米的空间分辨率
全球谷歌-微软开放式全球建筑数据集
全球谷歌-微软开放式建筑数据集 该数据集整合了谷歌 V3 开放式建筑和微软最新的建筑足迹,包含 2,534,595,270 个惊人的足迹。截至 2023 年 9 月,它已成为最全面的开放式数据集。该数据集涵盖 92% 的 0 级行政边界,分为 182 个分区。每个足迹都明确标注了其来源,指出是来自谷歌还是微软。该数据集可以 GeoParquet、FlatGeobuf 和 PMTiles 等云原生地理空间格式访问,为各种应用提供了强大的资源。更多详细信息,包括该数据集的综合信息和方法,可分别在此处和此处查看。Source Cooperative
此星光明
2024/02/02
4010
全球谷歌-微软开放式全球建筑数据集
GEE数据集:2000 年至 2022 年全球耕地草地的年概率分布图( 30 米的空间分辨率)
该数据集以 30 米的空间分辨率提供了 2000 年至 2022 年全球耕地草地的年概率图。 由土地与碳实验室全球牧场观察计划制作,绘制的草地范围包括任何土地覆被类型,其中包含至少 30% 的干性或湿性低植被,以禾本科和草本植物为主(小于 3 米),以及:最多 50% 的树冠覆盖(大于 5 米)、最多 70% 的其他木本植被(灌丛和开阔灌木地),以及在耕地和其他植被的镶嵌景观中最多 50% 的有效耕地覆盖。
此星光明
2025/02/02
1220
GEE数据集:2000 年至 2022 年全球耕地草地的年概率分布图( 30 米的空间分辨率)
AI EARTH——1972-2019全球不透水面30米分辨率产品(GISA-2.0)
dataset = aie.ImageCollection('GISA_V02_1972_2019')
此星光明
2024/03/08
3540
AI EARTH——1972-2019全球不透水面30米分辨率产品(GISA-2.0)
Google Earth Engine——全球摩擦面列举了北纬85度和南纬60度之间的所有陆地像素在2015年的名义年的陆地迁移速度。
This global friction surface enumerates land-based travel speed for all land pixels between 85 degrees north and 60 degrees south for a nominal year 2015. This map was produced through a collaboration between the University of Oxford Malaria Atlas Project (MAP), Google, the European Union Joint Research Centre (JRC), and the University of Twente, Netherlands. The underlying datasets used to produce the map include roads (comprising the first ever global-scale use of Open Street Map and Google roads datasets), railways, rivers, lakes, oceans, topographic conditions (slope and elevation), landcover types, and national borders. These datasets were each allocated a speed or speeds of travel in terms of time to cross each pixel of that type. The datasets were then combined to produce this “friction surface”, a map where every pixel is allocated a nominal overall speed of travel based on the types occurring within that pixel, with the fastest travel mode intersecting the pixel being used to determine the speed of travel in that pixel (with some exceptions such as national boundaries, which have the effect of imposing a travel time penalty). This map represents the travel speed from this allocation process, expressed in units of minutes required to travel one meter. It forms the underlying dataset behind the global accessibility map described in the referenced paper.
此星光明
2024/02/02
1790
Google Earth Engine——全球摩擦面列举了北纬85度和南纬60度之间的所有陆地像素在2015年的名义年的陆地迁移速度。
遥感数据:基于综合大比例尺测绘框架的首个高质量东亚国家建筑物矢量数据(东亚 2.8 亿栋建筑的空间分布图)
建筑作为人类生活不可分割的一部分,在城市管理和城市分析领域至关重要。为了促进大规模城市规划应用,获取完整可靠的建筑数据势在必行。目前有一些公开产品可以提供大量建筑数据,如微软和开放街道地图。但在东亚地区,由于建筑物分布较为复杂,辅助数据匮乏,这些地区的建筑数据比较缺乏,阻碍了东亚地区的大规模应用。一些研究试图利用当地不完整的建筑足迹数据,通过回归模拟大规模的建筑分布信息。然而,对不准确建筑数据的依赖会带来累积误差,使这种模拟数据极不可靠,导致在东亚地区实现精确研究受到限制。因此,我们针对东亚地区建筑物的复杂性,提出了一个全面的大规模建筑物绘图框架,并在东亚 5 个国家的 2,897 个城市进行了建筑物足迹提取,获得了 281,093,433 栋建筑物的大量数据集。评估结果表明,我们的建筑产品是有效的,总体平均准确率为 89.63%,F1 得分为 82.55%。此外,与现有产品的比较进一步显示了我们的建筑数据的高质量和完整性。最后,我们对建筑数据进行了空间分析,揭示了其在支持城市相关研究方面的价值。本文数据可从http:// https://doi.org/10.5281/zenodo.8174931下载。
此星光明
2024/06/09
6440
遥感数据:基于综合大比例尺测绘框架的首个高质量东亚国家建筑物矢量数据(东亚 2.8 亿栋建筑的空间分布图)
推荐阅读
GHSL: 1975-2030全球建筑体积的分布情况,以每 100 米网格单元立方米为单位
2600
GHSL: 全球1975 年到 2030 年以 5 年间隔建成面积的分布情况(100m)
1200
GHSL:全球2018 年建成面积(总建面和非住宅)的分布数据(10m分辨率)
1150
GHSL: 1975 年至 2020 年的全球居住人口估计值以 5 年为间隔以及2025 年和 2030 年的人口预测值数据
1750
GHSL:1975-2030 年全球网格人口和建成面积数据为基础(5 年为间隔)
1460
Google Earth Engine ——全球人类住区层(GHSL)数据集
3240
Google Earth Engine(GEE)——GHSL:全球人类住区层,建成网格 1975-1990-2000-2015 (P2016) 数据集
1700
Google Earth Engine(GEE)——GHSL 全球人口网格数据集250米分辨率
4940
Google Earth Engine ——全球人类住区层(GHSL)项目由欧盟委员会人口的分布和密度250米分辨率数据集
2830
Google Earth Engine ——GHS-MOD是GHSL采用的农村-城市住区分类MODel---城市化程度(DEGURBA)分类数据集
2810
GEE数据集—— 2020 年全球森林覆盖图10 米的空间分辨率
3040
Google Earth Engine(GEE)——全球去除森林和建筑物的哥白尼30米DEM数据集
5060
城市研究的 GLObal 建筑高度(UT-GLOBUS):全球 1200 多个城市的建筑高度和城市冠层参数(UCPs)
2810
Google Earth Engine(GEE)——全球建筑物矢量图免费下载Open Buildings V1 Polygons
3950
2000 年至 2022 年全球天然/半天然草地的年度概率图, 30 米的空间分辨率
840
全球谷歌-微软开放式全球建筑数据集
4010
GEE数据集:2000 年至 2022 年全球耕地草地的年概率分布图( 30 米的空间分辨率)
1220
AI EARTH——1972-2019全球不透水面30米分辨率产品(GISA-2.0)
3540
Google Earth Engine——全球摩擦面列举了北纬85度和南纬60度之间的所有陆地像素在2015年的名义年的陆地迁移速度。
1790
遥感数据:基于综合大比例尺测绘框架的首个高质量东亚国家建筑物矢量数据(东亚 2.8 亿栋建筑的空间分布图)
6440
相关推荐
GHSL: 1975-2030全球建筑体积的分布情况,以每 100 米网格单元立方米为单位
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验