日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【JAVAFX 构建中国地图2021最新版】

發(fā)布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【JAVAFX 构建中国地图2021最新版】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【JAVAFX 構(gòu)建中國地圖2021最新版】

  • 一直在想中國地圖如何能夠在界面中實現(xiàn),查找資料后發(fā)現(xiàn)地圖的輪廓原來是一堆節(jié)點構(gòu)成.于是中國地圖它來了.

  • 中國地圖數(shù)據(jù)來源:http://datav.aliyun.com/tools/atlas/index.html

  • 版本:V3

  • 地圖數(shù)據(jù)版本數(shù)據(jù)更新于2021.5

  • 地圖構(gòu)建效果:

  • 版本1.0

  • 版本2.0

  • 中國地圖數(shù)據(jù)繪制實現(xiàn)
    地圖數(shù)據(jù)默認繪制的節(jié)點是反向的,需要修正處理,同時內(nèi)蒙古自治區(qū)的數(shù)據(jù)和其他省份的數(shù)據(jù)在構(gòu)建格式上有不同.如有其他問題可以留言交流.

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) {// 輪廓節(jié)點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);// 內(nèi)蒙古自治區(qū) 數(shù)據(jù)在上一級list中 比較特殊if (entity.getName().equals("內(nèi)蒙古自治區(qū)")) {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 {// https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json// http://datav.aliyun.com/tools/atlas/index.html//// 數(shù)據(jù)來源于高德開放平臺,數(shù)據(jù)更新于2020.4String file = this.getClass().getResource("/chinese_full.json").getFile();// 獲取第一級數(shù)據(jù)return (List) objectMapper.readValue(FileUtil.file(file), Map.class).get("features");}/*** level 轉(zhuǎn)換*/private String convertLevel(String level) {// country:國家// province:省份(直轄市會在province和city顯示)// city:市(直轄市會在province和city顯示)// district:區(qū)縣// street:街道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 = "區(qū)縣";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();}/*** 節(jié)點數(shù)據(jù)信息*/@Setter@Getter@ToString@NoArgsConstructor@AllArgsConstructorpublic class Entity {private String name;//名稱private String adcode;//編碼private Double centerX;//中心Xprivate Double centerY;//中心yprivate Double centroidX;//面心 xprivate Double centroidY;//面心 yprivate Integer childrenNum; //子節(jié)點數(shù)量private String level;//級別private Integer parentCode; //父編碼private Integer subFeatureIndex;//子功能索引private Integer acroutes;private Polygon polygon;//節(jié)點} }
  • 如有問題留言交流.

總結(jié)

以上是生活随笔為你收集整理的【JAVAFX 构建中国地图2021最新版】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。