// 保存上一次加载的 features,便于移除
let previousFeatures = [];
// 用于缓存已经加载过的 GeoJSON 数据
let geoJsonCache = {};
// 定义动态导入函数
const importJson = async (url) => {
if (geoJsonCache[url]) {
return geoJsonCache[url];
}
console.log(url);
console.log(typeof url);
const data = await import("@/static/区县边界/成县.json");
// const data1 = await import(`${url}`);
console.log(data);
// console.log(data1);
geoJsonCache[url] = data.default || data; // 有些模块工具需要 `.default`
return geoJsonCache[url];
};
// 加载 GeoJSON 或 JSON 文件的函数
const loadGeoJsonOrJsonFile = async (vectorSource, zoom) => {
// 首先移除上次加载的所有 features
previousFeatures.forEach((feature) => {
vectorSource.removeFeature(feature);
});
previousFeatures = []; // 清空上次加载的 features
let geoJsonUrls = [];
if (zoom > 1.6) {
geoJsonUrls = [
"@/static/62/621202109.json",
"@/static/62/621202110.json",
"@/static/62/621202113.json",
"@/static/62/621202116.json",
"@/static/62/621202122.json",
"@/static/62/621202123.json",
"@/static/62/621202211.json",
"@/static/62/621221100.json",
"@/static/62/621221101.json",
"@/static/62/621221102.json",
"@/static/62/621221103.json",
"@/static/62/621221104.json",
"@/static/62/621221105.json",
"@/static/62/621221106.json",
"@/static/62/621221107.json",
"@/static/62/621221108.json",
"@/static/62/621221109.json",
"@/static/62/621221110.json",
"@/static/62/621221111.json",
"@/static/62/621221112.json",
"@/static/62/621221203.json",
"@/static/62/621221206.json",
"@/static/62/621223100.json",
"@/static/62/621223101.json",
"@/static/62/621223102.json",
"@/static/62/621223103.json",
"@/static/62/621223106.json",
"@/static/62/621223107.json",
"@/static/62/621223108.json",
"@/static/62/621223206.json",
"@/static/62/621223207.json",
"@/static/62/621223209.json",
"@/static/62/621223211.json",
"@/static/62/621223212.json",
"@/static/62/621223213.json",
"@/static/62/621223214.json",
"@/static/62/621223215.json",
"@/static/62/621223216.json",
"@/static/62/621223217.json",
"@/static/62/621223218.json",
"@/static/62/621223219.json",
"@/static/62/621223224.json",
"@/static/62/621224100.json",
"@/static/62/621224102.json",
"@/static/62/621224103.json",
"@/static/62/621224105.json",
"@/static/62/621224108.json",
"@/static/62/621224110.json",
"@/static/62/621224112.json",
"@/static/62/621224113.json",
"@/static/62/621224209.json",
"@/static/62/621225100.json",
"@/static/62/621225101.json",
"@/static/62/621225102.json",
"@/static/62/621225103.json",
"@/static/62/621225104.json",
"@/static/62/621225105.json",
"@/static/62/621225106.json",
"@/static/62/621225108.json",
"@/static/62/621225109.json",
"@/static/62/621225110.json",
"@/static/62/621225111.json",
"@/static/62/621225112.json",
"@/static/62/621225113.json",
"@/static/62/621225114.json",
"@/static/62/621225206.json",
"@/static/62/621225208.json",
"@/static/62/621225210.json",
"@/static/62/621225300.json",
"@/static/62/621225301.json",
"@/static/62/621225302.json",
"@/static/62/621225304.json",
"@/static/62/621225305.json",
"@/static/62/621225306.json",
"@/static/62/621226100.json",
"@/static/62/621226101.json",
"@/static/62/621226102.json",
"@/static/62/621226103.json",
"@/static/62/621226104.json",
"@/static/62/621226105.json",
"@/static/62/621226106.json",
"@/static/62/621226107.json",
"@/static/62/621226108.json",
"@/static/62/621226109.json",
"@/static/62/621226110.json",
"@/static/62/621226111.json",
"@/static/62/621226112.json",
"@/static/62/621226113.json",
"@/static/62/621226114.json",
"@/static/62/621226115.json",
"@/static/62/621226116.json",
"@/static/62/621226117.json",
"@/static/62/621226118.json",
"@/static/62/621226119.json",
"@/static/62/621226120.json",
"@/static/62/621226121.json",
"@/static/62/621226203.json",
"@/static/62/621226215.json",
"@/static/62/621226219.json",
"@/static/62/621226224.json",
"@/static/62/621226228.json",
"@/static/62/621226231.json",
"@/static/62/621226232.json",
"@/static/62/621227100.json",
"@/static/62/621227101.json",
"@/static/62/621227102.json",
"@/static/62/621227103.json",
"@/static/62/621227104.json",
"@/static/62/621227105.json",
"@/static/62/621227106.json",
"@/static/62/621227107.json",
"@/static/62/621227108.json",
"@/static/62/621227109.json",
"@/static/62/621227110.json",
"@/static/62/621227111.json",
"@/static/62/621227112.json",
"@/static/62/621227208.json",
"@/static/62/621227211.json",
"@/static/62/621228100.json",
"@/static/62/621228101.json",
"@/static/62/621228102.json",
"@/static/62/621228103.json",
"@/static/62/621228104.json",
"@/static/62/621228105.json",
"@/static/62/621228201.json",
"@/static/62/621228203.json",
"@/static/62/621228204.json",
"@/static/62/621228207.json",
"@/static/62/621228210.json",
"@/static/62/621228212.json",
"@/static/62/623023103.json",
"@/static/62/623023106.json",
"@/static/62/623023107.json",
"@/static/62/623023108.json",
"@/static/62/623023109.json",
"@/static/62/623023110.json",
"@/static/62/623023111.json",
"@/static/62/623023112.json",
"@/static/62/623023200.json",
"@/static/62/623023213.json",
"@/static/output/output-102-8-1.geojson",
"@/static/output/output-103-8-1.geojson",
"@/static/output/output-104-8-1.geojson",
"@/static/output/output-105-8-1.geojson",
"@/static/output/output-106-8-1.geojson",
"@/static/output/output-107-8-1.geojson",
"@/static/output/output-108-8-1.geojson",
"@/static/output/output-109-8-1.geojson",
"@/static/output/output-110-8-1.geojson",
"@/static/output/output-111-8-1.geojson",
"@/static/output/output-112-8-1.geojson",
"@/static/output/output-113-8-1.geojson",
"@/static/output/output-114-8-1.geojson",
"@/static/output/output-115-8-1.geojson",
"@/static/output/output-116-8-1.geojson",
"@/static/output/output-117-8-1.geojson",
"@/static/output/output-118-8-1.geojson",
"@/static/output/output-119-8-1.geojson",
"@/static/output/output-120-8-1.geojson",
"@/static/output/output-121-8-1.geojson",
"@/static/output/output-122-8-1.geojson",
"@/static/output/output-123-8-1.geojson",
"@/static/output/output-124-8-1.geojson",
"@/static/output/output-125-8-1.geojson",
"@/static/output/output-126-8-1.geojson",
"@/static/output/output-127-8-1.geojson",
"@/static/output/output-128-8-1.geojson",
"@/static/output/output-129-8-1.geojson",
"@/static/output/output-130-8-1.geojson",
"@/static/output/output-131-8-1.geojson",
"@/static/output/output-132-8-1.geojson",
"@/static/output/output-133-8-1.geojson",
"@/static/output/output-134-8-1.geojson",
"@/static/output/output-135-8-1.geojson",
"@/static/output/output-136-8-1.geojson",
"@/static/output/output-137-8-1.geojson",
"@/static/output/output-138-8-1.geojson",
"@/static/output/output-139-8-1.geojson",
"@/static/output/output-140-8-1.geojson",
"@/static/output/output-141-8-1.geojson",
"@/static/output/output-142-8-1.geojson",
"@/static/output/output-143-8-1.geojson",
"@/static/output/output-144-8-1.geojson",
"@/static/output/output-145-8-1.geojson",
"@/static/output/output-146-8-1.geojson",
"@/static/output/output-147-8-1.geojson",
"@/static/output/output-148-8-1.geojson",
"@/static/output/output-149-8-1.geojson",
"@/static/output/output-150-8-1.geojson",
"@/static/output/output-151-8-1.geojson",
"@/static/output/output-152-8-1.geojson",
"@/static/output/output-153-8-1.geojson",
"@/static/output/output-154-8-1.geojson",
"@/static/output/output-156-8-1.geojson",
"@/static/output/output-157-8-1.geojson",
"@/static/output/output-158-8-1.geojson",
"@/static/output/output-159-8-1.geojson",
"@/static/output/output-160-8-1.geojson",
"@/static/output/output-161-8-1.geojson",
"@/static/output/output-162-8-1.geojson",
"@/static/output/output-163-8-1.geojson",
"@/static/output/output-164-8-1.geojson",
"@/static/output/output-165-8-1.geojson",
"@/static/output/output-166-8-1.geojson",
"@/static/output/output-167-8-1.geojson",
"@/static/output/output-168-8-1.geojson",
"@/static/output/output-169-8-1.geojson",
"@/static/output/output-170-8-1.geojson",
"@/static/output/output-171-8-1.geojson",
"@/static/output/output-172-8-1.geojson",
"@/static/output/output-173-8-1.geojson",
"@/static/output/output-174-8-1.geojson",
"@/static/output/output-175-8-1.geojson",
"@/static/output/output-176-8-1.geojson",
"@/static/output/output-177-8-1.geojson",
"@/static/output/output-178-8-1.geojson",
"@/static/output/output-179-8-1.geojson",
"@/static/output/output-180-8-1.geojson",
"@/static/output/output-181-8-1.geojson",
"@/static/output/output-182-8-1.geojson",
"@/static/output/output-183-8-1.geojson",
"@/static/output/output-184-8-1.geojson",
"@/static/output/output-185-8-1.geojson",
"@/static/output/output-186-8-1.geojson",
// 添加更多路径...
];
} else {
geoJsonUrls = [
"@/static/区县边界/成县.json",
"@/static/区县边界/宕昌县.json",
"@/static/区县边界/徽县.json",
"@/static/区县边界/康县.json",
"@/static/区县边界/礼县.json",
"@/static/区县边界/两当县.json",
"@/static/区县边界/文县.json",
"@/static/区县边界/武都区.json",
"@/static/区县边界/西和县.json",
"@/static/区县边界/舟曲县.json",
];
}
// 使用动态导入加载所有 JSON 文件
const geoJsonPromises = geoJsonUrls.map((url) => importJson(url));
// 等待所有 JSON 数据加载完成
const geoJsonDataArray = await Promise.all(geoJsonPromises);
// 现在 `geoJsonDataArray` 包含了所有加载的 JSON 数据
console.log(geoJsonDataArray);
// 处理加载的 GeoJSON 数据,将其转换为 OpenLayers 的 features 并添加到地图中
geoJsonDataArray.forEach((data) => {
const features = new GeoJSON().readFeatures(data, {
featureProjection: "EPSG:4326",
});
features.forEach((feature) => {
vectorSource.addFeature(feature);
hideFeature(feature); // 自定义逻辑,用于隐藏某些 feature
});
previousFeatures = previousFeatures.concat(features); // 更新 previousFeatures
});
};
网络与本地请求(打包webpack)
因为需要打包webpack的缘故,所以需要将fetch换成import遍历url传递资源路径,结果是传递的参数和实际书写的参数都是字符串,结果却出现了两个不同的情况。
这是成功的,会打印出module,里面会有我需要的feature。
这是报错的,一片红了,现在只能尝试用绝对的路径去解决问题,不能尝试遍历后使用传参的方法了。
问题:
在代码中,使用 await import()
动态导入 JSON 文件时,出现了 找不到 module
的错误,可能是因为你在路径中使用了动态的 url
,而不是静态的路径(例如 "@/static/区县边界/成县.json"
)。ES6 的 import()
需要一个静态的模块路径,这意味着你不能直接将动态的变量传递给它。
有使用fetch解决的方法,但这属于http请求,所以不能使用,使用后打包会出现问题,无法去做成exe文件。
好一点的解决方法如下:
const importJson = async (url) => {
try {
// Webpack 会根据路径将 JSON 文件自动打包并返回
const data = await import(`@/static/区县边界/${url}`);
return data.default || data; // 一些情况下可能需要 .default
} catch (error) {
console.error(error);
return null;
}
};
// 加载 GeoJSON 文件
const loadGeoJsonOrJsonFile = async (vectorSource, zoom) => {
// 清理之前加载的 features
previousFeatures.forEach((feature) => {
vectorSource.removeFeature(feature);
});
previousFeatures = [];
let geoJsonUrls = [];
if (zoom > 1.6) {
geoJsonUrls = [
"621202109.json", // 路径相对打包后的路径
"621202110.json",
// 其他 JSON 文件...
];
} else {
geoJsonUrls = [
"成县.json",
// 其他 JSON 文件...
];
}
const geoJsonPromises = geoJsonUrls.map((url) => importJson(url));
const geoJsonDataArray = await Promise.all(geoJsonPromises);
geoJsonDataArray.forEach((data) => {
if (data) {
const features = new GeoJSON().readFeatures(data, {
featureProjection: "EPSG:4326",
});
features.forEach((feature) => {
vectorSource.addFeature(feature);
hideFeature(feature); // 自定义逻辑,用于隐藏某些 feature
});
previousFeatures = previousFeatures.concat(features);
}
});
};
用webpack打包的时候,json文件的加载在webpack5之后就不需要要去改config,但是我的项目中有使用到geojson文件,所以需要去改一下webpack的配置文件。使用了三个方案只有一个有用
npm install json-loader --save-dev
先去下载一个依赖包然后再去vue.config.js里使用
const path = require("path");
module.exports = {
transpileDependencies: true, // 转译依赖项
publicPath: "./", // 设置公共路径
chainWebpack: (config) => {
// 设置 @ 别名,确保它指向 src 文件夹
config.resolve.alias.set("@", path.resolve(__dirname, "src"));
// 对 .geojson 文件的处理 (使用 Webpack 5 的 asset/resource 模块)
config.module
.rule("geojson")
.test(/\.geojson$/)
.type("javascript/auto") // 必须使用 javascript/auto 类型才能正确解析 JSON
.use("json-loader") // 使用 json-loader
.loader("json-loader")
.end();
// 对 .json 文件的处理 (同样使用 asset/resource)
// config.module
// .rule("json")
// .test(/\.json$/)
// .type("javascript/auto") // Webpack 5 需要设置为 javascript/auto
// .use("asset/resource") // 使用 asset/resource 来处理 json 文件
// .loader("asset/resource")
// .options({
// name: "static/json/[name].[hash:8].[ext]", // 配置文件输出路径和文件名
// })
// .end();
},
};
成功后的代码改成了如下的样式:
// 保存上一次加载的 features,便于移除
let previousFeatures = [];
// 用于缓存已经加载过的 GeoJSON 数据
let geoJsonCache = {};
// 定义动态导入函数
const importJson = async (url) => {
if (geoJsonCache[url]) {
return geoJsonCache[url];
}
console.log(url);
console.log(typeof url);
// const data = await import("区县边界/成县.json");
const data1 = await import(`@/static/${url}`);
// console.log(data);
console.log(data1);
geoJsonCache[url] = data1.default || data1; // 有些模块工具需要 `.default`
return geoJsonCache[url];
};
// 加载 GeoJSON 或 JSON 文件的函数
const loadGeoJsonOrJsonFile = async (vectorSource, zoom) => {
// 首先移除上次加载的所有 features
previousFeatures.forEach((feature) => {
vectorSource.removeFeature(feature);
});
previousFeatures = []; // 清空上次加载的 features
let geoJsonUrls = [];
if (zoom > 1.6) {
geoJsonUrls = [
"62/621202109.json",
"62/621202110.json",
"62/621202113.json",
"62/621202116.json",
"62/621202122.json",
"62/621202123.json",
"62/621202211.json",
"62/621221100.json",
"62/621221101.json",
"62/621221102.json",
"62/621221103.json",
"62/621221104.json",
"62/621221105.json",
"62/621221106.json",
"62/621221107.json",
"62/621221108.json",
"62/621221109.json",
"62/621221110.json",
"62/621221111.json",
"62/621221112.json",
"62/621221203.json",
"62/621221206.json",
"62/621223100.json",
"62/621223101.json",
"62/621223102.json",
"62/621223103.json",
"62/621223106.json",
"62/621223107.json",
"62/621223108.json",
"62/621223206.json",
"62/621223207.json",
"62/621223209.json",
"62/621223211.json",
"62/621223212.json",
"62/621223213.json",
"62/621223214.json",
"62/621223215.json",
"62/621223216.json",
"62/621223217.json",
"62/621223218.json",
"62/621223219.json",
"62/621223224.json",
"62/621224100.json",
"62/621224102.json",
"62/621224103.json",
"62/621224105.json",
"62/621224108.json",
"62/621224110.json",
"62/621224112.json",
"62/621224113.json",
"62/621224209.json",
"62/621225100.json",
"62/621225101.json",
"62/621225102.json",
"62/621225103.json",
"62/621225104.json",
"62/621225105.json",
"62/621225106.json",
"62/621225108.json",
"62/621225109.json",
"62/621225110.json",
"62/621225111.json",
"62/621225112.json",
"62/621225113.json",
"62/621225114.json",
"62/621225206.json",
"62/621225208.json",
"62/621225210.json",
"62/621225300.json",
"62/621225301.json",
"62/621225302.json",
"62/621225304.json",
"62/621225305.json",
"62/621225306.json",
"62/621226100.json",
"62/621226101.json",
"62/621226102.json",
"62/621226103.json",
"62/621226104.json",
"62/621226105.json",
"62/621226106.json",
"62/621226107.json",
"62/621226108.json",
"62/621226109.json",
"62/621226110.json",
"62/621226111.json",
"62/621226112.json",
"62/621226113.json",
"62/621226114.json",
"62/621226115.json",
"62/621226116.json",
"62/621226117.json",
"62/621226118.json",
"62/621226119.json",
"62/621226120.json",
"62/621226121.json",
"62/621226203.json",
"62/621226215.json",
"62/621226219.json",
"62/621226224.json",
"62/621226228.json",
"62/621226231.json",
"62/621226232.json",
"62/621227100.json",
"62/621227101.json",
"62/621227102.json",
"62/621227103.json",
"62/621227104.json",
"62/621227105.json",
"62/621227106.json",
"62/621227107.json",
"62/621227108.json",
"62/621227109.json",
"62/621227110.json",
"62/621227111.json",
"62/621227112.json",
"62/621227208.json",
"62/621227211.json",
"62/621228100.json",
"62/621228101.json",
"62/621228102.json",
"62/621228103.json",
"62/621228104.json",
"62/621228105.json",
"62/621228201.json",
"62/621228203.json",
"62/621228204.json",
"62/621228207.json",
"62/621228210.json",
"62/621228212.json",
"62/623023103.json",
"62/623023106.json",
"62/623023107.json",
"62/623023108.json",
"62/623023109.json",
"62/623023110.json",
"62/623023111.json",
"62/623023112.json",
"62/623023200.json",
"62/623023213.json",
"output/output-102-8-1.geojson",
"output/output-103-8-1.geojson",
"output/output-104-8-1.geojson",
"output/output-105-8-1.geojson",
"output/output-106-8-1.geojson",
"output/output-107-8-1.geojson",
"output/output-108-8-1.geojson",
"output/output-109-8-1.geojson",
"output/output-110-8-1.geojson",
"output/output-111-8-1.geojson",
"output/output-112-8-1.geojson",
"output/output-113-8-1.geojson",
"output/output-114-8-1.geojson",
"output/output-115-8-1.geojson",
"output/output-116-8-1.geojson",
"output/output-117-8-1.geojson",
"output/output-118-8-1.geojson",
"output/output-119-8-1.geojson",
"output/output-120-8-1.geojson",
"output/output-121-8-1.geojson",
"output/output-122-8-1.geojson",
"output/output-123-8-1.geojson",
"output/output-124-8-1.geojson",
"output/output-125-8-1.geojson",
"output/output-126-8-1.geojson",
"output/output-127-8-1.geojson",
"output/output-128-8-1.geojson",
"output/output-129-8-1.geojson",
"output/output-130-8-1.geojson",
"output/output-131-8-1.geojson",
"output/output-132-8-1.geojson",
"output/output-133-8-1.geojson",
"output/output-134-8-1.geojson",
"output/output-135-8-1.geojson",
"output/output-136-8-1.geojson",
"output/output-137-8-1.geojson",
"output/output-138-8-1.geojson",
"output/output-139-8-1.geojson",
"output/output-140-8-1.geojson",
"output/output-141-8-1.geojson",
"output/output-142-8-1.geojson",
"output/output-143-8-1.geojson",
"output/output-144-8-1.geojson",
"output/output-145-8-1.geojson",
"output/output-146-8-1.geojson",
"output/output-147-8-1.geojson",
"output/output-148-8-1.geojson",
"output/output-149-8-1.geojson",
"output/output-150-8-1.geojson",
"output/output-151-8-1.geojson",
"output/output-152-8-1.geojson",
"output/output-153-8-1.geojson",
"output/output-154-8-1.geojson",
"output/output-156-8-1.geojson",
"output/output-157-8-1.geojson",
"output/output-158-8-1.geojson",
"output/output-159-8-1.geojson",
"output/output-160-8-1.geojson",
"output/output-161-8-1.geojson",
"output/output-162-8-1.geojson",
"output/output-163-8-1.geojson",
"output/output-164-8-1.geojson",
"output/output-165-8-1.geojson",
"output/output-166-8-1.geojson",
"output/output-167-8-1.geojson",
"output/output-168-8-1.geojson",
"output/output-169-8-1.geojson",
"output/output-170-8-1.geojson",
"output/output-171-8-1.geojson",
"output/output-172-8-1.geojson",
"output/output-173-8-1.geojson",
"output/output-174-8-1.geojson",
"output/output-175-8-1.geojson",
"output/output-176-8-1.geojson",
"output/output-177-8-1.geojson",
"output/output-178-8-1.geojson",
"output/output-179-8-1.geojson",
"output/output-180-8-1.geojson",
"output/output-181-8-1.geojson",
"output/output-182-8-1.geojson",
"output/output-183-8-1.geojson",
"output/output-184-8-1.geojson",
"output/output-185-8-1.geojson",
"output/output-186-8-1.geojson",
// 添加更多路径...
];
} else {
geoJsonUrls = [
"区县边界/成县.json",
"区县边界/宕昌县.json",
"区县边界/徽县.json",
"区县边界/康县.json",
"区县边界/礼县.json",
"区县边界/两当县.json",
"区县边界/文县.json",
"区县边界/武都区.json",
"区县边界/西和县.json",
"区县边界/舟曲县.json",
];
}
// 使用动态导入加载所有 JSON 文件
const geoJsonPromises = geoJsonUrls.map((url) => importJson(url));
// 等待所有 JSON 数据加载完成
const geoJsonDataArray = await Promise.all(geoJsonPromises);
// 现在 `geoJsonDataArray` 包含了所有加载的 JSON 数据
console.log(geoJsonDataArray);
// 处理加载的 GeoJSON 数据,将其转换为 OpenLayers 的 features 并添加到地图中
geoJsonDataArray.forEach((data) => {
const features = new GeoJSON().readFeatures(data, {
featureProjection: "EPSG:4326",
});
features.forEach((feature) => {
vectorSource.addFeature(feature);
hideFeature(feature); // 自定义逻辑,用于隐藏某些 feature
});
previousFeatures = previousFeatures.concat(features); // 更新 previousFeatures
});
};
在改代码的时候又碰到个模块问题:
同步模块 vs 异步模块
同步的请求返回的值
异步的请求返回的值
-
import
: 返回的是一个 Promise,你需要通过then
或await
来获取模块对象。 -
await import
: 使用await
会等待模块加载完成,然后返回模块对象。
Promise
的内部状态
当你查看 Promise
时,会看到 [[PromiseState]]
和 [[PromiseResult]]
:
-
[[PromiseState]]: "pending"
表示 Promise 还在等待完成。 -
[[PromiseState]]: "fulfilled"
表示 Promise 已完成,其结果存储在[[PromiseResult]]
中。