生活随笔
收集整理的这篇文章主要介绍了
【JAVAFX 构建中国地图2021最新版】
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
【JAVAFX 构建中国地图2021最新版】
-
一直在想中国地图如何能够在界面中实现,查找资料后发现地图的轮廓原来是一堆节点构成.于是中国地图它来了.
-
中国地图数据来源:http://datav.aliyun.com/tools/atlas/index.html
-
版本:V3
-
地图数据版本数据更新于2021.5
-
地图构建效果:
-
版本1.0
package com.liangchao.modelcenter.uisystem.controller.tool;import com.fasterxml.jackson.databind.ObjectMapper;
import com.liangchao.modelcenter.uisystem.frame.App;
import com.liangchao.modelcenter.utils.ColorUtil;
import com.liangchao.modelcenter.utils.FileUtil;
import com.liangchao.modelcenter.utils.javafx.MouseMove;
import com.liangchao.modelcenter.utils.javafx.SupperController;
import de.felixroske.jfxsupport.FXMLController;
import javafx.fxml.FXML
;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.paint.Color;
import javafx.scene.shape.Polygon;
import lombok.*;
import org.springframework.beans.factory.annotation.Autowired;import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
@FXMLController
public class ChineseMapUIController extends SupperController {@FXMLprivate Label name
;@FXMLprivate Label code
;@FXMLprivate Label level
;@FXMLprivate VBox infoBox
;@FXMLprivate AnchorPane canvas
;@Autowiredprivate ObjectMapper objectMapper
;private MediaPlayer mediaPlayer
;private static boolean play
= false;private List<Polygon> polygonList
;private Polygon thisPolygon
;private static final String SELECT_POLYGON
= "select-polygon";@Overridepublic void closeHandle() {if (mediaPlayer
!= null) {mediaPlayer
.stop();mediaPlayer
= null;}play
= false;}@Overridepublic void openHandle(Object... param
) {try {this.drawChineseMap();} catch (Exception e
) {e
.printStackTrace();}infoBox
.setLayoutX(10);infoBox
.setLayoutY(10);new MouseMove(infoBox
).bind();this.name
.setText("");this.code
.setText("");this.level
.setText("");}private void drawChineseMap() throws Exception {Map map
;List list
, list1
, list2
;polygonList
= new LinkedList<>();double scale
= 12, w
= App.controller().getWinWidth() / 2, w0
= 550, h
= App.controller().getWinHeight() / 2;h
= 670;for (Object object
: loadMap()) {map
= (Map) ((Map) object
).get("properties");list
= (List) ((Map) ((Map) object
).get("geometry")).get("coordinates");for (Object root
: list
) {Polygon polygon
= new Polygon();polygonList
.add(polygon
);Entity entity
= new Entity();entity
.setPolygon(polygon
);entity
.setName(map
.get("name").toString());entity
.setAdcode(map
.get("adcode").toString());list2
= (List) map
.get("center");if (list2
!= null) {entity
.setCenterX((Double) list2
.get(0));entity
.setCenterY((Double) list2
.get(1));}list2
= (List) map
.get("centroid");if (list2
!= null) {entity
.setCentroidX((Double) list2
.get(0));entity
.setCentroidY((Double) list2
.get(1));}entity
.setChildrenNum((Integer) map
.get("childrenNum"));entity
.setLevel(map
.get("level") != null ? map
.get("level").toString() : null);entity
.setParentCode(map
.get("parent") != null ? (Integer) ((Map) map
.get("parent")).get("adcode") : null);entity
.setSubFeatureIndex((Integer) map
.get("subFeatureIndex"));list2
= (List) map
.get("acroutes");if (list2
!= null) {entity
.setAcroutes((Integer) list2
.get(0));}polygon
.getStyleClass().add("polygon");polygon
.setFill(Color.web(ColorUtil.toHex(), 0.95));polygon
.setOnMouseClicked(event
-> {this.name
.setText(entity
.getName());this.code
.setText(entity
.getAdcode());this.level
.setText(this.convertLevel(entity
.getLevel()));});list1
= (List) root
;list
= (List) list1
.get(0);if (entity
.getName().equals("内蒙古自治区")) {list
= list1
;}int i
= 0;for (Object ls
: list
) {if (ls
instanceof ArrayList) {int j
= 0;for (Object val
: (List) ls
) {polygon
.getPoints().add(j
% 2 != 0 ? h
- (Double) val
* scale
: (Double) val
* scale
- w0
);j
++;}} else {System.out
.println(ls
.getClass().getName() + " other ");}i
++;}canvas
.getChildren().add(polygon
);}}}public List loadMap() throws Exception {String file
= this.getClass().getResource("/chinese_full.json").getFile();return (List) objectMapper
.readValue(FileUtil.file(file
), Map.class).get("features");}private String convertLevel(String level
) {String v
= null;if (level
== null) {return v
;}switch (level
) {case "country":v
= "国家";break;case "province":v
= "省份";break;case "city":v
= "市";break;case "district":v
= "区县";break;case "street":v
= "街道";break;}return v
;}public void playMusicAction(MouseEvent event
) {if (play
) {mediaPlayer
.stop();play
= false;return;}Media media2
= new Media(this.getClass().getResource("/audio/chinese.mp3").toString());mediaPlayer
= new MediaPlayer(media2
);mediaPlayer
.setAudioSpectrumListener((timestamp
, duration
, magnitudes
, phases
) -> {});mediaPlayer
.onStoppedProperty().addListener((observable
, oldValue
, newValue
) -> {play
= false;});play
= true;mediaPlayer
.play();}@Setter@Getter@ToString@NoArgsConstructor@AllArgsConstructorpublic class Entity {private String name
;private String adcode
;private Double centerX
;private Double centerY
;private Double centroidX
;private Double centroidY
;private Integer childrenNum
; private String level
;private Integer parentCode
; private Integer subFeatureIndex
;private Integer acroutes
;private Polygon polygon
;}
}
总结
以上是生活随笔为你收集整理的【JAVAFX 构建中国地图2021最新版】的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。