生活随笔
收集整理的這篇文章主要介紹了
【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最新版】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。