| | |
| | | package com.lf.server.service.show; |
| | | |
| | | import com.lf.server.entity.all.StaticData; |
| | | import com.lf.server.entity.ctrl.DownloadTileEntity; |
| | | import com.lf.server.entity.ctrl.ShpRecordEntity; |
| | | import com.lf.server.entity.data.DownloadEntity; |
| | | import com.lf.server.entity.data.MetaFileEntity; |
| | | import com.lf.server.helper.FileHelper; |
| | | import com.lf.server.helper.GdalHelper; |
| | | import com.lf.server.helper.StringHelper; |
| | | import com.lf.server.entity.data.PublishEntity; |
| | | import com.lf.server.entity.sys.UserEntity; |
| | | import com.lf.server.helper.*; |
| | | import com.lf.server.service.data.DownloadService; |
| | | import com.lf.server.service.data.PublishService; |
| | | import net.lingala.zip4j.ZipFile; |
| | | import net.lingala.zip4j.model.ZipParameters; |
| | | import org.apache.commons.logging.Log; |
| | | import org.apache.commons.logging.LogFactory; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.io.File; |
| | | import java.io.FileInputStream; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | */ |
| | | @Service |
| | | public class InquiryService { |
| | | @Resource |
| | | PathHelper pathHelper; |
| | | |
| | | @Resource |
| | | PublishService publishService; |
| | | |
| | | @Resource |
| | | DownloadService downloadService; |
| | | |
| | | private final static Log log = LogFactory.getLog(InquiryService.class); |
| | | |
| | | /** |
| | | * 读取Shp第一条记录的WKT |
| | | * |
| | | * @param list |
| | | * @return |
| | | */ |
| | | public ShpRecordEntity readShpFirstRecord(List<MetaFileEntity> list) { |
| | | String fileName = null; |
| | | for (MetaFileEntity mf : list) { |
| | | if (mf.getName().toLowerCase().indexOf(".shp") > -1) { |
| | | if (mf.getName().toLowerCase().contains(".shp")) { |
| | | fileName = mf.getPath(); |
| | | break; |
| | | } |
| | |
| | | return null; |
| | | } |
| | | |
| | | ShpRecordEntity sr = GdalHelper.readShpFirstRecord(fileName); |
| | | ShpRecordEntity sr = ShpHelper.readShpFirstRecord(fileName); |
| | | FileHelper.deleteFiles(list); |
| | | |
| | | return sr; |
| | | } |
| | | |
| | | /** |
| | | * 打包瓦片 |
| | | */ |
| | | public String zipTiles(DownloadTileEntity dt, PublishEntity pub, UserEntity ue) { |
| | | if (!isTilePathExist(pub)) { |
| | | return null; |
| | | } |
| | | |
| | | List<File> list = findTiles(dt, pub); |
| | | if (list.isEmpty()) { |
| | | return null; |
| | | } |
| | | |
| | | String tempName = StringHelper.YMDHMS2_FORMAT.format(new Date()); |
| | | String zipFile = pathHelper.getDownloadFullPath() + File.separator + tempName + ".zip"; |
| | | |
| | | ZipFile zip = Zip4jHelper.createZipFile(zipFile, dt.getPwd()); |
| | | ZipParameters params = Zip4jHelper.getZipParams(true); |
| | | addFiles(zip, params, list, pub.getPath() + File.separator); |
| | | |
| | | String dbPwd = Md5Helper.reverse(Md5Helper.generate(dt.getPwd())); |
| | | DownloadEntity de = getDownloadEntity(ue, zipFile, dbPwd); |
| | | int rows = downloadService.insert(de); |
| | | if (de.getId() > 0) { |
| | | insertPubDown(pub, de, ue); |
| | | } |
| | | |
| | | return rows > 0 ? de.getGuid() : null; |
| | | } |
| | | |
| | | /** |
| | | * 瓦片路径是否存在 |
| | | */ |
| | | private boolean isTilePathExist(PublishEntity pub) { |
| | | String tilePath = pathHelper.getConfig().getTilePath() + pub.getPath(); |
| | | |
| | | File f = new File(tilePath); |
| | | if (!f.exists() || !f.isDirectory()) { |
| | | return false; |
| | | } |
| | | |
| | | pub.setPath(tilePath); |
| | | |
| | | return true; |
| | | } |
| | | |
| | | /** |
| | | * 查找瓦片 |
| | | */ |
| | | private List<File> findTiles(DownloadTileEntity dt, PublishEntity pub) { |
| | | List<File> list = new ArrayList<>(); |
| | | |
| | | File view = new File(pub.getPath() + File.separator + "view.htm"); |
| | | if (view.exists() && !view.isDirectory()) { |
| | | list.add(view); |
| | | } |
| | | |
| | | for (int i = 0; i < StaticData.I23; i++) { |
| | | List<File> files = findTilesByZoom(dt, pub, i); |
| | | if (files.size() > 0) { |
| | | list.addAll(files); |
| | | } |
| | | } |
| | | |
| | | return list; |
| | | } |
| | | |
| | | /** |
| | | * 根据层次查找瓦片 |
| | | */ |
| | | private List<File> findTilesByZoom(DownloadTileEntity dt, PublishEntity pub, int zoom) { |
| | | List<File> list = new ArrayList<>(); |
| | | File f = new File(pub.getPath() + File.separator + zoom); |
| | | if (!f.exists() || !f.isDirectory()) { |
| | | return list; |
| | | } |
| | | |
| | | int[] leftTop = deg2num(zoom, dt.getXmin(), dt.getYmax()); |
| | | int[] rightBottom = deg2num(zoom, dt.getXmax(), dt.getYmin()); |
| | | |
| | | for (int x = leftTop[0]; x <= rightBottom[0]; x++) { |
| | | for (int y = leftTop[1]; y <= rightBottom[1]; y++) { |
| | | String pngPath = String.format("%s\\%d\\%d\\%d.png", pub.getPath(), zoom, x, y); |
| | | |
| | | File pngFile = new File(pngPath); |
| | | if (pngFile.exists()) { |
| | | list.add(pngFile); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return list; |
| | | } |
| | | |
| | | /** |
| | | * 角度转数值 |
| | | */ |
| | | private int[] deg2num(int zoom, double x, double y) { |
| | | double yRad = Math.toRadians(y); |
| | | double n = Math.pow(2.0, zoom); |
| | | |
| | | int xTile = (int) ((x + 180.0) / 360.0 * n); |
| | | int yTile = (int) ((1.0 - Math.log(Math.tan(yRad) + (1 / Math.cos(yRad))) / Math.PI) / 2.0 * n); |
| | | |
| | | return new int[]{xTile, yTile}; |
| | | } |
| | | |
| | | /** |
| | | * 添加文件至压缩包 |
| | | */ |
| | | private void addFiles(ZipFile zip, ZipParameters params, List<File> list, String basePath) { |
| | | for (File f : list) { |
| | | try { |
| | | params.setFileNameInZip(f.getPath().replace(basePath, "")); |
| | | zip.addStream(new FileInputStream(f), params); |
| | | } catch (Exception ex) { |
| | | log.error(ex.getMessage(), ex); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 获取下载实体类 |
| | | */ |
| | | private DownloadEntity getDownloadEntity(UserEntity ue, String file, String pwd) { |
| | | DownloadEntity de = new DownloadEntity(); |
| | | de.setName(FileHelper.getFileName(file)); |
| | | // 1-Shp文件,2-专题图,3-元数据,4-业务数据,5-管道分析,6-统计报告,7-附件文件,8-瓦片文件 |
| | | de.setType(8); |
| | | de.setSizes(FileHelper.sizeToMb(new File(file).length())); |
| | | de.setDepid(ue.getDepid()); |
| | | de.setDcount(0); |
| | | de.setPwd(pwd); |
| | | de.setUrl(FileHelper.getRelativePath(file)); |
| | | de.setDescr("瓦片文件"); |
| | | de.setGuid(FileHelper.getFileMd5(file)); |
| | | de.setCreateUser(ue.getId()); |
| | | // de.setGeom(null) |
| | | |
| | | return de; |
| | | } |
| | | |
| | | /** |
| | | * 插入数据发布-下载表 |
| | | */ |
| | | private void insertPubDown(PublishEntity pub, DownloadEntity de, UserEntity ue) { |
| | | publishService.insertPubDown(pub.getId(), de.getId(), ue.getId()); |
| | | } |
| | | } |