核心SDK提交
This commit is contained in:
38
.gitignore
vendored
Normal file
38
.gitignore
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea/modules.xml
|
||||
.idea/jarRepositories.xml
|
||||
.idea/compiler.xml
|
||||
.idea/libraries/
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### Eclipse ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### Mac OS ###
|
||||
.DS_Store
|
0
.idea/.gitignore
generated
vendored
Normal file
0
.idea/.gitignore
generated
vendored
Normal file
6
.idea/encodings.xml
generated
Normal file
6
.idea/encodings.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
13
.idea/misc.xml
generated
Normal file
13
.idea/misc.xml
generated
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="MavenProjectsManager">
|
||||
<option name="originalFiles">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/pom.xml" />
|
||||
</list>
|
||||
</option>
|
||||
<option name="workspaceImportForciblyTurnedOn" value="true" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK" />
|
||||
</project>
|
124
.idea/uiDesigner.xml
generated
Normal file
124
.idea/uiDesigner.xml
generated
Normal file
@ -0,0 +1,124 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Palette2">
|
||||
<group name="Swing">
|
||||
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
|
||||
</item>
|
||||
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
|
||||
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
|
||||
<initial-values>
|
||||
<property name="text" value="Button" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="RadioButton" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="CheckBox" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="Label" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
|
||||
<preferred-size width="-1" height="20" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
|
||||
</item>
|
||||
</group>
|
||||
</component>
|
||||
</project>
|
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
216
.idea/workspace.xml
generated
Normal file
216
.idea/workspace.xml
generated
Normal file
@ -0,0 +1,216 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="AutoImportSettings">
|
||||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="414d0304-fefe-46ab-b37b-a838c6ff92b3" name="Changes" comment="去除无效部分">
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/SdkApp.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/clt/controller/CltController.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/clt/service/CltService.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/clt/vo/CltDetailVo.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/utils/JacksonUtil.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/utils/PositionUtil.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/mbtiles/controller/MbtilesController.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/mbtiles/service/MbtilesService.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/pak/controller/PakController.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/pak/service/PakService.java" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/pak/vo/PakIndexVo.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/App.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/clt/controller/CltController.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/clt/domain/CltInfos.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/clt/domain/CltInfos.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/clt/domain/CltTiles.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/clt/domain/CltTiles.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/clt/mapper/CltInfosMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/clt/mapper/CltInfosMapper.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/clt/mapper/CltTilesMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/clt/mapper/CltTilesMapper.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/config/CustomCorsFilter.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/config/CustomCorsFilter.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/config/ServerConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/config/ServerConfig.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/config/SwaggerConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/config/SwaggerConfig.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/config/WebConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/config/WebConfig.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/controller/SourceMapController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/controller/SourceMapController.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/ds/DataSourceConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/ds/DataSourceConfig.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/ds/DynamicDataSourceContextHolder.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/ds/DynamicDataSourceContextHolder.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/ds/DynamicDataSourceManager.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/ds/DynamicDataSourceManager.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/ds/DynamicRoutingDataSource.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/ds/DynamicRoutingDataSource.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/generator/CodeGenerator.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/generator/CodeGenerator.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/handler/BlobTypeHandler.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/handler/BlobTypeHandler.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/map/MapDto.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/map/MapDto.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/map/SourceMap.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/map/SourceMap.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/map/SourceTypeMap.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/map/SourceTypeMap.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/utils/DecompressionUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/utils/DecompressionUtil.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/utils/GlobalResponse.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/utils/GzipDecompressorUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/utils/GzipDecompressorUtil.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/utils/MD5HashUtil.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/utils/MD5HashUtil.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/common/utils/PakTableName.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/common/utils/PakTableName.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/mbtiles/controller/MbtilesController.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/mbtiles/domain/MbtilesMetaData.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/mbtiles/domain/MbtilesMetaData.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/mbtiles/domain/MbtilesTiles.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/mbtiles/domain/MbtilesTiles.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/mbtiles/mapper/MbtilesMetaDataMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/mbtiles/mapper/MbtilesMetaDataMapper.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/mbtiles/mapper/MbtilesTilesMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/mbtiles/mapper/MbtilesTilesMapper.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/mbtiles/vo/MbtilesIndexVo.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/mbtiles/vo/MbtilesIndexVo.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/pak/controller/PakController.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/pak/domain/PakBlocks.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/pak/domain/PakBlocks.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/pak/domain/PakInfos.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/pak/domain/PakInfos.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/pak/mapper/PakBlocksMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/pak/mapper/PakBlocksMapper.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/pak/mapper/PakInfosMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/yjdsj/pak/mapper/PakInfosMapper.java" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/pak/vo/PakIndexVo.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/poi/controller/TblPoisController.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/poi/domain/TblPois.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/java/com/xzjm/poi/mapper/TblPoisMapper.java" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/resources/application.yml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/application.yml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/resources/mapper/CltInfosMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/mapper/CltInfosMapper.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/resources/mapper/CltTilesMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/mapper/CltTilesMapper.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/resources/mapper/MbtilesMetaDataMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/mapper/MbtilesMetaDataMapper.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/resources/mapper/MbtilesTilesMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/mapper/MbtilesTilesMapper.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/resources/mapper/PakBlocksMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/mapper/PakBlocksMapper.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/resources/mapper/PakInfosMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/mapper/PakInfosMapper.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/main/resources/mapper/TblPoisMapper.xml" beforeDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||
</component>
|
||||
<component name="FileTemplateManagerImpl">
|
||||
<option name="RECENT_TEMPLATES">
|
||||
<list>
|
||||
<option value="Class" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="Git.Settings">
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||
</component>
|
||||
<component name="HighlightingSettingsPerFile">
|
||||
<setting file="file://$PROJECT_DIR$/pom.xml" root0="SKIP_INSPECTION" />
|
||||
<setting file="file://$PROJECT_DIR$/src/main/java/com/yjdsj/clt/controller/CltController.java" root0="SKIP_INSPECTION" />
|
||||
<setting file="file://$PROJECT_DIR$/src/main/java/com/yjdsj/clt/service/CltService.java" root0="SKIP_INSPECTION" />
|
||||
<setting file="file://$PROJECT_DIR$/src/main/java/com/yjdsj/mbtiles/service/MbtilesService.java" root0="SKIP_INSPECTION" />
|
||||
<setting file="file://$PROJECT_DIR$/src/main/java/com/yjdsj/pak/service/PakService.java" root0="SKIP_INSPECTION" />
|
||||
</component>
|
||||
<component name="MavenImportPreferences">
|
||||
<option name="generalSettings">
|
||||
<MavenGeneralSettings>
|
||||
<option name="localRepository" value="D:\study\Repository" />
|
||||
<option name="mavenHome" value="D:\study\Maven\apache-maven-3.9.6" />
|
||||
<option name="userSettingsFile" value="D:\study\Maven\apache-maven-3.9.6\conf\settings.xml" />
|
||||
</MavenGeneralSettings>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectColorInfo">{
|
||||
"associatedIndex": 3
|
||||
}</component>
|
||||
<component name="ProjectId" id="2v6gdLEDX9Itw57NT0G6qRfVkMD" />
|
||||
<component name="ProjectLevelVcsManager" settingsEditedManually="true">
|
||||
<ConfirmationsSetting value="2" id="Add" />
|
||||
</component>
|
||||
<component name="ProjectViewState">
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<component name="PropertiesComponent"><![CDATA[{
|
||||
"keyToString": {
|
||||
"Maven.geographysdk [clean].executor": "Run",
|
||||
"Maven.geographysdk [package].executor": "Run",
|
||||
"RequestMappingsPanelOrder0": "0",
|
||||
"RequestMappingsPanelOrder1": "1",
|
||||
"RequestMappingsPanelWidth0": "75",
|
||||
"RequestMappingsPanelWidth1": "75",
|
||||
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"Spring Boot.App.executor": "Run",
|
||||
"Spring Boot.SdkApp.executor": "Run",
|
||||
"git-widget-placeholder": "master",
|
||||
"kotlin-language-version-configured": "true",
|
||||
"last_opened_file_path": "D:/geographysdk/src/main/java/com/yjdsj",
|
||||
"node.js.detected.package.eslint": "true",
|
||||
"node.js.detected.package.tslint": "true",
|
||||
"node.js.selected.package.eslint": "(autodetect)",
|
||||
"node.js.selected.package.tslint": "(autodetect)",
|
||||
"nodejs_package_manager_path": "npm",
|
||||
"settings.editor.selected.configurable": "MavenSettings",
|
||||
"vue.rearranger.settings.migration": "true"
|
||||
}
|
||||
}]]></component>
|
||||
<component name="RecentsManager">
|
||||
<key name="CreateClassDialog.RecentsKey">
|
||||
<recent name="com.xzjm.clt.service" />
|
||||
</key>
|
||||
<key name="CopyFile.RECENT_KEYS">
|
||||
<recent name="D:\geographysdk\src\main\java\com\yjdsj" />
|
||||
<recent name="D:\geographysdk\src\main\java\com\yjdsj\common\config" />
|
||||
</key>
|
||||
<key name="CopyClassDialog.RECENTS_KEY">
|
||||
<recent name="com.yjdsj.common.utils" />
|
||||
</key>
|
||||
</component>
|
||||
<component name="RunManager">
|
||||
<configuration name="SdkApp" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot" temporary="true" nameIsGenerated="true">
|
||||
<module name="geographysdk" />
|
||||
<option name="SPRING_BOOT_MAIN_CLASS" value="com.yjdsj.SdkApp" />
|
||||
<extension name="coverage">
|
||||
<pattern>
|
||||
<option name="PATTERN" value="com.yjdsj.*" />
|
||||
<option name="ENABLED" value="true" />
|
||||
</pattern>
|
||||
</extension>
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<recent_temporary>
|
||||
<list>
|
||||
<item itemvalue="Spring Boot.SdkApp" />
|
||||
</list>
|
||||
</recent_temporary>
|
||||
</component>
|
||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||
<component name="TaskManager">
|
||||
<task active="true" id="Default" summary="Default task">
|
||||
<changelist id="414d0304-fefe-46ab-b37b-a838c6ff92b3" name="Changes" comment="" />
|
||||
<created>1743471024061</created>
|
||||
<option name="number" value="Default" />
|
||||
<option name="presentableId" value="Default" />
|
||||
<updated>1743471024061</updated>
|
||||
<workItem from="1743471025089" duration="310000" />
|
||||
<workItem from="1743471894653" duration="904000" />
|
||||
<workItem from="1756181938956" duration="5196000" />
|
||||
<workItem from="1756258884017" duration="108000" />
|
||||
<workItem from="1756259648649" duration="8000" />
|
||||
<workItem from="1756275647764" duration="5000" />
|
||||
<workItem from="1757295670775" duration="109000" />
|
||||
<workItem from="1757295852768" duration="1319000" />
|
||||
<workItem from="1757300022870" duration="15000" />
|
||||
<workItem from="1757300075439" duration="2000" />
|
||||
<workItem from="1757300132550" duration="10371000" />
|
||||
</task>
|
||||
<task id="LOCAL-00001" summary="去除无效部分">
|
||||
<option name="closed" value="true" />
|
||||
<created>1743472791450</created>
|
||||
<option name="number" value="00001" />
|
||||
<option name="presentableId" value="LOCAL-00001" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1743472791450</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="2" />
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
<option name="version" value="3" />
|
||||
</component>
|
||||
<component name="Vcs.Log.Tabs.Properties">
|
||||
<option name="TAB_STATES">
|
||||
<map>
|
||||
<entry key="MAIN">
|
||||
<value>
|
||||
<State />
|
||||
</value>
|
||||
</entry>
|
||||
</map>
|
||||
</option>
|
||||
</component>
|
||||
<component name="VcsManagerConfiguration">
|
||||
<MESSAGE value="去除无效部分" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="去除无效部分" />
|
||||
</component>
|
||||
</project>
|
107
pom.xml
Normal file
107
pom.xml
Normal file
@ -0,0 +1,107 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<!-- 项目 GAV -->
|
||||
<groupId>com.yjdsj</groupId>
|
||||
<artifactId>geographysdk</artifactId>
|
||||
<version>1.0.0</version>
|
||||
|
||||
<!-- 项目统一配置 -->
|
||||
<properties>
|
||||
<maven.compiler.source>1.8</maven.compiler.source>
|
||||
<maven.compiler.target>1.8</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<!-- 父依赖 -->
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.3.3.RELEASE</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<!-- Web 起步依赖 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- MybtaisPlus -->
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||
<version>3.5.1</version>
|
||||
</dependency>
|
||||
|
||||
<!-- MybatisPlus 分页 -->
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-extension</artifactId>
|
||||
<version>3.5.1</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 代码生成器 -->
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-generator</artifactId>
|
||||
<version>3.5.1</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 模板引擎依赖 -->
|
||||
<dependency>
|
||||
<groupId>org.apache.velocity</groupId>
|
||||
<artifactId>velocity-engine-core</artifactId>
|
||||
<version>2.3</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Lombok 依赖 -->
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.18.30</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- SqlLite 依赖 -->
|
||||
<dependency>
|
||||
<groupId>org.xerial</groupId>
|
||||
<artifactId>sqlite-jdbc</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Mybatis -->
|
||||
<dependency>
|
||||
<groupId>org.mybatis.spring.boot</groupId>
|
||||
<artifactId>mybatis-spring-boot-starter</artifactId>
|
||||
<version>2.1.3</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Knife4j -->
|
||||
<dependency>
|
||||
<groupId>com.github.xiaoymin</groupId>
|
||||
<artifactId>knife4j-spring-boot-starter</artifactId>
|
||||
<version>2.0.7</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Hutool工具类 -->
|
||||
<dependency>
|
||||
<groupId>cn.hutool</groupId>
|
||||
<artifactId>hutool-all</artifactId>
|
||||
<version>5.7.8</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<finalName>geographysdk</finalName>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<!-- SpringBoot 插件 -->
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
11
src/main/java/com/yjdsj/SdkApp.java
Normal file
11
src/main/java/com/yjdsj/SdkApp.java
Normal file
@ -0,0 +1,11 @@
|
||||
package com.yjdsj;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class SdkApp {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(SdkApp.class, args);
|
||||
}
|
||||
}
|
66
src/main/java/com/yjdsj/clt/controller/CltController.java
Normal file
66
src/main/java/com/yjdsj/clt/controller/CltController.java
Normal file
@ -0,0 +1,66 @@
|
||||
package com.yjdsj.clt.controller;
|
||||
|
||||
|
||||
import com.yjdsj.clt.domain.CltTiles;
|
||||
import com.yjdsj.clt.service.CltService;
|
||||
import com.yjdsj.common.map.SourceMap;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import io.swagger.annotations.ApiParam;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.io.IOException;
|
||||
|
||||
@Slf4j
|
||||
@RestController
|
||||
@Api(tags = "倾斜模型资源")
|
||||
@RequestMapping("/data/clt")
|
||||
public class CltController {
|
||||
|
||||
@Resource
|
||||
private CltService cltService;
|
||||
@Resource
|
||||
private SourceMap sourceMap;
|
||||
|
||||
@ApiOperation(value = "获取倾斜模型资源列表")
|
||||
@GetMapping("/list")
|
||||
public Object list() {
|
||||
return sourceMap.getCltSourceList();
|
||||
}
|
||||
|
||||
@ApiOperation(value = "获取倾斜模型资源的详情")
|
||||
@GetMapping("/detail/{mark}")
|
||||
public Object detail(@PathVariable @ApiParam(value = "资源标识") String mark) {
|
||||
return cltService.detail(mark);
|
||||
}
|
||||
|
||||
@GetMapping("/{mark}/{path:.*}")
|
||||
public ResponseEntity<?> getData(@PathVariable @ApiParam(value = "资源标识") String mark, @PathVariable String path, HttpServletRequest request) {
|
||||
try {
|
||||
// 查询对应的 CltTiles 数据
|
||||
CltTiles cltTiles = cltService.getTileData(mark, path);
|
||||
if (cltTiles == null) {
|
||||
return ResponseEntity.notFound().build();
|
||||
}
|
||||
|
||||
// 获取是否需要压缩
|
||||
boolean isZip = cltService.checkIsZip(mark);
|
||||
|
||||
// 处理解压数据并返回
|
||||
Object responseData = cltService.handleDecompressedData(cltTiles, isZip);
|
||||
return ResponseEntity.ok(responseData);
|
||||
|
||||
} catch (IOException e) {
|
||||
log.error("处理瓦片数据失败", e);
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
|
||||
}
|
||||
}
|
||||
}
|
8
src/main/java/com/yjdsj/clt/domain/CltInfos.java
Normal file
8
src/main/java/com/yjdsj/clt/domain/CltInfos.java
Normal file
@ -0,0 +1,8 @@
|
||||
package com.yjdsj.clt.domain;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class CltInfos {
|
||||
private String params;
|
||||
}
|
10
src/main/java/com/yjdsj/clt/domain/CltTiles.java
Normal file
10
src/main/java/com/yjdsj/clt/domain/CltTiles.java
Normal file
@ -0,0 +1,10 @@
|
||||
package com.yjdsj.clt.domain;
|
||||
|
||||
import lombok.Data;
|
||||
@Data
|
||||
public class CltTiles {
|
||||
private String md5;
|
||||
private String path;
|
||||
private byte[] tile;
|
||||
private String type;
|
||||
}
|
8
src/main/java/com/yjdsj/clt/mapper/CltInfosMapper.java
Normal file
8
src/main/java/com/yjdsj/clt/mapper/CltInfosMapper.java
Normal file
@ -0,0 +1,8 @@
|
||||
package com.yjdsj.clt.mapper;
|
||||
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface CltInfosMapper {
|
||||
String selectParams();
|
||||
}
|
9
src/main/java/com/yjdsj/clt/mapper/CltTilesMapper.java
Normal file
9
src/main/java/com/yjdsj/clt/mapper/CltTilesMapper.java
Normal file
@ -0,0 +1,9 @@
|
||||
package com.yjdsj.clt.mapper;
|
||||
|
||||
import com.yjdsj.clt.domain.CltTiles;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface CltTilesMapper {
|
||||
CltTiles selectTileByMd5(String md5);
|
||||
}
|
120
src/main/java/com/yjdsj/clt/service/CltService.java
Normal file
120
src/main/java/com/yjdsj/clt/service/CltService.java
Normal file
@ -0,0 +1,120 @@
|
||||
package com.yjdsj.clt.service;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import com.yjdsj.clt.domain.CltTiles;
|
||||
import com.yjdsj.clt.mapper.CltInfosMapper;
|
||||
import com.yjdsj.clt.mapper.CltTilesMapper;
|
||||
import com.yjdsj.clt.vo.CltDetailVo;
|
||||
import com.yjdsj.common.ds.DynamicDataSourceContextHolder;
|
||||
import com.yjdsj.common.map.SourceMap;
|
||||
import com.yjdsj.common.utils.*;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class CltService {
|
||||
|
||||
@Resource
|
||||
private CltInfosMapper cltInfosMapper;
|
||||
|
||||
@Resource
|
||||
private CltTilesMapper cltTilesMapper;
|
||||
|
||||
@Resource
|
||||
private SourceMap sourceMap;
|
||||
|
||||
// 是否需要压缩缓存
|
||||
private final ConcurrentMap<String, Boolean> zipCache = new ConcurrentHashMap<>();
|
||||
|
||||
public Map<String, String> getCltSourceList() {
|
||||
return sourceMap.getCltSourceList();
|
||||
}
|
||||
|
||||
public CltDetailVo detail(String mark) {
|
||||
CltDetailVo result = new CltDetailVo();
|
||||
try {
|
||||
// 读取 JSON 文件
|
||||
String json = DecompressionUtil.decompressAndConvertToString(getTileData(mark, "tileset.json").getTile());
|
||||
// 读取JSON字符串为根节点
|
||||
ObjectNode rootNode = (ObjectNode) JacksonUtil.mapper.readTree(json);
|
||||
// 逐层定位到 root 节点 → 再定位到 transform 节点
|
||||
ObjectNode rootChildNode = (ObjectNode) rootNode.get("root");
|
||||
ArrayNode transformArrayNode = (ArrayNode) rootChildNode.get("transform");
|
||||
// 将 ArrayNode 转换为 double[] 数组
|
||||
double[] transform = new double[transformArrayNode.size()];
|
||||
for (int i = 0; i < transformArrayNode.size(); i++) {
|
||||
transform[i] = transformArrayNode.get(i).asDouble();
|
||||
}
|
||||
PositionUtil.BlhResult blhResult = PositionUtil.xyz2Blh(transform[12], transform[13], transform[14]);
|
||||
// 设置 URL
|
||||
result.setUrl(String.format("/data/clt/%s/tileset.json", mark));
|
||||
// 设置 3D 旋转参数
|
||||
CltDetailVo.Orientation orientation = new CltDetailVo.Orientation(0, 0, 0);
|
||||
result.setOrientation(orientation);
|
||||
// 设置位置
|
||||
CltDetailVo.Position position = new CltDetailVo.Position(
|
||||
blhResult.lon,
|
||||
blhResult.lat,
|
||||
blhResult.alt
|
||||
);
|
||||
result.setPosition(position);
|
||||
result.setFileType("tileset");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NullPointerException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public CltTiles getTileData(String mark, String path) {
|
||||
// 设置数据源
|
||||
DynamicDataSourceContextHolder.setDataSourceKey(mark);
|
||||
try {
|
||||
// 查询对应的 CltTiles 数据
|
||||
return cltTilesMapper.selectTileByMd5(MD5HashUtil.toMD5(path));
|
||||
} finally {
|
||||
// 清理数据源设置
|
||||
DynamicDataSourceContextHolder.clearDataSourceKey();
|
||||
}
|
||||
}
|
||||
|
||||
public boolean checkIsZip(String mark) {
|
||||
// 设置数据源
|
||||
DynamicDataSourceContextHolder.setDataSourceKey(mark);
|
||||
String paramsJson = cltInfosMapper.selectParams();
|
||||
try {
|
||||
JsonNode rootNode = JacksonUtil.mapper.readTree(paramsJson);
|
||||
return rootNode.path("zip").asBoolean(false);
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
} finally {
|
||||
// 清理数据源设置
|
||||
DynamicDataSourceContextHolder.clearDataSourceKey();
|
||||
}
|
||||
}
|
||||
|
||||
public Object handleDecompressedData(CltTiles cltTiles, boolean isZip) throws IOException {
|
||||
if (isZip) {
|
||||
if ("tileset.json".equals(cltTiles.getPath())) {
|
||||
// 解压缩并返回字符串
|
||||
return DecompressionUtil.decompressAndConvertToString(cltTiles.getTile());
|
||||
} else {
|
||||
// 解压缩并返回字节数组
|
||||
return GzipDecompressorUtil.decompress(cltTiles.getTile());
|
||||
}
|
||||
}
|
||||
// 不需要解压则直接返回对应的数据
|
||||
return cltTiles.getTile();
|
||||
}
|
||||
}
|
28
src/main/java/com/yjdsj/clt/vo/CltDetailVo.java
Normal file
28
src/main/java/com/yjdsj/clt/vo/CltDetailVo.java
Normal file
@ -0,0 +1,28 @@
|
||||
package com.yjdsj.clt.vo;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class CltDetailVo {
|
||||
private String url;
|
||||
private Orientation orientation;
|
||||
private Position position;
|
||||
private String fileType;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public static class Orientation {
|
||||
private double heading;
|
||||
private double roll;
|
||||
private double pitch;
|
||||
}
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public static class Position {
|
||||
private double lon;
|
||||
private double lat;
|
||||
private double alt;
|
||||
}
|
||||
}
|
23
src/main/java/com/yjdsj/common/config/CustomCorsFilter.java
Normal file
23
src/main/java/com/yjdsj/common/config/CustomCorsFilter.java
Normal file
@ -0,0 +1,23 @@
|
||||
package com.yjdsj.common.config;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.cors.CorsConfiguration;
|
||||
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
||||
import org.springframework.web.filter.CorsFilter;
|
||||
|
||||
@Configuration
|
||||
public class CustomCorsFilter {
|
||||
|
||||
@Bean
|
||||
public CorsFilter corsFilter() {
|
||||
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
|
||||
CorsConfiguration config = new CorsConfiguration();
|
||||
config.setAllowCredentials(true);
|
||||
config.addAllowedOrigin("*");
|
||||
config.addAllowedHeader("*");
|
||||
config.addAllowedMethod("*");
|
||||
source.registerCorsConfiguration("/**", config);
|
||||
return new CorsFilter(source);
|
||||
}
|
||||
}
|
15
src/main/java/com/yjdsj/common/config/ServerConfig.java
Normal file
15
src/main/java/com/yjdsj/common/config/ServerConfig.java
Normal file
@ -0,0 +1,15 @@
|
||||
package com.yjdsj.common.config;
|
||||
|
||||
import lombok.Data;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Data
|
||||
@Component
|
||||
public class ServerConfig {
|
||||
@Value("${server.port}")
|
||||
private int port;
|
||||
|
||||
@Value("${server.host}")
|
||||
private String host;
|
||||
}
|
34
src/main/java/com/yjdsj/common/config/SwaggerConfig.java
Normal file
34
src/main/java/com/yjdsj/common/config/SwaggerConfig.java
Normal file
@ -0,0 +1,34 @@
|
||||
package com.yjdsj.common.config;
|
||||
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import springfox.documentation.builders.ApiInfoBuilder;
|
||||
import springfox.documentation.builders.PathSelectors;
|
||||
import springfox.documentation.builders.RequestHandlerSelectors;
|
||||
import springfox.documentation.service.ApiInfo;
|
||||
import springfox.documentation.spi.DocumentationType;
|
||||
import springfox.documentation.spring.web.plugins.Docket;
|
||||
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
|
||||
|
||||
@Configuration
|
||||
@EnableSwagger2WebMvc
|
||||
public class SwaggerConfig {
|
||||
@Bean
|
||||
public Docket webApiConfig() {
|
||||
return new Docket(DocumentationType.SWAGGER_2)
|
||||
.apiInfo(apiInfo())
|
||||
.select()
|
||||
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
|
||||
.paths(PathSelectors.any())
|
||||
.build();
|
||||
}
|
||||
|
||||
private ApiInfo apiInfo() {
|
||||
return new ApiInfoBuilder()
|
||||
.title("对接API")
|
||||
.description("对接相关接口")
|
||||
.version("1.0")
|
||||
.build();
|
||||
}
|
||||
}
|
18
src/main/java/com/yjdsj/common/config/WebConfig.java
Normal file
18
src/main/java/com/yjdsj/common/config/WebConfig.java
Normal file
@ -0,0 +1,18 @@
|
||||
package com.yjdsj.common.config;
|
||||
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.servlet.config.annotation.CorsRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
|
||||
@Configuration
|
||||
public class WebConfig implements WebMvcConfigurer {
|
||||
|
||||
@Override
|
||||
public void addCorsMappings(CorsRegistry registry) {
|
||||
registry.addMapping("/**").allowedOrigins("*") // 允许所有来源
|
||||
.allowedMethods("*") // 允许所有方法(GET, POST, PUT, DELETE 等)
|
||||
.allowedHeaders("*") // 允许所有头
|
||||
.allowCredentials(true) // 允许发送凭证(cookies 等)
|
||||
.maxAge(3600); // 预检请求的缓存时间(单位:秒)
|
||||
}
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package com.yjdsj.common.controller;
|
||||
|
||||
import com.yjdsj.common.map.SourceMap;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@Api(tags = "资源管理")
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/sourceMap")
|
||||
public class SourceMapController {
|
||||
|
||||
@Resource
|
||||
private SourceMap sourceMap;
|
||||
|
||||
// 添加资源映射关系
|
||||
@PostMapping("/add")
|
||||
@ApiOperation(value = "添加资源映射关系")
|
||||
public Object addSourceMapping(@RequestParam String filePath) {
|
||||
return sourceMap.addSourceMapping(filePath);
|
||||
}
|
||||
|
||||
// 移除资源映射关系
|
||||
@DeleteMapping("/remove")
|
||||
@ApiOperation(value = "移除资源映射关系")
|
||||
public void removeSourceMapping(@RequestParam String filePath) {
|
||||
sourceMap.removeSourceMapping(filePath);
|
||||
}
|
||||
}
|
38
src/main/java/com/yjdsj/common/ds/DataSourceConfig.java
Normal file
38
src/main/java/com/yjdsj/common/ds/DataSourceConfig.java
Normal file
@ -0,0 +1,38 @@
|
||||
package com.yjdsj.common.ds;
|
||||
|
||||
import org.apache.ibatis.session.SqlSessionFactory;
|
||||
import org.mybatis.spring.SqlSessionFactoryBean;
|
||||
import org.mybatis.spring.SqlSessionTemplate;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.sql.DataSource;
|
||||
|
||||
@Configuration
|
||||
public class DataSourceConfig {
|
||||
|
||||
@Resource
|
||||
private DynamicDataSourceManager dynamicDataSourceManager;
|
||||
|
||||
@Bean(name = "dynamicDataSource")
|
||||
public DataSource dynamicDataSource() {
|
||||
DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource(dynamicDataSourceManager);
|
||||
return dynamicRoutingDataSource;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public SqlSessionFactory sqlSessionFactory(@Autowired DataSource dynamicDataSource) throws Exception {
|
||||
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
|
||||
sessionFactoryBean.setDataSource(dynamicDataSource);
|
||||
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));
|
||||
return sessionFactoryBean.getObject();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public SqlSessionTemplate sqlSessionTemplate(@Autowired SqlSessionFactory sqlSessionFactory) {
|
||||
return new SqlSessionTemplate(sqlSessionFactory);
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package com.yjdsj.common.ds;
|
||||
|
||||
public class DynamicDataSourceContextHolder {
|
||||
|
||||
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
|
||||
|
||||
public static void setDataSourceKey(String key) {
|
||||
CONTEXT_HOLDER.set(key);
|
||||
}
|
||||
|
||||
public static String getDataSourceKey() {
|
||||
return CONTEXT_HOLDER.get();
|
||||
}
|
||||
|
||||
public static void clearDataSourceKey() {
|
||||
CONTEXT_HOLDER.remove();
|
||||
}
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package com.yjdsj.common.ds;
|
||||
|
||||
import com.yjdsj.common.map.SourceMap;
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class DynamicDataSourceManager {
|
||||
|
||||
private final Map<String, DataSource> dataSourceCache = new HashMap<>();
|
||||
private final SourceMap sourceMap;
|
||||
|
||||
@Autowired
|
||||
public DynamicDataSourceManager(SourceMap sourceMap) {
|
||||
this.sourceMap = sourceMap;
|
||||
}
|
||||
|
||||
public DataSource getDataSource(String dbName) {
|
||||
// 检查缓存中是否已有数据源
|
||||
if (dataSourceCache.containsKey(dbName)) {
|
||||
return dataSourceCache.get(dbName);
|
||||
} else {
|
||||
// 动态创建数据源
|
||||
String dbPath = sourceMap.getSourceMapping(dbName);
|
||||
if (dbPath != null) {
|
||||
DataSource dataSource = createDataSource(dbPath);
|
||||
dataSourceCache.put(dbName, dataSource);
|
||||
return dataSource;
|
||||
} else {
|
||||
throw new IllegalArgumentException("Data source not found for name: " + dbName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private DataSource createDataSource(String dbPath) {
|
||||
HikariDataSource dataSource = new HikariDataSource();
|
||||
dataSource.setJdbcUrl("jdbc:sqlite:" + dbPath);
|
||||
dataSource.setDriverClassName("org.sqlite.JDBC");
|
||||
return dataSource;
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.yjdsj.common.ds;
|
||||
|
||||
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
|
||||
|
||||
private final DynamicDataSourceManager dataSourceManager;
|
||||
|
||||
public DynamicRoutingDataSource(DynamicDataSourceManager dataSourceManager) {
|
||||
this.dataSourceManager = dataSourceManager;
|
||||
this.setTargetDataSources(new HashMap<>());
|
||||
this.afterPropertiesSet();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object determineCurrentLookupKey() {
|
||||
return DynamicDataSourceContextHolder.getDataSourceKey();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected DataSource determineTargetDataSource() {
|
||||
String dataSourceKey = (String) determineCurrentLookupKey();
|
||||
return dataSourceManager.getDataSource(dataSourceKey);
|
||||
}
|
||||
}
|
61
src/main/java/com/yjdsj/common/generator/CodeGenerator.java
Normal file
61
src/main/java/com/yjdsj/common/generator/CodeGenerator.java
Normal file
@ -0,0 +1,61 @@
|
||||
package com.yjdsj.common.generator;
|
||||
|
||||
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
|
||||
import com.baomidou.mybatisplus.generator.config.OutputFile;
|
||||
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
/**
|
||||
*
|
||||
* @date 2024/6/26 14:42
|
||||
*/
|
||||
public class CodeGenerator {
|
||||
|
||||
private static String databasePath = "D:\\DJ\\source\\广西提供poi.poi"; // SQLite 数据库文件路径
|
||||
private static String author = "周志雄";
|
||||
|
||||
public static void main(String[] args) {
|
||||
Generation(databasePath, "tbl_pois"); // 生成指定表的代码,这里以 "users" 表为例
|
||||
}
|
||||
|
||||
public static void Generation(String databasePath, String... tableName) {
|
||||
FastAutoGenerator.create("jdbc:sqlite:" + databasePath, "", "")
|
||||
.globalConfig(builder -> {
|
||||
builder.author(author) // 设置作者名
|
||||
.enableSwagger() // 启用Swagger
|
||||
.outputDir(System.getProperty("user.dir") + "/src/main/java"); // 指定输出目录
|
||||
})
|
||||
.packageConfig(builder -> {
|
||||
builder.entity("domain") // 实体类包名
|
||||
.parent("com.xzjm.poi") // 父包名
|
||||
.controller("controller") // 控制层包名
|
||||
.mapper("mapper") // mapper 层包名
|
||||
.service("service") // service 层包名
|
||||
.serviceImpl("service.impl") // service 实现类包名
|
||||
// 自定义 mapper.xml 文件输出目录
|
||||
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir") + "/src/main/resources/mapper"));
|
||||
})
|
||||
.strategyConfig(builder -> {
|
||||
builder.addInclude(tableName) // 设置要生成的表名
|
||||
.addTablePrefix("t_") // 设置表前缀过滤(如果没有,可以去掉)
|
||||
.entityBuilder()
|
||||
.enableLombok() // 启用 Lombok
|
||||
.naming(NamingStrategy.underline_to_camel) // 表名映射为实体类驼峰命名
|
||||
.columnNaming(NamingStrategy.underline_to_camel) // 字段映射为驼峰命名
|
||||
.mapperBuilder()
|
||||
.enableMapperAnnotation() // 启用 @Mapper 注解
|
||||
.enableBaseResultMap() // 启用 BaseResultMap 生成
|
||||
.enableBaseColumnList() // 启用 BaseColumnList 生成
|
||||
.formatMapperFileName("%sMapper") // 格式化 Mapper 文件名称
|
||||
.formatXmlFileName("%sMapper") // 格式化 XML 文件名称
|
||||
.serviceBuilder()
|
||||
.formatServiceFileName("%sService") // 格式化 Service 接口文件名称
|
||||
.formatServiceImplFileName("%sServiceImpl") // 格式化 Service 实现类文件名称
|
||||
.controllerBuilder()
|
||||
.enableRestStyle() // 启用 Restful 风格
|
||||
.formatFileName("%sController") // 格式化 Controller 文件名称
|
||||
.enableHyphenStyle(); // 启用驼峰转连字符
|
||||
}).execute();
|
||||
}
|
||||
}
|
36
src/main/java/com/yjdsj/common/handler/BlobTypeHandler.java
Normal file
36
src/main/java/com/yjdsj/common/handler/BlobTypeHandler.java
Normal file
@ -0,0 +1,36 @@
|
||||
package com.yjdsj.common.handler;
|
||||
|
||||
import org.apache.ibatis.type.BaseTypeHandler;
|
||||
import org.apache.ibatis.type.JdbcType;
|
||||
|
||||
import java.sql.CallableStatement;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
|
||||
/**
|
||||
*
|
||||
* @date 2024/8/20 11:46
|
||||
*/
|
||||
public class BlobTypeHandler extends BaseTypeHandler<byte[]> {
|
||||
|
||||
@Override
|
||||
public void setNonNullParameter(PreparedStatement ps, int i, byte[] parameter, JdbcType jdbcType) throws SQLException {
|
||||
ps.setBytes(i, parameter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
|
||||
return rs.getBytes(columnName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
|
||||
return rs.getBytes(columnIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
|
||||
return cs.getBytes(columnIndex);
|
||||
}
|
||||
}
|
9
src/main/java/com/yjdsj/common/map/MapDto.java
Normal file
9
src/main/java/com/yjdsj/common/map/MapDto.java
Normal file
@ -0,0 +1,9 @@
|
||||
package com.yjdsj.common.map;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class MapDto {
|
||||
private String filePath;
|
||||
private Integer userId;
|
||||
}
|
91
src/main/java/com/yjdsj/common/map/SourceMap.java
Normal file
91
src/main/java/com/yjdsj/common/map/SourceMap.java
Normal file
@ -0,0 +1,91 @@
|
||||
package com.yjdsj.common.map;
|
||||
|
||||
import com.yjdsj.common.utils.MD5HashUtil;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@Component
|
||||
public class SourceMap {
|
||||
|
||||
private Map<String, String> sourceMap = new ConcurrentHashMap<>();
|
||||
|
||||
// 添加资源映射关系
|
||||
public String addSourceMapping(String filePath) {
|
||||
sourceMap.put(MD5HashUtil.toMD5(filePath), filePath);
|
||||
return MD5HashUtil.toMD5(filePath);
|
||||
}
|
||||
|
||||
// 移除资源映射关系
|
||||
public void removeSourceMapping(String filePath) {
|
||||
sourceMap.remove(MD5HashUtil.toMD5(filePath));
|
||||
}
|
||||
|
||||
// 获取资源映射关系
|
||||
public String getSourceMapping(String mark) {
|
||||
return sourceMap.get(mark);
|
||||
}
|
||||
|
||||
// 获取倾斜模型资源列表
|
||||
public Map<String, String> getCltSourceList() {
|
||||
Map<String, String> sourceList = new HashMap<>();
|
||||
for (Map.Entry<String, String> entry : sourceMap.entrySet()) {
|
||||
String key = entry.getKey();
|
||||
String value = entry.getValue();
|
||||
if (value.endsWith(".clt")) {
|
||||
String fileName = getFileNameWithExtension(value);
|
||||
sourceList.put(key, fileName);
|
||||
}
|
||||
}
|
||||
return sourceList;
|
||||
}
|
||||
|
||||
// 获取图层资源列表
|
||||
public Map<String, String> getMBTilesSourceList() {
|
||||
Map<String, String> sourceList = new HashMap<>();
|
||||
for (Map.Entry<String, String> entry : sourceMap.entrySet()) {
|
||||
String key = entry.getKey();
|
||||
String value = entry.getValue();
|
||||
if (value.endsWith(".mbtiles")) {
|
||||
String fileName = getFileNameWithExtension(value);
|
||||
sourceList.put(key, fileName);
|
||||
}
|
||||
}
|
||||
return sourceList;
|
||||
}
|
||||
|
||||
// 获取地形资源列表
|
||||
public Map<String, String> getPakSourceList() {
|
||||
Map<String, String> sourceList = new HashMap<>();
|
||||
for (Map.Entry<String, String> entry : sourceMap.entrySet()) {
|
||||
String key = entry.getKey();
|
||||
String value = entry.getValue();
|
||||
if (value.endsWith(".pak")) {
|
||||
String fileName = getFileNameWithExtension(value);
|
||||
sourceList.put(key, fileName);
|
||||
}
|
||||
}
|
||||
return sourceList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取文件名和后缀
|
||||
*/
|
||||
public static String getFileNameWithExtension(String filePath) {
|
||||
Path path = Paths.get(filePath); // 获取路径
|
||||
return path.getFileName().toString(); // 返回文件名和后缀
|
||||
}
|
||||
|
||||
/**
|
||||
* 遍历数据并打印内容、无参
|
||||
*/
|
||||
public void printSourceMap() {
|
||||
for (Map.Entry<String, String> entry : sourceMap.entrySet()) {
|
||||
System.out.println("MD5 Key: " + entry.getKey() + ", File Path: " + entry.getValue());
|
||||
}
|
||||
}
|
||||
}
|
27
src/main/java/com/yjdsj/common/map/SourceTypeMap.java
Normal file
27
src/main/java/com/yjdsj/common/map/SourceTypeMap.java
Normal file
@ -0,0 +1,27 @@
|
||||
package com.yjdsj.common.map;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
*
|
||||
* @date 2024/8/20 11:04
|
||||
*/
|
||||
public class SourceTypeMap {
|
||||
/**
|
||||
* 文件类型映射
|
||||
*/
|
||||
private static Map<String, String> SourceType = new HashMap<>();
|
||||
|
||||
/**
|
||||
* 初始化
|
||||
*/
|
||||
static {
|
||||
SourceType.put("clt", "tileset");
|
||||
}
|
||||
|
||||
// 获取资源对应的类型
|
||||
public static String getSourceType(String fileExtension) {
|
||||
return SourceType.get(fileExtension);
|
||||
}
|
||||
}
|
23
src/main/java/com/yjdsj/common/utils/DecompressionUtil.java
Normal file
23
src/main/java/com/yjdsj/common/utils/DecompressionUtil.java
Normal file
@ -0,0 +1,23 @@
|
||||
package com.yjdsj.common.utils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
public class DecompressionUtil {
|
||||
|
||||
/**
|
||||
* 将压缩数据解压并转换为字符串
|
||||
*
|
||||
* @param compressedData
|
||||
* @return
|
||||
*/
|
||||
public static String decompressAndConvertToString(byte[] compressedData) {
|
||||
try {
|
||||
byte[] decompressedData = GzipDecompressorUtil.decompress(compressedData);
|
||||
return new String(decompressedData, StandardCharsets.UTF_8);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return "Failed to decompress data: " + e.getMessage();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package com.yjdsj.common.utils;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
public class GzipDecompressorUtil {
|
||||
|
||||
/**
|
||||
* 解压数据
|
||||
*
|
||||
* @param compressedData
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
public static byte[] decompress(byte[] compressedData) throws IOException {
|
||||
try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(compressedData);
|
||||
GZIPInputStream gzipInputStream = new GZIPInputStream(byteArrayInputStream);
|
||||
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
|
||||
|
||||
byte[] buffer = new byte[1024];
|
||||
int len;
|
||||
while ((len = gzipInputStream.read(buffer)) != -1) {
|
||||
byteArrayOutputStream.write(buffer, 0, len);
|
||||
}
|
||||
return byteArrayOutputStream.toByteArray();
|
||||
}
|
||||
}
|
||||
}
|
7
src/main/java/com/yjdsj/common/utils/JacksonUtil.java
Normal file
7
src/main/java/com/yjdsj/common/utils/JacksonUtil.java
Normal file
@ -0,0 +1,7 @@
|
||||
package com.yjdsj.common.utils;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
public class JacksonUtil {
|
||||
public static final ObjectMapper mapper = new ObjectMapper();
|
||||
}
|
36
src/main/java/com/yjdsj/common/utils/MD5HashUtil.java
Normal file
36
src/main/java/com/yjdsj/common/utils/MD5HashUtil.java
Normal file
@ -0,0 +1,36 @@
|
||||
package com.yjdsj.common.utils;
|
||||
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
|
||||
public class MD5HashUtil {
|
||||
|
||||
/**
|
||||
* 将输入字符串转换为MD5哈希值
|
||||
*
|
||||
* @param input 要转换的字符串
|
||||
* @return 转换后的MD5哈希值
|
||||
*/
|
||||
public static String toMD5(String input) {
|
||||
try {
|
||||
// 获取MD5算法实例
|
||||
MessageDigest md = MessageDigest.getInstance("MD5");
|
||||
|
||||
// 将输入字符串转换为字节数组
|
||||
byte[] messageDigest = md.digest(input.getBytes());
|
||||
|
||||
// 将字节数组转换为十六进制字符串
|
||||
StringBuilder hexString = new StringBuilder();
|
||||
for (byte b : messageDigest) {
|
||||
String hex = Integer.toHexString(0xff & b);
|
||||
if (hex.length() == 1) hexString.append('0');
|
||||
hexString.append(hex);
|
||||
}
|
||||
|
||||
// 返回MD5哈希值
|
||||
return hexString.toString();
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
throw new RuntimeException("MD5算法不存在", e);
|
||||
}
|
||||
}
|
||||
}
|
21
src/main/java/com/yjdsj/common/utils/PakTableName.java
Normal file
21
src/main/java/com/yjdsj/common/utils/PakTableName.java
Normal file
@ -0,0 +1,21 @@
|
||||
package com.yjdsj.common.utils;
|
||||
|
||||
public class PakTableName {
|
||||
/**
|
||||
* 根据坐标动态计算获取表名
|
||||
*
|
||||
* @param z
|
||||
* @param x
|
||||
* @param y
|
||||
* @return
|
||||
*/
|
||||
public static String getTableName(int z, int x, int y) {
|
||||
if (z < 10) {
|
||||
return "blocks";
|
||||
} else {
|
||||
double tx = Math.floorDiv(x, 512);
|
||||
double ty = Math.floorDiv(y, 512);
|
||||
return "blocks_" + Integer.toString(z) + "_" + Integer.toString((int) tx) + "_" + Integer.toString((int) ty);
|
||||
}
|
||||
}
|
||||
}
|
51
src/main/java/com/yjdsj/common/utils/PositionUtil.java
Normal file
51
src/main/java/com/yjdsj/common/utils/PositionUtil.java
Normal file
@ -0,0 +1,51 @@
|
||||
package com.yjdsj.common.utils;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
|
||||
public class PositionUtil {
|
||||
// 定义所需的常量,这些值需要根据实际应用场景设置
|
||||
private static final double a = 6378137.0; // 椭球长半轴
|
||||
private static final double e = 0.0818191908426; // 第一偏心率
|
||||
private static final double epsilon = 1e-8; // 迭代精度
|
||||
private static final double r2d = 180.0 / Math.PI; // 弧度转角度
|
||||
|
||||
/**
|
||||
* 存储 BLH 转换结果的内部类
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public static class BlhResult {
|
||||
public double lon; // 经度
|
||||
public double lat; // 纬度
|
||||
public double alt; // 高度
|
||||
}
|
||||
|
||||
/**
|
||||
* 将XYZ坐标转换为BLH坐标
|
||||
*/
|
||||
public static BlhResult xyz2Blh(double x, double y, double z) {
|
||||
double tmpX = x;
|
||||
double tmpY = y;
|
||||
double tmpZ = z;
|
||||
|
||||
double curB = 0.0;
|
||||
double N = 0.0;
|
||||
double calB = Math.atan2(tmpZ, Math.sqrt(tmpX * tmpX + tmpY * tmpY));
|
||||
|
||||
int counter = 0;
|
||||
while (Math.abs(curB - calB) * r2d > epsilon && counter < 25) {
|
||||
curB = calB;
|
||||
N = a / Math.sqrt(1 - e * e * Math.sin(curB) * Math.sin(curB));
|
||||
calB = Math.atan2(tmpZ + N * e * e * Math.sin(curB),
|
||||
Math.sqrt(tmpX * tmpX + tmpY * tmpY));
|
||||
counter++;
|
||||
}
|
||||
|
||||
double longitude = Math.atan2(tmpY, tmpX) * r2d;
|
||||
double latitude = curB * r2d;
|
||||
double height = tmpZ / Math.sin(curB) - N * (1 - e * e);
|
||||
|
||||
return new BlhResult(longitude, latitude, height);
|
||||
}
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
package com.yjdsj.mbtiles.controller;
|
||||
|
||||
import com.yjdsj.mbtiles.domain.MbtilesTiles;
|
||||
import com.yjdsj.mbtiles.service.MbtilesService;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import io.swagger.annotations.ApiParam;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
|
||||
@Slf4j
|
||||
@RestController
|
||||
@Api(tags = "图层文件相关")
|
||||
@RequestMapping("/data/mbtiles")
|
||||
public class MbtilesController {
|
||||
|
||||
@Resource
|
||||
private MbtilesService mbtilesService;
|
||||
|
||||
@ApiOperation(value = "获取图层资源列表")
|
||||
@GetMapping("/list")
|
||||
public Object list() {
|
||||
return mbtilesService.getMbtilesSourceList();
|
||||
}
|
||||
|
||||
@ApiOperation(value = "获取图层资源的详情")
|
||||
@GetMapping("/detail/{mark}")
|
||||
public Object detail(@PathVariable @ApiParam(value = "资源标识") String mark) {
|
||||
return mbtilesService.detail(mark);
|
||||
}
|
||||
|
||||
@GetMapping("/{mark}/{z}/{x}/{y}.{format}")
|
||||
public ResponseEntity getData(
|
||||
@PathVariable @ApiParam(value = "资源标识") String mark,
|
||||
@PathVariable("z") int z,
|
||||
@PathVariable("x") int x,
|
||||
@PathVariable("y") int y,
|
||||
@PathVariable("format") String format) {
|
||||
|
||||
MbtilesTiles mbtilesTiles = mbtilesService.getTileData(mark, z, x, y);
|
||||
if (mbtilesTiles == null) {
|
||||
return ResponseEntity.notFound().build();
|
||||
}
|
||||
|
||||
// 获取响应媒体类型
|
||||
String contentType = mbtilesService.getContentTypeByFormat(format);
|
||||
return ResponseEntity.ok()
|
||||
.contentType(MediaType.parseMediaType(contentType))
|
||||
.body(mbtilesTiles.getTileData());
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package com.yjdsj.mbtiles.domain;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class MbtilesMetaData {
|
||||
private String name;
|
||||
private String value;
|
||||
}
|
12
src/main/java/com/yjdsj/mbtiles/domain/MbtilesTiles.java
Normal file
12
src/main/java/com/yjdsj/mbtiles/domain/MbtilesTiles.java
Normal file
@ -0,0 +1,12 @@
|
||||
package com.yjdsj.mbtiles.domain;
|
||||
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class MbtilesTiles {
|
||||
private String zoomLevel;
|
||||
private String tileColumn;
|
||||
private String tileRow;
|
||||
private byte[] tileData;
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package com.yjdsj.mbtiles.mapper;
|
||||
|
||||
import com.yjdsj.mbtiles.domain.MbtilesMetaData;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mapper
|
||||
public interface MbtilesMetaDataMapper {
|
||||
List<MbtilesMetaData> selectList();
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package com.yjdsj.mbtiles.mapper;
|
||||
|
||||
import com.yjdsj.mbtiles.domain.MbtilesTiles;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
@Mapper
|
||||
public interface MbtilesTilesMapper {
|
||||
MbtilesTiles selectByCondition(@Param("z") int z, @Param("x") int x, @Param("y") int y);
|
||||
|
||||
int selectByZoomLevel(@Param("zoomLevel") int zoomLevel);
|
||||
}
|
132
src/main/java/com/yjdsj/mbtiles/service/MbtilesService.java
Normal file
132
src/main/java/com/yjdsj/mbtiles/service/MbtilesService.java
Normal file
@ -0,0 +1,132 @@
|
||||
package com.yjdsj.mbtiles.service;
|
||||
|
||||
import com.yjdsj.common.ds.DynamicDataSourceContextHolder;
|
||||
import com.yjdsj.common.map.SourceMap;
|
||||
import com.yjdsj.mbtiles.domain.MbtilesMetaData;
|
||||
import com.yjdsj.mbtiles.domain.MbtilesTiles;
|
||||
import com.yjdsj.mbtiles.mapper.MbtilesMetaDataMapper;
|
||||
import com.yjdsj.mbtiles.mapper.MbtilesTilesMapper;
|
||||
import com.yjdsj.mbtiles.vo.MbtilesIndexVo;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class MbtilesService {
|
||||
|
||||
@Resource
|
||||
private MbtilesMetaDataMapper mbtilesMetaDataMapper;
|
||||
@Resource
|
||||
private MbtilesTilesMapper mbtilesTilesMapper;
|
||||
@Resource
|
||||
private SourceMap sourceMap;
|
||||
|
||||
|
||||
/**
|
||||
* 获取图层资源列表
|
||||
*/
|
||||
public Map<String, String> getMbtilesSourceList() {
|
||||
return sourceMap.getMBTilesSourceList();
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建图层资源索引信息
|
||||
*/
|
||||
public MbtilesIndexVo detail(String mark) {
|
||||
String XYZ = "xyz";
|
||||
String WEBMERCATORTILINGSCHEME = "WebMercatorTilingScheme";
|
||||
String GEOGRAPHICTILINGSCHEME = "GeographicTilingScheme";
|
||||
|
||||
MbtilesIndexVo mbtilesIndexVo = new MbtilesIndexVo();
|
||||
DynamicDataSourceContextHolder.setDataSourceKey(mark);
|
||||
try {
|
||||
// 获取元数据并转换为Map
|
||||
List<MbtilesMetaData> mbtilesMetaDataList = mbtilesMetaDataMapper.selectList();
|
||||
Map<String, String> metaDataMap = new HashMap<>(mbtilesMetaDataList.size());
|
||||
for (MbtilesMetaData meta : mbtilesMetaDataList) {
|
||||
metaDataMap.put(meta.getName(), meta.getValue());
|
||||
}
|
||||
|
||||
// 处理边界信息
|
||||
String[] boundsArray = metaDataMap.get("bounds").split(",");
|
||||
|
||||
// 处理缩放级别
|
||||
Map<Integer, Integer> zoomLevelCounts = new HashMap<>(31);
|
||||
for (int i = 0; i <= 30; i++) {
|
||||
zoomLevelCounts.put(i, mbtilesTilesMapper.selectByZoomLevel(i));
|
||||
}
|
||||
|
||||
// 计算最大最小 zoomLevel
|
||||
int minZoomLevel = zoomLevelCounts.entrySet().stream()
|
||||
.filter(entry -> entry.getValue() > 0)
|
||||
.map(Map.Entry::getKey)
|
||||
.min(Integer::compare)
|
||||
.orElse(Integer.MAX_VALUE);
|
||||
int maxZoomLevel = zoomLevelCounts.entrySet().stream()
|
||||
.filter(entry -> entry.getValue() > 0)
|
||||
.map(Map.Entry::getKey)
|
||||
.max(Integer::compare)
|
||||
.orElse(Integer.MIN_VALUE);
|
||||
|
||||
// 构建URL
|
||||
String format = metaDataMap.getOrDefault("format", "png");
|
||||
String url = String.format("/data/mbtiles/%s/{z}/{x}/{y}.%s", mark, format);
|
||||
|
||||
// 设置返回对象属性
|
||||
mbtilesIndexVo.setUrl(url);
|
||||
mbtilesIndexVo.setMinZoom(minZoomLevel);
|
||||
mbtilesIndexVo.setMaxZoom(maxZoomLevel);
|
||||
mbtilesIndexVo.setWest(boundsArray[0]);
|
||||
mbtilesIndexVo.setSouth(boundsArray[1]);
|
||||
mbtilesIndexVo.setEast(boundsArray[2]);
|
||||
mbtilesIndexVo.setNorth(boundsArray[3]);
|
||||
|
||||
// 处理加载方式
|
||||
mbtilesIndexVo.setLoadMethod(metaDataMap.getOrDefault("load_method", XYZ));
|
||||
// 处理投影名称(优先级: profile 包含 longlat > schema_name > 默认)
|
||||
String schemaName = metaDataMap.getOrDefault("schema_name", WEBMERCATORTILINGSCHEME);
|
||||
if (metaDataMap.containsKey("profile") && metaDataMap.get("profile").contains("+proj=longlat")) {
|
||||
schemaName = GEOGRAPHICTILINGSCHEME;
|
||||
}
|
||||
mbtilesIndexVo.setSchemaName(schemaName);
|
||||
mbtilesIndexVo.setFileType("layer");
|
||||
return mbtilesIndexVo;
|
||||
} finally {
|
||||
DynamicDataSourceContextHolder.clearDataSourceKey();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取瓦片数据
|
||||
*/
|
||||
public MbtilesTiles getTileData(String mark, int z, int x, int y) {
|
||||
// 坐标翻转
|
||||
int flippedY = (int) (Math.pow(2, z) - 1 - y);
|
||||
// 获取数据源
|
||||
DynamicDataSourceContextHolder.setDataSourceKey(mark);
|
||||
try {
|
||||
return mbtilesTilesMapper.selectByCondition(z, x, flippedY);
|
||||
} finally {
|
||||
DynamicDataSourceContextHolder.clearDataSourceKey();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据格式获取对应的媒体类型
|
||||
*/
|
||||
public String getContentTypeByFormat(String format) {
|
||||
if ("png".equals(format)) {
|
||||
return "image/png";
|
||||
} else if ("jpg".equals(format) || "jpeg".equals(format)) {
|
||||
return "image/jpeg";
|
||||
} else {
|
||||
return "application/octet-stream";
|
||||
}
|
||||
}
|
||||
}
|
19
src/main/java/com/yjdsj/mbtiles/vo/MbtilesIndexVo.java
Normal file
19
src/main/java/com/yjdsj/mbtiles/vo/MbtilesIndexVo.java
Normal file
@ -0,0 +1,19 @@
|
||||
package com.yjdsj.mbtiles.vo;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class MbtilesIndexVo {
|
||||
private String url;
|
||||
private Integer minZoom;
|
||||
private Integer maxZoom;
|
||||
private String west;
|
||||
private String south;
|
||||
private String east;
|
||||
private String north;
|
||||
private String loadMethod;
|
||||
private String schemaName;
|
||||
private String fileType;
|
||||
}
|
73
src/main/java/com/yjdsj/pak/controller/PakController.java
Normal file
73
src/main/java/com/yjdsj/pak/controller/PakController.java
Normal file
@ -0,0 +1,73 @@
|
||||
package com.yjdsj.pak.controller;
|
||||
|
||||
|
||||
import com.yjdsj.pak.service.PakService;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import io.swagger.annotations.ApiParam;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.IOException;
|
||||
|
||||
@Slf4j
|
||||
@RestController
|
||||
@Api(tags = "地形资源相关")
|
||||
@RequestMapping("/data/pak")
|
||||
public class PakController {
|
||||
@Resource
|
||||
private PakService pakService;
|
||||
|
||||
@ApiOperation(value = "获取地形资源列表")
|
||||
@GetMapping("/list")
|
||||
public Object list() {
|
||||
return pakService.getPakSourceList();
|
||||
}
|
||||
|
||||
@ApiOperation(value = "获取地形资源的详情")
|
||||
@GetMapping("/detail/{mark}")
|
||||
public Object cltIndex(@PathVariable @ApiParam(value = "资源标识") String mark) {
|
||||
return pakService.buildPakIndex(mark);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "获取JSON数据")
|
||||
@GetMapping("/{mark}/layer.json")
|
||||
public ResponseEntity jsonBySourceIdAndParam(@PathVariable("mark") @ApiParam(value = "资源标识") String mark) {
|
||||
String layerJson = pakService.getCachedLayerJson(mark);
|
||||
return layerJson != null ? ResponseEntity.ok(layerJson) : ResponseEntity.notFound().build();
|
||||
}
|
||||
|
||||
@ApiOperation(value = "获取地形瓦片数据")
|
||||
@GetMapping("/{mark}/{z}/{x}/{y}.{suffix}")
|
||||
public ResponseEntity<?> data(
|
||||
@PathVariable("mark") @ApiParam(value = "资源标识") String mark,
|
||||
@PathVariable("z") @ApiParam(value = "缩放级别") int z,
|
||||
@PathVariable("x") @ApiParam(value = "X轴坐标") int x,
|
||||
@PathVariable("y") @ApiParam(value = "Y轴坐标") int y,
|
||||
@PathVariable("suffix") @ApiParam(value = "文件后缀") String suffix) {
|
||||
|
||||
try {
|
||||
// 调用 Service 获取处理后的瓦片数据
|
||||
byte[] tileData = pakService.getTileData(mark, z, x, y);
|
||||
if (tileData == null) {
|
||||
return ResponseEntity.notFound().build();
|
||||
}
|
||||
|
||||
// 根据文件后缀设置正确的Content-Type
|
||||
MediaType mediaType = "png".equalsIgnoreCase(suffix) ?
|
||||
MediaType.IMAGE_PNG : MediaType.IMAGE_JPEG;
|
||||
|
||||
return ResponseEntity.ok()
|
||||
.contentType(mediaType)
|
||||
.body(tileData);
|
||||
} catch (IOException e) {
|
||||
return ResponseEntity.status(500).body("瓦片数据处理失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
11
src/main/java/com/yjdsj/pak/domain/PakBlocks.java
Normal file
11
src/main/java/com/yjdsj/pak/domain/PakBlocks.java
Normal file
@ -0,0 +1,11 @@
|
||||
package com.yjdsj.pak.domain;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class PakBlocks {
|
||||
private String z;
|
||||
private String x;
|
||||
private String y;
|
||||
private byte[] tile;
|
||||
}
|
22
src/main/java/com/yjdsj/pak/domain/PakInfos.java
Normal file
22
src/main/java/com/yjdsj/pak/domain/PakInfos.java
Normal file
@ -0,0 +1,22 @@
|
||||
package com.yjdsj.pak.domain;
|
||||
|
||||
import lombok.Data;
|
||||
@Data
|
||||
public class PakInfos {
|
||||
private String minX;
|
||||
private String minY;
|
||||
private String maxX;
|
||||
private String maxY;
|
||||
private String minLevel;
|
||||
private String maxLevel;
|
||||
private String source;
|
||||
private String type;
|
||||
private String tiletrans;
|
||||
private String zip;
|
||||
private String curLevel;
|
||||
private String curX;
|
||||
private String curY;
|
||||
private byte[] layerJson;
|
||||
private String contentType;
|
||||
private Integer proj;
|
||||
}
|
9
src/main/java/com/yjdsj/pak/mapper/PakBlocksMapper.java
Normal file
9
src/main/java/com/yjdsj/pak/mapper/PakBlocksMapper.java
Normal file
@ -0,0 +1,9 @@
|
||||
package com.yjdsj.pak.mapper;
|
||||
|
||||
import com.yjdsj.pak.domain.PakBlocks;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface PakBlocksMapper {
|
||||
PakBlocks selectByCondition(String tableName, int z, int x, int y);
|
||||
}
|
9
src/main/java/com/yjdsj/pak/mapper/PakInfosMapper.java
Normal file
9
src/main/java/com/yjdsj/pak/mapper/PakInfosMapper.java
Normal file
@ -0,0 +1,9 @@
|
||||
package com.yjdsj.pak.mapper;
|
||||
|
||||
import com.yjdsj.pak.domain.PakInfos;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface PakInfosMapper {
|
||||
PakInfos selectInfo();
|
||||
}
|
134
src/main/java/com/yjdsj/pak/service/PakService.java
Normal file
134
src/main/java/com/yjdsj/pak/service/PakService.java
Normal file
@ -0,0 +1,134 @@
|
||||
package com.yjdsj.pak.service;
|
||||
|
||||
import com.yjdsj.common.ds.DynamicDataSourceContextHolder;
|
||||
import com.yjdsj.common.map.SourceMap;
|
||||
import com.yjdsj.common.utils.GzipDecompressorUtil;
|
||||
import com.yjdsj.common.utils.PakTableName;
|
||||
import com.yjdsj.pak.domain.PakBlocks;
|
||||
import com.yjdsj.pak.domain.PakInfos;
|
||||
import com.yjdsj.pak.mapper.PakBlocksMapper;
|
||||
import com.yjdsj.pak.mapper.PakInfosMapper;
|
||||
import com.yjdsj.pak.vo.PakIndexVo;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class PakService {
|
||||
@Resource
|
||||
private SourceMap sourceMap;
|
||||
@Resource
|
||||
private PakInfosMapper pakInfosMapper;
|
||||
@Resource
|
||||
private PakBlocksMapper pakBlocksMapper;
|
||||
|
||||
// 资源压缩状态缓存
|
||||
private final Map<String, Boolean> isZipCache = new HashMap<>();
|
||||
// JSON数据缓存
|
||||
private final Map<String, String> jsonCache = new HashMap<>();
|
||||
|
||||
/**
|
||||
* 获取地形资源列表
|
||||
*/
|
||||
public Map<String, String> getPakSourceList() {
|
||||
return sourceMap.getPakSourceList();
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建地形资源索引信息(含URL、元数据)并更新缓存
|
||||
*/
|
||||
public PakIndexVo buildPakIndex(String mark) {
|
||||
final String XYZ = "xyz";
|
||||
final String TMS = "tms";
|
||||
final String TERRAIN_TYPE = "terrain";
|
||||
final String WEBMERCATORTILINGSCHEME = "WebMercatorTilingScheme";
|
||||
final String GEOGRAPHICTILINGSCHEME = "GeographicTilingScheme";
|
||||
final int PROJ_4326 = 4326;
|
||||
|
||||
DynamicDataSourceContextHolder.setDataSourceKey(mark);
|
||||
try {
|
||||
// 查询资源元数据并校验
|
||||
PakInfos pakInfos = pakInfosMapper.selectInfo();
|
||||
if (pakInfos == null) {
|
||||
return null;
|
||||
}
|
||||
// 复制属性并初始化VO
|
||||
PakIndexVo pakIndexVo = new PakIndexVo();
|
||||
BeanUtils.copyProperties(pakInfos, pakIndexVo);
|
||||
// 设置地理坐标范围
|
||||
pakIndexVo.setWest(pakInfos.getMinX());
|
||||
pakIndexVo.setSouth(pakInfos.getMinY());
|
||||
pakIndexVo.setEast(pakInfos.getMaxX());
|
||||
pakIndexVo.setNorth(pakInfos.getMaxY());
|
||||
// 设置加载方式
|
||||
String tiletrans = pakInfos.getTiletrans();
|
||||
pakIndexVo.setLoadMethod(TMS.equals(tiletrans) ? TMS : XYZ);
|
||||
// 优化投影名称设置
|
||||
pakIndexVo.setSchemaName(WEBMERCATORTILINGSCHEME);
|
||||
Integer proj = pakInfos.getProj();
|
||||
if (proj != null && proj == PROJ_4326) {
|
||||
pakIndexVo.setSchemaName(GEOGRAPHICTILINGSCHEME);
|
||||
}
|
||||
// 构建资源访问URL
|
||||
String baseUrl = String.format("/data/pak/%s", mark);
|
||||
if (TERRAIN_TYPE.equals(pakInfos.getType())) {
|
||||
pakIndexVo.setUrl(baseUrl);
|
||||
pakIndexVo.setFileType("terrain");
|
||||
} else {
|
||||
// 安全处理 contentType 解析
|
||||
String contentType = pakInfos.getContentType();
|
||||
String suffix = "unknown";
|
||||
if (contentType != null && contentType.contains("/")) {
|
||||
String[] typeParts = contentType.split("/");
|
||||
if (typeParts.length > 1) {
|
||||
suffix = typeParts[1];
|
||||
}
|
||||
}
|
||||
pakIndexVo.setUrl(baseUrl + "/{z}/{x}/{y}." + suffix);
|
||||
pakIndexVo.setFileType("layer");
|
||||
}
|
||||
// 缓存更新
|
||||
String zipFlag = pakInfos.getZip();
|
||||
isZipCache.put(mark, zipFlag != null && Integer.parseInt(zipFlag) > 0);
|
||||
jsonCache.put(mark, new String(pakInfos.getLayerJson() != null ? pakInfos.getLayerJson() : new byte[0]));
|
||||
return pakIndexVo;
|
||||
} finally {
|
||||
// 确保数据源清理
|
||||
DynamicDataSourceContextHolder.clearDataSourceKey();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取缓存的 layer.json 数据
|
||||
*/
|
||||
public String getCachedLayerJson(String mark) {
|
||||
return jsonCache.get(mark);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据坐标获取瓦片数据(含压缩处理)
|
||||
*/
|
||||
public byte[] getTileData(String mark, int z, int x, int y) throws IOException {
|
||||
DynamicDataSourceContextHolder.setDataSourceKey(mark);
|
||||
try {
|
||||
// 确定目标表名(通过工具类计算)
|
||||
String tableName = PakTableName.getTableName(z, x, y);
|
||||
// 查询瓦片数据
|
||||
PakBlocks pakBlocks = pakBlocksMapper.selectByCondition(tableName, z, x, y);
|
||||
if (pakBlocks == null) {
|
||||
return null;
|
||||
}
|
||||
// 处理压缩数据(根据缓存的压缩状态)
|
||||
Boolean isZip = isZipCache.getOrDefault(mark, false);
|
||||
return isZip ? GzipDecompressorUtil.decompress(pakBlocks.getTile()) : pakBlocks.getTile();
|
||||
} finally {
|
||||
DynamicDataSourceContextHolder.clearDataSourceKey();
|
||||
}
|
||||
}
|
||||
}
|
19
src/main/java/com/yjdsj/pak/vo/PakIndexVo.java
Normal file
19
src/main/java/com/yjdsj/pak/vo/PakIndexVo.java
Normal file
@ -0,0 +1,19 @@
|
||||
package com.yjdsj.pak.vo;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class PakIndexVo {
|
||||
private String west;
|
||||
private String south;
|
||||
private String east;
|
||||
private String north;
|
||||
private String minLevel;
|
||||
private String maxLevel;
|
||||
private String url;
|
||||
private String type;
|
||||
private String loadMethod;
|
||||
private String schemaName;
|
||||
private String fileType;
|
||||
}
|
3
src/main/resources/application.yml
Normal file
3
src/main/resources/application.yml
Normal file
@ -0,0 +1,3 @@
|
||||
server:
|
||||
host: 127.0.0.1
|
||||
port: 8080
|
8
src/main/resources/mapper/CltInfosMapper.xml
Normal file
8
src/main/resources/mapper/CltInfosMapper.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yjdsj.clt.mapper.CltInfosMapper">
|
||||
|
||||
<select id="selectParams" resultType="java.lang.String">
|
||||
select params from infos limit 1
|
||||
</select>
|
||||
</mapper>
|
17
src/main/resources/mapper/CltTilesMapper.xml
Normal file
17
src/main/resources/mapper/CltTilesMapper.xml
Normal file
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yjdsj.clt.mapper.CltTilesMapper">
|
||||
|
||||
<resultMap id="CltTilesResultMap" type="com.yjdsj.clt.domain.CltTiles">
|
||||
<result property="md5" column="md5"/>
|
||||
<result property="path" column="path"/>
|
||||
<result property="tile" column="tile" typeHandler="com.yjdsj.common.handler.BlobTypeHandler"/>
|
||||
<result property="type" column="type"/>
|
||||
</resultMap>
|
||||
|
||||
<select id="selectTileByMd5" resultMap="CltTilesResultMap">
|
||||
select *
|
||||
from tiles
|
||||
where md5 = #{md5}
|
||||
</select>
|
||||
</mapper>
|
14
src/main/resources/mapper/MbtilesMetaDataMapper.xml
Normal file
14
src/main/resources/mapper/MbtilesMetaDataMapper.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yjdsj.mbtiles.mapper.MbtilesMetaDataMapper">
|
||||
|
||||
<select id="selectParams" resultType="java.lang.String">
|
||||
select params from infos limit 1
|
||||
</select>
|
||||
|
||||
<!-- 查询元数据列表 -->
|
||||
<select id="selectList" resultType="com.yjdsj.mbtiles.domain.MbtilesMetaData">
|
||||
select *
|
||||
from metadata
|
||||
</select>
|
||||
</mapper>
|
25
src/main/resources/mapper/MbtilesTilesMapper.xml
Normal file
25
src/main/resources/mapper/MbtilesTilesMapper.xml
Normal file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yjdsj.mbtiles.mapper.MbtilesTilesMapper">
|
||||
|
||||
<resultMap id="BaseResultMap" type="com.yjdsj.mbtiles.domain.MbtilesTiles">
|
||||
<result property="zoomLevel" column="zoom_level"/>
|
||||
<result property="tileColumn" column="tile_column"/>
|
||||
<result property="tileRow" column="tile_row"/>
|
||||
<result property="tileData" column="tile_data" typeHandler="com.yjdsj.common.handler.BlobTypeHandler"/>
|
||||
</resultMap>
|
||||
|
||||
<select id="selectByZoomLevel" resultType="java.lang.Integer">
|
||||
select count(*)
|
||||
from tiles
|
||||
where zoom_level = #{zoomLevel} limit 1
|
||||
</select>
|
||||
|
||||
<select id="selectByCondition" resultMap="BaseResultMap">
|
||||
select *
|
||||
from tiles
|
||||
where zoom_level = #{z}
|
||||
and tile_column = #{x}
|
||||
and tile_row = #{y}
|
||||
</select>
|
||||
</mapper>
|
19
src/main/resources/mapper/PakBlocksMapper.xml
Normal file
19
src/main/resources/mapper/PakBlocksMapper.xml
Normal file
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yjdsj.pak.mapper.PakBlocksMapper">
|
||||
|
||||
<resultMap id="BaseResultMap" type="com.yjdsj.pak.domain.PakBlocks">
|
||||
<id column="z" jdbcType="INTEGER" property="z"/>
|
||||
<id column="x" jdbcType="INTEGER" property="x"/>
|
||||
<id column="y" jdbcType="INTEGER" property="y"/>
|
||||
<result property="tile" column="tile" typeHandler="com.yjdsj.common.handler.BlobTypeHandler"/>
|
||||
</resultMap>
|
||||
|
||||
<select id="selectByCondition" resultMap="BaseResultMap">
|
||||
SELECT *
|
||||
FROM ${tableName}
|
||||
WHERE z = #{z}
|
||||
AND x = #{x}
|
||||
AND y = #{y}
|
||||
</select>
|
||||
</mapper>
|
29
src/main/resources/mapper/PakInfosMapper.xml
Normal file
29
src/main/resources/mapper/PakInfosMapper.xml
Normal file
@ -0,0 +1,29 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yjdsj.pak.mapper.PakInfosMapper">
|
||||
|
||||
<resultMap id="BaseResultMap" type="com.yjdsj.pak.domain.PakInfos">
|
||||
<result column="minx" property="minX"/>
|
||||
<result column="miny" property="minY"/>
|
||||
<result column="maxx" property="maxX"/>
|
||||
<result column="maxy" property="maxY"/>
|
||||
<result column="minlevel" property="minLevel"/>
|
||||
<result column="maxlevel" property="maxLevel"/>
|
||||
<result column="source" property="source"/>
|
||||
<result column="type" property="type"/>
|
||||
<result column="tiletrans" property="tiletrans"/>
|
||||
<result column="zip" property="zip"/>
|
||||
<result column="cur_level" property="curLevel"/>
|
||||
<result column="cur_x" property="curX"/>
|
||||
<result column="cur_y" property="curY"/>
|
||||
<result column="layerjson" property="layerJson"/>
|
||||
<result column="contenttype" property="contentType"/>
|
||||
</resultMap>
|
||||
|
||||
<select id="selectInfo" resultMap="BaseResultMap">
|
||||
select *
|
||||
from infos;
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
Reference in New Issue
Block a user