package com.moon.server.service.show; import com.moon.server.entity.all.StaticData; import com.moon.server.entity.ctrl.DownloadTileEntity; import com.moon.server.entity.ctrl.ShpRecordEntity; import com.moon.server.entity.data.DownloadEntity; import com.moon.server.entity.data.MetaFileEntity; import com.moon.server.entity.data.PublishEntity; import com.moon.server.entity.sys.UserEntity; import com.moon.server.service.data.DownloadService; import com.moon.server.service.data.PublishService; import com.moon.server.helper.*; 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 @SuppressWarnings("ALL") public class InquiryService { @Resource PathHelper pathHelper; @Resource PublishService publishService; @Resource DownloadService downloadService; private final static Log log = LogFactory.getLog(InquiryService.class); public ShpRecordEntity readShpFirstRecord(List list) { String fileName = null; for (MetaFileEntity mf : list) { if (mf.getName().toLowerCase().contains(".shp")) { fileName = mf.getPath(); break; } } if (StringHelper.isEmpty(fileName)) { return null; } 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 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 findTiles(DownloadTileEntity dt, PublishEntity pub) { List 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 files = findTilesByZoom(dt, pub, i); if (files.size() > 0) { list.addAll(files); } } return list; } private List findTilesByZoom(DownloadTileEntity dt, PublishEntity pub, int zoom) { List 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 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()); } }