java解析shp文件以及坐标转换(工具类)

百度找了很多大部分都是pom的,maven项目中的,但是用maven下载不了,只能一个jar一个jar下载了,中间也遇到了很多坑,都是pom中没有提到的架包

 

直接上代码,最后我会解析shp文件所用到的所有jar截图粘上

package com.common.utils;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.shapefile.ShapefileDataStoreFactory;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.opengis.feature.Property;
import org.opengis.feature.simple.SimpleFeature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.vividsolutions.jts.geom.Geometry;

/**
 * 解析shp文件
 * @author xujiajia
 *
 */
public class ShapeUtils {

	private static final Logger logger = LoggerFactory.getLogger(ShapeUtils.class);
	/**
	 * 测试
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		String shpFilePath = "D:\\YuTuWork\\PT\\河南电信\\文档\\外部矢量数据\\矢量\\shp.shp";
		long time = System.currentTimeMillis();
		List<Map<String,Object>> readFile = readFile(shpFilePath, null);
		long time2 = System.currentTimeMillis();
		System.out.println("耗时:" + (time2 - time));
		System.out.println(readFile);
		
	}
	
	/**
	 * 读取shp文件
	 * 
	 * @Description
	 * @author gxx
	 * @date: 2019年7月3日 上午9:33:43
	 */
	public static List<Map<String, Object>> readFile(String shapePath, String prjPath) {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		ShapefileDataStoreFactory factory = new ShapefileDataStoreFactory();
		ShapefileDataStore dataStore = null;
		try {
			dataStore = (ShapefileDataStore) factory.createDataStore(new File(shapePath).toURI().toURL());
			if (dataStore != null) {
				dataStore.setCharset(Charset.forName("UTF-8"));
			}
			String wkt = "";
			if(StringUtils.isNotBlank(prjPath)) {
				wkt = TxtUtils.readTxtFile(prjPath);
				logger.info("获取到shp文件坐标系:{}", wkt);
			}
			boolean change = false;
			//如果是投影坐标系,则进行坐标转换
			if(wkt.startsWith("PROJCS")) {
				change = true;
			}
			SimpleFeatureSource featureSource = dataStore.getFeatureSource();
			SimpleFeatureIterator itertor = featureSource.getFeatures().features();
//			一个用于处理FeatureCollection的实用工具类。提供一个获取FeatureCollection实例的机制
//      		FeatureCollection<SimpleFeatureType, SimpleFeature> result=featureSource.getFeatures();
//      		
//      		FeatureIterator<SimpleFeature> iterator = result.features();
			while (itertor.hasNext()) {
				SimpleFeature feature = itertor.next();
				Iterator<Property> it = feature.getProperties().iterator();
				Map<String, Object> map = new HashMap<String, Object>();
				while (it.hasNext()) {
					Property pro = it.next();
					if(change && "the_geom".equals(String.valueOf(pro.getName()))) {
						map.put(String.valueOf(pro.getName()), CoordConverter.convert((Geometry)pro.getValue(), wkt));
					} else {
						map.put(String.valueOf(pro.getName()), String.valueOf(pro.getValue()));
					}
				}
				list.add(map);
//				SimpleFeature feature = (SimpleFeature) iterator.next();
//	            // Feature转GeoJSON
//	            FeatureJSON fjson = new FeatureJSON();
//	            StringWriter writer = new StringWriter();
//	            fjson.writeFeature(feature, writer);
//	            String sjson = writer.toString();
//	            System.out.println("sjson=====  >>>>  "  + sjson);
			}
			itertor.close();
			return list;
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		} finally {
			if(dataStore != null) {
				dataStore.dispose();
			}
		}
		return null;
	}

	/**
	 * 丢给从一个文件中获取Shape文件路径
	 *
	 * @param path 文件夹路径
	 * @param path 需要获得的shape文件路径
	 */
	public static void getShapePath(String path, List<String> fielPath) {
		File file = new File(path);
		if (file.exists() && file.isDirectory()) {
			File[] files = file.listFiles();
			for (File file1 : files) {
				if (file1.isDirectory()) {
					getShapePath(file1.getPath(), fielPath);
				} else {
					String fileName = file1.getName();
					String suffix = fileName.substring(fileName.lastIndexOf("."));
					if (".shp".equals(suffix)) {
						fielPath.add(file1.getAbsolutePath());
						break;
					}
				}
			}
		}
	}
	
	
	/**
	 * 获取prj文件路径
	 * @Description
	 * @author gxx
	 * @date: 2019年8月8日 下午6:12:51
	 */
	public static void getPrjPath(String path, List<String> fielPath) {
		File file = new File(path);
		if (file.exists() && file.isDirectory()) {
			File[] files = file.listFiles();
			for (File file1 : files) {
				if (file1.isDirectory()) {
					getShapePath(file1.getPath(), fielPath);
				} else {
					String fileName = file1.getName();
					String suffix = fileName.substring(fileName.lastIndexOf("."));
					if (".prj".equals(suffix)) {
						fielPath.add(file1.getAbsolutePath());
						break;
					}
				}
			}
		}
	}

	
	/**
	 * 获取Shape文件的坐标系信息,GEOGCS表示这个是地址坐标系,PROJCS则表示是平面投影坐标系
	 * @Description
	 * @author gxx
	 * @date: 2019年7月5日 上午9:04:07
	 */
	public static String getCoordinateSystemWKT(String path) {
		ShapefileDataStoreFactory factory = new ShapefileDataStoreFactory();
		ShapefileDataStore dataStore = null;
		try {
			dataStore = (ShapefileDataStore) factory.createDataStore(new File(path).toURI().toURL());
			return dataStore.getSchema().getCoordinateReferenceSystem().toWKT();
		} catch (UnsupportedOperationException | IOException e) {
			logger.error(e.getMessage(), e);
		} finally {
			dataStore.dispose();
		}
		return "";
	}
	

	
	
}

下边的是坐标转换的工具类,在上一个工具中调用到了

package com.common.utils;

import org.geotools.geometry.jts.JTS;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.geotools.referencing.CRS;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.opengis.geometry.MismatchedDimensionException;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.io.WKTReader;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * @author ZhaiYP 坐标转换
 */

/**
 * @author Administrator
 */
public class CoordConverter {

	
	private static final Logger logger = LoggerFactory.getLogger(CoordConverter.class);
	
    /**
     * TODO 墨卡托投影prj文件坐标参数
     */
    final static String strWKTMercator = "PROJCS[\"WGS_1984_UTM_Zone_51N\","
            + "GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\"," + "SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],"
            + "PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]," + "PROJECTION[\"Transverse_Mercator\"],"
            + "PARAMETER[\"False_Easting\",500000.0]," + "PARAMETER[\"False_Northing\",0.0],"
            + "PARAMETER[\"Central_Meridian\",123.0]," + "PARAMETER[\"Scale_Factor\",0.9996],"
            + "PARAMETER[\"Latitude_Of_Origin\",0.0]," + "UNIT[\"Meter\",1.0]]\r\n";

   

    /**
     * TODO 墨卡托投影51N投影坐标转换为wgs_84经纬度投影
     *
     * @param lon x坐标
     * @param lat y坐标
     * @return double[] 转换后double类型x/y坐标对
     * @throws FactoryException
     * @throws MismatchedDimensionException
     * @throws TransformException           2018年10月16日
     */
    public static double[] convert_51NToWgs84(double lon, double lat) {
        // 传入原始的经纬度坐标
        Coordinate sourceCoord = new Coordinate(lon, lat);
        GeometryFactory geoFactory = new GeometryFactory();
        Point sourcePoint = geoFactory.createPoint(sourceCoord);
        // 这里是以OGC WKT形式定义的是WGS_1984_UTM_Zone_51N投影
        CoordinateReferenceSystem mercatroCRS;
        Point targetPoint = null;
        try {
            mercatroCRS = CRS.parseWKT(strWKTMercator);
            // CoordinateReferenceSystem wgs_1984 = CRS.parseWKT(wgs_84);
            // 做投影转换,将WCG84坐标转换成世界墨卡托投影转
            MathTransform transform = CRS.findMathTransform(mercatroCRS, DefaultGeographicCRS.WGS84);
            targetPoint = (Point) JTS.transform(sourcePoint, transform);
        } catch (FactoryException e) {
            e.printStackTrace();
        } catch (MismatchedDimensionException e) {
            e.printStackTrace();
        } catch (TransformException e) {
            e.printStackTrace();
        }
        // 返回转换以后的X和Y坐标
        double x = Double.parseDouble(String.format("%.6f", targetPoint.getX()));
        double y = Double.parseDouble(String.format("%.6f", targetPoint.getY()));
        double[] targetCoord = {x, y};
        return targetCoord;
    }

    /**
     * TODO wgs_84经纬度坐标点,转换为墨卡托投影51N坐标点
     *
     * @param lon x坐标
     * @param lat y坐标
     * @return double[] 转换后double类型x/y坐标对
     * @throws FactoryException
     * @throws MismatchedDimensionException
     * @throws TransformException           2018年10月16日
     */
    public static double[] convert_WGS84To51N(double lon, double lat) {
        // 传入原始的经纬度坐标
        Coordinate sourceCoord = new Coordinate(lon, lat);
        GeometryFactory geoFactory = new GeometryFactory();
        Point sourcePoint = geoFactory.createPoint(sourceCoord);
        // 这里是以OGC WKT形式定义的是WGS_1984_UTM_Zone_51N投影
        CoordinateReferenceSystem mercatroCRS;
        Point targetPoint = null;
        try {
            mercatroCRS = CRS.parseWKT(strWKTMercator);
            // CoordinateReferenceSystem wgs_1984 = CRS.parseWKT(wgs_84);
            // 做投影转换,将WCG84坐标转换成世界墨卡托投影转
            MathTransform transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, mercatroCRS);
            targetPoint = (Point) JTS.transform(sourcePoint, transform);
        } catch (FactoryException e) {
            e.printStackTrace();
        } catch (MismatchedDimensionException e) {
            e.printStackTrace();
        } catch (TransformException e) {
            e.printStackTrace();
        }
        // 返回转换以后的X和Y坐标
        double[] targetCoord = {targetPoint.getX(), targetPoint.getY()};
        return targetCoord;
    }

    
    /**
     * 根据hsp文件坐标系
     * @Description
     * @author gxx
     * @date: 2019年7月5日 上午9:19:27
     */
    public static double[] convert(double lon, double lat, String strWKT) {
        Coordinate sourceCoord = new Coordinate(lon, lat);
        GeometryFactory geoFactory = new GeometryFactory();
        Point sourcePoint = geoFactory.createPoint(sourceCoord);
        CoordinateReferenceSystem mercatroCRS;
        Point targetPoint;
		try {
			mercatroCRS = CRS.parseWKT(strWKT);
			MathTransform transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, mercatroCRS);
	        targetPoint = (Point) JTS.transform(sourcePoint, transform);
	        double[] targetCoord = {targetPoint.getX(), targetPoint.getY()};
	        return targetCoord;
		} catch (FactoryException | MismatchedDimensionException | TransformException e) {
			logger.error(e.getMessage(), e);
		}
        return null;
    }
    
    /**
     * 根据hsp文件坐标系,将墨卡托投影51N投影坐标转换为wgs_84经纬度投影
     * @Description
     * @author gxx
     * @date: 2019年7月5日 上午9:19:27
     */
    public static String convert(Geometry geom, String strWKT) {
        CoordinateReferenceSystem mercatroCRS;
		try {
			mercatroCRS = CRS.parseWKT(strWKT);
			MathTransform transform = CRS.findMathTransform(mercatroCRS, DefaultGeographicCRS.WGS84);
			Geometry geometry = JTS.transform(geom, transform);
			return geometry.toString();
		} catch (FactoryException | MismatchedDimensionException | TransformException e) {
			logger.error(e.getMessage(), e);
		}
        return null;
    }
    

    public static List<Map<String, Object>> changeCoord(List<Map<String, Object>> list) {
        long startTime = System.currentTimeMillis();
        for (Map<String, Object> map : list) {
            if ((map.get("wgs84_x") == null || "".equals(map.get("wgs84_x")) || "null".equals(map.get("wgs84_x")))
                    && (map.get("bj54_x") != null && !"".equals(map.get("bj54_x")))) {
                String bj54_x = (String) map.get("bj54_x");
                String bj54_y = (String) map.get("bj54_y");
                List<String> bj54_xList = Arrays.asList(bj54_x.split(","));
                List<String> bj54_yList = Arrays.asList(bj54_y.split(","));
                StringBuilder wgs84_x = new StringBuilder();
                StringBuilder wgs84_y = new StringBuilder();
                for (int i = 0; i < bj54_xList.size(); i++) {
                    double x = Double.parseDouble(bj54_xList.get(i));
                    double y = Double.parseDouble(bj54_yList.get(i));
                    double[] wgs84ByBj54 = CoordConverter.convert_51NToWgs84(x, y);
                    String wgs84x = String.valueOf(wgs84ByBj54[0]);
                    String wgs84y = String.valueOf(wgs84ByBj54[1]);
                    wgs84_x.append(wgs84x);
                    wgs84_y.append(wgs84y);
                    if (i < bj54_xList.size() - 1) {
                        wgs84_x.append(",");
                        wgs84_y.append(",");
                    }
                }

                map.put("wgs84_x", wgs84_x.toString());
                map.put("wgs84_y", wgs84_y.toString());
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println(endTime - startTime+ "ms");
        return list;
    }

    // main函数进行验证
    public static void main(String[] args) throws Exception {
        double longitude = 761814.915609849242342;
        double latitude = 4861308.17594982343242;
        long startTime = System.currentTimeMillis();
        double[] coordinate_51N = CoordConverter.convert_51NToWgs84(longitude, latitude);
        long endtime = System.currentTimeMillis();
        System.out.println((endtime - startTime) / 1000);
        System.out.println("X: " + coordinate_51N[0] + ", Y: " + coordinate_51N[1]);
        // double[] coordinate_51N_ = new
        // CoordConverter().convert_51NToWeb(longitude, latitude);
        // System.out.println("X: " + coordinate_51N_[0] + ", Y: " +
        // coordinate_51N_[1]);
        // double[] coordinate_wgs = new
        // CoordConverter().convert_WGS84To51N(coordinate_51N[0],
        // coordinate_51N[1]);
        // System.out.println("X: " + coordinate_wgs[0] + ", Y: " +
        // coordinate_wgs[1]);
        
        
		GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);
		WKTReader reader = new WKTReader(geometryFactory);
		String multipolygon = "MULTIPOLYGON (((13749736.970548067 5102563.625129204, 13753483.478041079 5102754.125510205, 13754753.480581086 5100150.620303195, 13753483.478041079 5098118.616239186, 13749038.469151061 5098563.11712819, 13749736.970548067 5102563.625129204)))";
		Geometry geom1 = (Geometry) reader.read(multipolygon);
		String convert = convert(geom1, strWKTMercator);
		System.out.println(convert);
    }
}

TxtUtil工具

 

/**
 * 
 */
package com.common.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import org.slf4j.Logger;

/**
 * @Description
 * @author xu
 * @date: 2019年8月5日 下午5:26:36
 */
public class TxtUtils {

	private static final Logger logger = org.slf4j.LoggerFactory.getLogger(TxtUtils.class);

	/**
	 * 读取txt文件
	 * 
	 * @Description
	 * @author gxx
	 * @date: 2019年8月5日 下午5:47:11
	 */
	public static String readTxtFile(String path) {
		StringBuilder stringBuilder = new StringBuilder();
		InputStreamReader inputStreamReader = null;
		FileInputStream inputStream = null;
		try {
            inputStream = new FileInputStream(new File(path));
			inputStreamReader = new InputStreamReader(inputStream);
			BufferedReader br = new BufferedReader(inputStreamReader);
			String s = null;
			while ((s = br.readLine()) != null) {
				stringBuilder.append(s);
			}
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (IOException e) {
					logger.error(e.getMessage(), e);
				}
			}
			if (inputStreamReader != null) {
				try {
					inputStreamReader.close();
				} catch (IOException e) {
					logger.error(e.getMessage(), e);
				}
			}
		}
		return stringBuilder.toString();
	}

	/**
	 * 写入txt文件,覆盖原有内容
	 * 
	 * @Description
	 * @author gxx
	 * @date: 2019年8月5日 下午5:38:02
	 */
	public static void writeTxtFile(String path, String content) {
		FileOutputStream fileOutputStream = null;
		try {
			fileOutputStream = new FileOutputStream(new File(path));
			fileOutputStream.write(content.getBytes());
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		} finally {
			if (fileOutputStream != null) {
				try {
					fileOutputStream.close();
				} catch (IOException e) {
					logger.error(e.getMessage(), e);
				}
			}
		}
	}

	
	
	public static void main(String[] args) {
//		String path = "D:\\uploadFiles\\version.txt";
		String path = "d:\\\\uploadFiles\\\\shp\\\\59bd6477ecbf4f3aa5f62f8dafe77afb\\\\polygon.prj";
		String readTxtFile = readTxtFile(path);
		System.out.println(readTxtFile);
	}
}

所用到的jar(选中的那些)

架包下载:https://download.csdn.net/download/xujiahn/12317071(之前设置的0积分,下载的人多了就直接涨到50积分了,我重新设置成0,不到一天就又变成50了,你们就看着截图去下载吧!https://mvnrepository.com/

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: Java解析SHP坐标常用的库是GeoTools。GeoTools是一个开源的Java库,专门用于处理地理空间数据的解析和操作。 要解析SHP坐标,首先需要在项目中导入GeoTools库的依赖。可以通过Maven或Gradle进行导入。 接下来,需要加载SHP文件。可以使用ShapefileDataStore类来加载SHP文件。通过指定文件的路径,使用ShapefileDataStore的静态方法createDataStore来创建DataStore对象。 加载完成后,可以通过DataStore对象获取FeatureSource。FeatureSource是数据源的接口,表示SHP文件的几何特征集合。可以使用getFeatures方法获取FeatureCollection对象。 然后,可以通过FeatureCollection对象遍历获取每个Feature对象,从而获取坐标信息。Feature对象代表SHP文件中的一个要素,可以通过getAttribute方法获取属性信息,通过getDefaultGeometry方法获取几何信息。 最后,可以通过几何信息获取坐标。GeoTools的几何对象使用了封装坐标的方式,可以通过getCoordinate方法获取坐标。 以下是通过GeoTools解析SHP坐标的简单示例代码: ``` String shpPath = "path/to/your.shp"; // 创建DataStore DataStore dataStore = FileDataStoreFinder.getDataStore(new File(shpPath)); // 获取FeatureSource FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = dataStore.getFeatureSource(); // 获取FeatureCollection try (FeatureIterator<SimpleFeature> features = featureSource.getFeatures().features()) { while (features.hasNext()) { SimpleFeature feature = features.next(); Geometry geometry = (Geometry) feature.getDefaultGeometry(); Coordinate[] coordinates = geometry.getCoordinates(); for (Coordinate coordinate : coordinates) { double x = coordinate.getX(); double y = coordinate.getY(); // 处理坐标信息 } } } ``` 通过以上步骤,可以使用Java解析SHP坐标。GeoTools还提供了其他很多功能,如投影转换、空间分析等,可根据实际需要进行扩展和应用。 ### 回答2: Java是一种十分强大的编程语言,可以用来解析和处理各种类型的数据,shp文件中的坐标信息。对于解析shp文件的操作,可以使用Java提供的一些库和工具来实现。 要解析shp文件中的坐标信息,首先需要使用Java中的文件IO操作来读取和打开shp文件。可以使用Java提供的FileInputStream和BufferedReader等类来实现文件的读取操作。 读取shp文件后,需要通过解析shp文件的格式来提取其中的坐标信息。shp文件是一种地理信息系统常用的矢量数据格式,通常括几何信息、属性信息等。 一种常用的操作是使用Java提供的第三方库,比如GeoTools库来解析shp文件GeoTools是一个开源的地理空间数据处理库,提供了各种功能用于处理地理信息数据。 使用GeoTools库解析shp文件,可以通过创建FeatureReader对象来获取shp文件中的几何信息。然后可以使用FeatureReader对象的方法来获取和操作其中的坐标信息。 根据shp文件的具体格式,可以通过FeatureReader对象获取每个几何要素的坐标信息。对于点、线、面等不同类型的几何要素,可以使用不同的方法来获取其坐标信息。 通过上述步骤,就可以使用Java解析shp文件并提取其中的坐标信息。可以将这些坐标信息作为Java程序的输出,也可以进行进一步的处理和分析。 总之,使用Java解析shp文件中的坐标信息,需要使用文件IO操作读取shp文件,然后使用第三方库如GeoTools来解析文件中的几何信息,最后通过相关方法获取和操作坐标信息。 ### 回答3: Java可以使用开源库来解析和处理SHP(Shapefile)文件的坐标数据。下面是一种常见的方法: 1. 导入相应的库文件。常见的库GeoTools、JShape等。 2. 创建一个SHP文件读取器。可以使用库提供的相应类来读取SHP文件,例如GeoTools的ShapefileDataStore类。 3. 打开SHP文件。通过读取器的open()方法打开SHP文件。 4. 获取SHP文件的图层信息。使用读取器的getFeatureSource()方法来获取SHP文件的图层信息。 5. 获取图层的要素迭代器。通过图层获取要素迭代器,遍历每个要素。 6. 获取要素的几何属性。通过要素的getGeometry()方法获取要素的几何属性。 7. 解析坐标点。根据具体的几何属性类型(点、线、面等),使用相应的方法来解析坐标点。 8. 处理坐标点数据。将解析出的坐标点数据进行相应的处理,例如存储、打印等。 9. 关闭SHP文件。使用读取器的close()方法关闭SHP文件。 以上就是使用Java解析SHP文件坐标的基本流程。注意,在具体实现中可能需要根据数据结构、库的使用方式以及具体需求进行适当的调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值