Advertisement
TildePD

Master MapCanvas

Apr 25th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.33 KB | None | 0 0
  1. package bfst19.osmdrawing;
  2.  
  3. import javafx.geometry.Point2D;
  4. import javafx.geometry.VPos;
  5. import javafx.scene.canvas.Canvas;
  6. import javafx.scene.canvas.GraphicsContext;
  7. import javafx.scene.image.Image;
  8. import javafx.scene.paint.Color;
  9. import javafx.scene.shape.FillRule;
  10. import javafx.scene.shape.StrokeLineCap;
  11. import javafx.scene.text.TextAlignment;
  12. import javafx.scene.transform.Affine;
  13. import javafx.scene.transform.NonInvertibleTransformException;
  14. import java.util.Objects;
  15.  
  16.  
  17. public class MapCanvas extends Canvas {
  18. public boolean supermarketShow = false;
  19. public boolean kiosksShow = false;
  20. GraphicsContext gc = getGraphicsContext2D();
  21. Affine transform = new Affine();
  22. Model model;
  23. double value2;
  24. double value3;
  25. float value4;
  26. float value5;
  27. String cityname;
  28. OSMNode nearestNode = null;
  29. public OSMWay wayForMC = null;
  30.  
  31. public void init(Model model) {
  32. this.model = model;
  33. pan(-model.minlon, -model.maxlat);
  34. zoom(800 / (model.maxlon - model.minlon), 0, 0);
  35. transform.prependScale(1, -1, 0, 0);
  36. model.addObserver(this::repaint);
  37. model.addObserver(this::repaint);
  38. repaint();
  39. model.getmodCoordx(this);
  40. }
  41.  
  42. public float getModelXmin() {
  43. return model.minlon;
  44. }
  45.  
  46. public float getModelXmax() {
  47. return model.maxlon;
  48. }
  49.  
  50. public float getModelYMin() {
  51. return model.minlat;
  52. }
  53.  
  54. public float getModelYMax() {
  55. return model.maxlat;
  56. }
  57.  
  58. public void repaint() {
  59. double stdLinewidth = 1 / Math.sqrt(Math.abs(transform.determinant()));
  60. getValueForZoom();
  61. gc.setTransform(new Affine());
  62. if (model.getWaysOfType(WayType.COASTLINE).iterator().hasNext()) {
  63. gc.setFill(Color.SKYBLUE);
  64. } else gc.setFill(Color.BEIGE);
  65. gc.fillRect(0, 0, getWidth(), getHeight());
  66. gc.setTransform(transform);
  67. gc.setLineCap(StrokeLineCap.ROUND);
  68. gc.setStroke(Color.WHITE);
  69. gc.setLineWidth(stdLinewidth);
  70. gc.setFillRule(FillRule.EVEN_ODD);
  71.  
  72. float minX = 0, minY = 0, maxX = 0, maxY = 0;
  73. try {
  74. Point2D minCoord = transform.inverseTransform((getWidth() / 3), (getHeight() / 3));
  75. Point2D maxCoord = transform.inverseTransform((getWidth() / 3) * 2, -(getHeight() / 3) * 2);
  76. minX = (float) minCoord.getX();
  77. minY = (float) minCoord.getY();
  78. maxX = (float) maxCoord.getX();
  79. maxY = (float) maxCoord.getY();
  80. } catch (NonInvertibleTransformException e) {
  81. e.printStackTrace();
  82. }
  83.  
  84. drawCoastline(minX, minY, maxX, maxY);
  85.  
  86. if (value3 <= 10000) {
  87. drawLevel2(minX, minY, maxX, maxY);
  88. }
  89. if (value3 <= 8000) {
  90. drawLevel3(minX, minY, maxX, maxY);
  91. }
  92. if (value3 <= 1200) {
  93. drawLevel4(minX, minY, maxX, maxY);
  94. }
  95. if (value3 <= 400) {
  96. model.getKdtreeBicycle().rangeSearch(minX, minY, maxX, maxY);
  97. gc.setStroke(WayType.BICYCLE.getColor());
  98. gc.setLineDashes((5 * (stdLinewidth)));
  99. for (Drawable d : model.getKdtreeBicycle().foundDrawables) {
  100. d.stroke(gc);
  101. }
  102.  
  103. model.getKdtreeFootway().rangeSearch(minX, minY, maxX, maxY);
  104. gc.setStroke(WayType.FOOTWAY.getColor());
  105. gc.setLineDashes((5 * (stdLinewidth)));
  106. for (Drawable d : model.getKdtreeFootway().foundDrawables) {
  107. d.stroke(gc);
  108. }
  109. gc.setLineDashes(0);
  110.  
  111. model.getKdtreeBuilding().rangeSearch(minX, minY, maxX, maxY);
  112. gc.setStroke(WayType.BUILDING.getColor());
  113. gc.setFill(WayType.BUILDING.getColor());
  114. for (Drawable d : model.getKdtreeBuilding().foundDrawables) {
  115. d.stroke(gc);
  116. d.fill(gc);
  117. }
  118.  
  119. for (OSMNode node:model.getNodesOfType(NodeType.SUPERMARKET)) {
  120. Point2D pos = transform.transform(node.getX(), node.getY());
  121. gc.drawImage(new Image(Objects.requireNonNull(ClassLoader.getSystemResourceAsStream("Images/shopping-cart.png"))), pos.getX(), pos.getY(), 25,25); drawText();
  122.  
  123. }
  124. for (OSMNode node:model.getNodesOfType(NodeType.TANK)) {
  125. Point2D pos = transform.transform(node.getX(), node.getY());
  126. gc.drawImage(new Image(Objects.requireNonNull(ClassLoader.getSystemResourceAsStream("Images/gas-station.png"))), pos.getX(), pos.getY(), 25, 25);
  127. }
  128. }
  129.  
  130. drawRange(minX, minY, maxX, maxY);
  131.  
  132. if (wayForMC != null) {
  133. Polyline p = new Polyline(wayForMC);
  134. gc.setStroke(Color.BLACK);
  135. p.stroke(gc);
  136. }
  137.  
  138. if (nearestNode != null) {
  139. drawText();
  140. Point2D pos = transform.transform(nearestNode.getX(), nearestNode.getY());
  141. gc.fillText("*nn*", pos.getX(), pos.getY());
  142. }
  143.  
  144. drawCitys();
  145. drawSearchedAddress();
  146. }
  147.  
  148. private void drawLevel4(float minX, float minY, float maxX, float maxY) {
  149. double stdLinewidth = 1 / Math.sqrt(Math.abs(transform.determinant()));
  150. gc.setLineWidth(stdLinewidth);
  151.  
  152. if (model.getKdtreeFarmyard()!= null) {
  153. model.getKdtreeFarmyard().rangeSearch(minX, minY, maxX, maxY);
  154. gc.setStroke(Color.WHITE);
  155. gc.setFill(WayType.FARMYARD.getColor());
  156. for (Drawable d : model.getKdtreeFarmyard().foundDrawables) {
  157. d.stroke(gc);
  158. d.fill(gc);
  159. }
  160. }
  161.  
  162. if (model.getKdtreeWaterway() != null) {
  163. model.getKdtreeWaterway().rangeSearch(minX, minY, maxX, maxY);
  164. gc.setStroke(WayType.WATERWAY.getColor());
  165. for (Drawable d : model.getKdtreeWaterway().foundDrawables) {
  166. d.stroke(gc);
  167. }
  168. }
  169.  
  170. model.getKdtreeAmenity().rangeSearch(minX,minY,maxX,maxY);
  171. gc.setStroke(WayType.AMENITY.getColor());
  172. for (Drawable d : model.getKdtreeAmenity().foundDrawables) {
  173. d.stroke(gc);
  174. }
  175.  
  176. model.getKdtreeTertiaryRoad().rangeSearch(minX,minY,maxX,maxY);
  177. gc.setStroke(WayType.TERTIARYROAD.getColor());
  178. gc.setLineWidth((stdLinewidth) * (WayType.TERTIARYROAD.getLineWidth()));
  179. for (Drawable d :model.getKdtreeTertiaryRoad().foundDrawables) {
  180. d.stroke(gc);
  181. }
  182.  
  183. model.getKdtreeSecondaryRoad().rangeSearch(minX,minY,maxX,maxY);
  184. gc.setStroke(WayType.SECONDARYROAD.getColor());
  185. gc.setLineWidth((stdLinewidth) * (WayType.SECONDARYROAD.getLineWidth()));
  186. for (Drawable d :model.getKdtreeSecondaryRoad().foundDrawables) {
  187. d.stroke(gc);
  188. }
  189.  
  190. model.getKdtreeResidentialRoad().rangeSearch(minX,minY,maxX,maxY);
  191. gc.setStroke(WayType.RESIDENTIALROAD.getColor());
  192. gc.setLineWidth((stdLinewidth) * (WayType.RESIDENTIALROAD.getLineWidth()));
  193. for (Drawable d :model.getKdtreeResidentialRoad().foundDrawables) {
  194. d.stroke(gc);
  195. }
  196. gc.setLineWidth(stdLinewidth);
  197. }
  198.  
  199. private void drawLevel3(float minX, float minY, float maxX, float maxY) {
  200. double stdLinewidth = 1 / Math.sqrt(Math.abs(transform.determinant()));
  201. gc.setLineWidth(stdLinewidth);
  202.  
  203. if (model.getKdtreeResidentialArea()!= null) {
  204. model.getKdtreeResidentialArea().rangeSearch(minX, minY, maxX, maxY);
  205. gc.setStroke(WayType.RESIDENTIALAREA.getColor());
  206. gc.setFill(WayType.RESIDENTIALAREA.getColor());
  207. for (Drawable d : model.getKdtreeResidentialArea().foundDrawables) {
  208. d.stroke(gc);
  209. d.fill(gc);
  210. }
  211. }
  212.  
  213. model.getKdtreeWater().rangeSearch(minX,minY,maxX,maxY);
  214. gc.setStroke(WayType.WATER.getColor());
  215. gc.setFill(WayType.WATER.getColor());
  216. for (Drawable d :model.getKdtreeWater().foundDrawables) {
  217. d.stroke(gc);
  218. d.fill(gc);
  219. }
  220.  
  221. model.getKdtreeLeisure().rangeSearch(minX, minY, maxX, maxY);
  222. gc.setFill(WayType.LEISURE.getColor());
  223. for (Drawable d : model.getKdtreeLeisure().foundDrawables) {
  224. d.fill(gc);
  225. }
  226.  
  227. if (model.getKdtreePrimaryRoad() != null) {
  228. model.getKdtreePrimaryRoad().rangeSearch(minX, minY, maxX, maxY);
  229. gc.setStroke(WayType.PRIMARYROAD.getColor());
  230. gc.setLineWidth((stdLinewidth) * (WayType.PRIMARYROAD.getLineWidth()));
  231. for (Drawable d : model.getKdtreePrimaryRoad().foundDrawables) {
  232. d.stroke(gc);
  233. }
  234. }
  235. gc.setLineWidth(stdLinewidth);
  236. }
  237.  
  238. private void drawLevel2(float minX, float minY, float maxX, float maxY) {
  239. model.getKdtreeFarmland().rangeSearch(minX, minY, maxX, maxY);
  240. gc.setStroke(Color.WHITE);
  241. gc.setFill(WayType.FARMLAND.getColor());
  242. for (Drawable d :model.getKdtreeFarmland().foundDrawables) {
  243. d.stroke(gc);
  244. d.fill(gc);
  245. }
  246.  
  247. model.getKdtreeLanduse().rangeSearch(minX, minY, maxX, maxY);
  248. gc.setFill(WayType.LANDUSE.getColor());
  249. for (Drawable d : model.getKdtreeLanduse().foundDrawables) {
  250. d.fill(gc);
  251. }
  252.  
  253. if (model.getKdtreeMotorway() != null) {
  254. model.getKdtreeMotorway().rangeSearch(minX, minY, maxX, maxY);
  255. gc.setStroke(WayType.MOTORWAY.getColor());
  256. for (Drawable d : model.getKdtreeMotorway().foundDrawables) {
  257. d.stroke(gc);
  258. }
  259. }
  260. }
  261.  
  262. private void drawCoastline(float minX, float minY, float maxX, float maxY) {
  263. model.getKdtreeCoastline().rangeSearch(minX, minY, maxX, maxY);
  264. gc.setStroke(Color.WHITE);
  265. gc.setFill(Color.BEIGE);
  266. for (Drawable d : model.getKdtreeCoastline().foundDrawables) {
  267. d.stroke(gc);
  268. d.fill(gc);
  269. }
  270. }
  271.  
  272. public void pan (double dx, double dy) {
  273. transform.prependTranslation(dx, dy);
  274. repaint();
  275. }
  276. public void panNight (double dx, double dy) {
  277. transform.prependTranslation(dx, dy);
  278. repaintNight();
  279. }
  280.  
  281. public void click () {
  282. //System.out.println("MapCanvasNode: " + nearestNode.id );
  283. repaint();
  284. }
  285.  
  286. public void drawText () {
  287. gc.setTextAlign(TextAlignment.CENTER);
  288. gc.setTextBaseline(VPos.CENTER);
  289. gc.setLineWidth(0.3);
  290. gc.setFill(Color.BLACK);
  291. gc.setTransform(new Affine());
  292. }
  293.  
  294. public void zoom (double factor, double x, double y) {
  295. transform.prependScale(factor, factor, x, y);
  296. repaint();
  297. }
  298. public void zoomNight (double factor, double x, double y) {
  299. transform.prependScale(factor, factor, x, y);
  300. repaintNight();
  301. }
  302.  
  303. public double getValueForZoom() {
  304. float minX = 0,maxX = 0;
  305. try {
  306. Point2D minCoord = transform.inverseTransform(getModelXmin(),getModelYMin());
  307. Point2D maxCoord = transform.inverseTransform(getModelXmax(), getModelYMax());
  308. minX = (float) minCoord.getX();
  309. maxX = (float) maxCoord.getX();
  310.  
  311. } catch (NonInvertibleTransformException ex) {
  312. ex.printStackTrace();
  313. }
  314. double value = (111139 * ((maxX/model.lonfactor) - (minX/model.lonfactor))) / (1200.0/105.0);
  315. int value1 = (int) (value * 100);
  316. value2 = value1 / 100.0;
  317. value3 = value2 * 1000;
  318. return value2;
  319. }
  320.  
  321. public Point2D modelCoords (double x, double y) {
  322. try {
  323. return transform.inverseTransform(x, y);
  324. } catch (NonInvertibleTransformException e) {
  325. e.printStackTrace();
  326. return null;
  327. }
  328. }
  329.  
  330. public Point2D modelCoords2 (double x, double y) {
  331. return transform.transform(x, y);
  332. }
  333.  
  334. public void drawRange (float minx, float miny, float maxx, float maxy) {
  335. gc.beginPath();
  336. gc.moveTo(minx, miny);
  337. gc.lineTo(minx, maxy);
  338. gc.lineTo(maxx, maxy);
  339. gc.lineTo(maxx, miny);
  340. gc.lineTo(minx, miny);
  341. gc.setStroke(Color.RED);
  342. gc.stroke();
  343. }
  344.  
  345.  
  346.  
  347. public void drawCitys() {
  348. for (OSMNode node:model.getNodesOfType(NodeType.VILLAGE)) {
  349. Point2D pos = transform.transform(node.getX(), node.getY());
  350. gc.fillText("", pos.getX(), pos.getY());
  351. drawText();
  352.  
  353. }
  354. for (OSMNode node:model.getNodesOfType(NodeType.TOWN)) {
  355. Point2D pos = transform.transform(node.getX(), node.getY());
  356. gc.fillText("", pos.getX(), pos.getY());
  357. drawText();
  358. }
  359. }
  360.  
  361. public void repaintNight() {
  362. double stdLinewidth = 1 / Math.sqrt(Math.abs(transform.determinant()));
  363. getValueForZoom();
  364. gc.setTransform(new Affine());
  365. if (model.getWaysOfType(WayType.COASTLINE).iterator().hasNext()) {
  366. gc.setFill(Color.web("3E6177"));
  367. } else gc.setFill(Color.web("647B89"));
  368. gc.fillRect(0, 0, getWidth(), getHeight());
  369. gc.setTransform(transform);
  370. gc.setLineCap(StrokeLineCap.ROUND);
  371. gc.setStroke(Color.WHITE);
  372. gc.setLineWidth(stdLinewidth);
  373. gc.setFillRule(FillRule.EVEN_ODD);
  374.  
  375. float minX = 0, minY = 0, maxX = 0, maxY = 0;
  376. try {
  377. Point2D minCoord = transform.inverseTransform((getWidth() / 3), (getHeight() / 3));
  378. Point2D maxCoord = transform.inverseTransform((getWidth() / 3) * 2, -(getHeight() / 3) * 2);
  379. minX = (float) minCoord.getX();
  380. minY = (float) minCoord.getY();
  381. maxX = (float) maxCoord.getX();
  382. maxY = (float) maxCoord.getY();
  383. } catch (NonInvertibleTransformException e) {
  384. e.printStackTrace();
  385. }
  386.  
  387. model.getKdtreeCoastline().rangeSearch(minX, minY, maxX, maxY);
  388. gc.setStroke(Color.BLACK);
  389. gc.setFill(Color.web("647B89"));
  390. for (Drawable d : model.getKdtreeCoastline().foundDrawables) {
  391. d.stroke(gc);
  392. d.fill(gc);
  393. }
  394.  
  395. if (value3 <= 10000) {
  396. drawLevel2Night(minX, minY, maxX, maxY);
  397. }
  398. if (value3 <= 8000) {
  399. drawLevel3Night(minX, minY, maxX, maxY);
  400. }
  401. if (value3 <= 1200) {
  402. drawLevel4(minX, minY, maxX, maxY);
  403. }
  404. if (value3 <= 400) {
  405.  
  406. model.getKdtreeBicycle().rangeSearch(minX, minY, maxX, maxY);
  407. gc.setStroke(WayType.BICYCLE.getColor());
  408. gc.setLineDashes((5 * (stdLinewidth)));
  409. for (Drawable d : model.getKdtreeBicycle().foundDrawables) {
  410. d.stroke(gc);
  411. }
  412.  
  413. model.getKdtreeFootway().rangeSearch(minX, minY, maxX, maxY);
  414. gc.setStroke(WayType.FOOTWAY.getColor());
  415. gc.setLineDashes((5 * (stdLinewidth)));
  416. for (Drawable d : model.getKdtreeFootway().foundDrawables) {
  417. d.stroke(gc);
  418. }
  419. gc.setLineDashes(0);
  420.  
  421. model.getKdtreeBuilding().rangeSearch(minX, minY, maxX, maxY);
  422. gc.setStroke(WayType.BUILDING.getColor());
  423. gc.setFill(WayType.BUILDING.getColor());
  424. for (Drawable d : model.getKdtreeBuilding().foundDrawables) {
  425. d.stroke(gc);
  426. d.fill(gc);
  427. }
  428.  
  429. if (nearestNode != null) {
  430. drawText();
  431. Point2D pos = transform.transform(nearestNode.getX(), nearestNode.getY());
  432. gc.fillText("*nn*", pos.getX(), pos.getY());
  433. }
  434. drawRange(minX, minY, maxX, maxY);
  435. drawCitys();
  436. }
  437. }
  438.  
  439. private void drawLevel2Night(float minX, float minY, float maxX, float maxY) {
  440. model.getKdtreeFarmland().rangeSearch(minX, minY, maxX, maxY);
  441. gc.setFill(Color.web("647B89"));
  442. for (Drawable d : model.getKdtreeFarmland().foundDrawables) {
  443. d.fill(gc);
  444. }
  445.  
  446. model.getKdtreeLanduse().rangeSearch(minX, minY, maxX, maxY);
  447. gc.setFill(Color.web("335643"));
  448. for (Drawable d : model.getKdtreeLanduse().foundDrawables) {
  449. d.fill(gc);
  450. }
  451.  
  452. if (model.getKdtreeMotorway() != null) {
  453. model.getKdtreeMotorway().rangeSearch(minX, minY, maxX, maxY);
  454. gc.setStroke(WayType.MOTORWAY.getColor());
  455. for (Drawable d : model.getKdtreeMotorway().foundDrawables) {
  456. d.stroke(gc);
  457. }
  458. }
  459. }
  460. private void drawLevel3Night(float minX, float minY, float maxX, float maxY) {
  461. double stdLinewidth = 1 / Math.sqrt(Math.abs(transform.determinant()));
  462. gc.setLineWidth(stdLinewidth);
  463.  
  464. if (model.getKdtreeResidentialArea()!= null) {
  465. model.getKdtreeResidentialArea().rangeSearch(minX, minY, maxX, maxY);
  466. gc.setFill(Color.web("798187"));
  467. for (Drawable d : model.getKdtreeResidentialArea().foundDrawables) {
  468. d.fill(gc);
  469. }
  470. }
  471.  
  472. model.getKdtreeWater().rangeSearch(minX, minY, maxX, maxY);
  473. gc.setFill(Color.web("427493"));
  474. for(Drawable d :model.getKdtreeWater().foundDrawables) {
  475. d.fill(gc);
  476. }
  477.  
  478. model.getKdtreeLeisure().rangeSearch(minX, minY, maxX, maxY);
  479. gc.setFill(WayType.LEISURE.getColor());
  480. for(Drawable d : model.getKdtreeLeisure().foundDrawables) {
  481. d.fill(gc);
  482. }
  483.  
  484. if (model.getKdtreePrimaryRoad() != null) {
  485. model.getKdtreePrimaryRoad().rangeSearch(minX, minY, maxX, maxY);
  486. gc.setStroke(WayType.PRIMARYROAD.getColor());
  487. gc.setLineWidth((stdLinewidth) * (WayType.PRIMARYROAD.getLineWidth()));
  488. for (Drawable d : model.getKdtreePrimaryRoad().foundDrawables) {
  489. d.stroke(gc);
  490. }
  491. }
  492. gc.setLineWidth(stdLinewidth);
  493. }
  494.  
  495.  
  496. public void drawSearchedAddress() {
  497. Point2D pos = transform.transform(value4, value5);
  498. gc.drawImage(new Image(Objects.requireNonNull(ClassLoader.getSystemResourceAsStream("Images/mi.png"))), pos.getX(), pos.getY(), 25, 25);
  499. }
  500. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement