Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package bfst19.osmdrawing;
- import javafx.geometry.Point2D;
- import javafx.geometry.VPos;
- import javafx.scene.canvas.Canvas;
- import javafx.scene.canvas.GraphicsContext;
- import javafx.scene.image.Image;
- import javafx.scene.paint.Color;
- import javafx.scene.shape.FillRule;
- import javafx.scene.shape.StrokeLineCap;
- import javafx.scene.text.TextAlignment;
- import javafx.scene.transform.Affine;
- import javafx.scene.transform.NonInvertibleTransformException;
- import java.util.Objects;
- public class MapCanvas extends Canvas {
- public boolean supermarketShow = false;
- public boolean kiosksShow = false;
- GraphicsContext gc = getGraphicsContext2D();
- Affine transform = new Affine();
- Model model;
- double value2;
- double value3;
- float value4;
- float value5;
- String cityname;
- OSMNode nearestNode = null;
- public OSMWay wayForMC = null;
- public void init(Model model) {
- this.model = model;
- pan(-model.minlon, -model.maxlat);
- zoom(800 / (model.maxlon - model.minlon), 0, 0);
- transform.prependScale(1, -1, 0, 0);
- model.addObserver(this::repaint);
- model.addObserver(this::repaint);
- repaint();
- model.getmodCoordx(this);
- }
- public float getModelXmin() {
- return model.minlon;
- }
- public float getModelXmax() {
- return model.maxlon;
- }
- public float getModelYMin() {
- return model.minlat;
- }
- public float getModelYMax() {
- return model.maxlat;
- }
- public void repaint() {
- double stdLinewidth = 1 / Math.sqrt(Math.abs(transform.determinant()));
- getValueForZoom();
- gc.setTransform(new Affine());
- if (model.getWaysOfType(WayType.COASTLINE).iterator().hasNext()) {
- gc.setFill(Color.SKYBLUE);
- } else gc.setFill(Color.BEIGE);
- gc.fillRect(0, 0, getWidth(), getHeight());
- gc.setTransform(transform);
- gc.setLineCap(StrokeLineCap.ROUND);
- gc.setStroke(Color.WHITE);
- gc.setLineWidth(stdLinewidth);
- gc.setFillRule(FillRule.EVEN_ODD);
- float minX = 0, minY = 0, maxX = 0, maxY = 0;
- try {
- Point2D minCoord = transform.inverseTransform((getWidth() / 3), (getHeight() / 3));
- Point2D maxCoord = transform.inverseTransform((getWidth() / 3) * 2, -(getHeight() / 3) * 2);
- minX = (float) minCoord.getX();
- minY = (float) minCoord.getY();
- maxX = (float) maxCoord.getX();
- maxY = (float) maxCoord.getY();
- } catch (NonInvertibleTransformException e) {
- e.printStackTrace();
- }
- drawCoastline(minX, minY, maxX, maxY);
- if (value3 <= 10000) {
- drawLevel2(minX, minY, maxX, maxY);
- }
- if (value3 <= 8000) {
- drawLevel3(minX, minY, maxX, maxY);
- }
- if (value3 <= 1200) {
- drawLevel4(minX, minY, maxX, maxY);
- }
- if (value3 <= 400) {
- model.getKdtreeBicycle().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(WayType.BICYCLE.getColor());
- gc.setLineDashes((5 * (stdLinewidth)));
- for (Drawable d : model.getKdtreeBicycle().foundDrawables) {
- d.stroke(gc);
- }
- model.getKdtreeFootway().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(WayType.FOOTWAY.getColor());
- gc.setLineDashes((5 * (stdLinewidth)));
- for (Drawable d : model.getKdtreeFootway().foundDrawables) {
- d.stroke(gc);
- }
- gc.setLineDashes(0);
- model.getKdtreeBuilding().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(WayType.BUILDING.getColor());
- gc.setFill(WayType.BUILDING.getColor());
- for (Drawable d : model.getKdtreeBuilding().foundDrawables) {
- d.stroke(gc);
- d.fill(gc);
- }
- for (OSMNode node:model.getNodesOfType(NodeType.SUPERMARKET)) {
- Point2D pos = transform.transform(node.getX(), node.getY());
- gc.drawImage(new Image(Objects.requireNonNull(ClassLoader.getSystemResourceAsStream("Images/shopping-cart.png"))), pos.getX(), pos.getY(), 25,25); drawText();
- }
- for (OSMNode node:model.getNodesOfType(NodeType.TANK)) {
- Point2D pos = transform.transform(node.getX(), node.getY());
- gc.drawImage(new Image(Objects.requireNonNull(ClassLoader.getSystemResourceAsStream("Images/gas-station.png"))), pos.getX(), pos.getY(), 25, 25);
- }
- }
- drawRange(minX, minY, maxX, maxY);
- if (wayForMC != null) {
- Polyline p = new Polyline(wayForMC);
- gc.setStroke(Color.BLACK);
- p.stroke(gc);
- }
- if (nearestNode != null) {
- drawText();
- Point2D pos = transform.transform(nearestNode.getX(), nearestNode.getY());
- gc.fillText("*nn*", pos.getX(), pos.getY());
- }
- drawCitys();
- drawSearchedAddress();
- }
- private void drawLevel4(float minX, float minY, float maxX, float maxY) {
- double stdLinewidth = 1 / Math.sqrt(Math.abs(transform.determinant()));
- gc.setLineWidth(stdLinewidth);
- if (model.getKdtreeFarmyard()!= null) {
- model.getKdtreeFarmyard().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(Color.WHITE);
- gc.setFill(WayType.FARMYARD.getColor());
- for (Drawable d : model.getKdtreeFarmyard().foundDrawables) {
- d.stroke(gc);
- d.fill(gc);
- }
- }
- if (model.getKdtreeWaterway() != null) {
- model.getKdtreeWaterway().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(WayType.WATERWAY.getColor());
- for (Drawable d : model.getKdtreeWaterway().foundDrawables) {
- d.stroke(gc);
- }
- }
- model.getKdtreeAmenity().rangeSearch(minX,minY,maxX,maxY);
- gc.setStroke(WayType.AMENITY.getColor());
- for (Drawable d : model.getKdtreeAmenity().foundDrawables) {
- d.stroke(gc);
- }
- model.getKdtreeTertiaryRoad().rangeSearch(minX,minY,maxX,maxY);
- gc.setStroke(WayType.TERTIARYROAD.getColor());
- gc.setLineWidth((stdLinewidth) * (WayType.TERTIARYROAD.getLineWidth()));
- for (Drawable d :model.getKdtreeTertiaryRoad().foundDrawables) {
- d.stroke(gc);
- }
- model.getKdtreeSecondaryRoad().rangeSearch(minX,minY,maxX,maxY);
- gc.setStroke(WayType.SECONDARYROAD.getColor());
- gc.setLineWidth((stdLinewidth) * (WayType.SECONDARYROAD.getLineWidth()));
- for (Drawable d :model.getKdtreeSecondaryRoad().foundDrawables) {
- d.stroke(gc);
- }
- model.getKdtreeResidentialRoad().rangeSearch(minX,minY,maxX,maxY);
- gc.setStroke(WayType.RESIDENTIALROAD.getColor());
- gc.setLineWidth((stdLinewidth) * (WayType.RESIDENTIALROAD.getLineWidth()));
- for (Drawable d :model.getKdtreeResidentialRoad().foundDrawables) {
- d.stroke(gc);
- }
- gc.setLineWidth(stdLinewidth);
- }
- private void drawLevel3(float minX, float minY, float maxX, float maxY) {
- double stdLinewidth = 1 / Math.sqrt(Math.abs(transform.determinant()));
- gc.setLineWidth(stdLinewidth);
- if (model.getKdtreeResidentialArea()!= null) {
- model.getKdtreeResidentialArea().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(WayType.RESIDENTIALAREA.getColor());
- gc.setFill(WayType.RESIDENTIALAREA.getColor());
- for (Drawable d : model.getKdtreeResidentialArea().foundDrawables) {
- d.stroke(gc);
- d.fill(gc);
- }
- }
- model.getKdtreeWater().rangeSearch(minX,minY,maxX,maxY);
- gc.setStroke(WayType.WATER.getColor());
- gc.setFill(WayType.WATER.getColor());
- for (Drawable d :model.getKdtreeWater().foundDrawables) {
- d.stroke(gc);
- d.fill(gc);
- }
- model.getKdtreeLeisure().rangeSearch(minX, minY, maxX, maxY);
- gc.setFill(WayType.LEISURE.getColor());
- for (Drawable d : model.getKdtreeLeisure().foundDrawables) {
- d.fill(gc);
- }
- if (model.getKdtreePrimaryRoad() != null) {
- model.getKdtreePrimaryRoad().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(WayType.PRIMARYROAD.getColor());
- gc.setLineWidth((stdLinewidth) * (WayType.PRIMARYROAD.getLineWidth()));
- for (Drawable d : model.getKdtreePrimaryRoad().foundDrawables) {
- d.stroke(gc);
- }
- }
- gc.setLineWidth(stdLinewidth);
- }
- private void drawLevel2(float minX, float minY, float maxX, float maxY) {
- model.getKdtreeFarmland().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(Color.WHITE);
- gc.setFill(WayType.FARMLAND.getColor());
- for (Drawable d :model.getKdtreeFarmland().foundDrawables) {
- d.stroke(gc);
- d.fill(gc);
- }
- model.getKdtreeLanduse().rangeSearch(minX, minY, maxX, maxY);
- gc.setFill(WayType.LANDUSE.getColor());
- for (Drawable d : model.getKdtreeLanduse().foundDrawables) {
- d.fill(gc);
- }
- if (model.getKdtreeMotorway() != null) {
- model.getKdtreeMotorway().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(WayType.MOTORWAY.getColor());
- for (Drawable d : model.getKdtreeMotorway().foundDrawables) {
- d.stroke(gc);
- }
- }
- }
- private void drawCoastline(float minX, float minY, float maxX, float maxY) {
- model.getKdtreeCoastline().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(Color.WHITE);
- gc.setFill(Color.BEIGE);
- for (Drawable d : model.getKdtreeCoastline().foundDrawables) {
- d.stroke(gc);
- d.fill(gc);
- }
- }
- public void pan (double dx, double dy) {
- transform.prependTranslation(dx, dy);
- repaint();
- }
- public void panNight (double dx, double dy) {
- transform.prependTranslation(dx, dy);
- repaintNight();
- }
- public void click () {
- //System.out.println("MapCanvasNode: " + nearestNode.id );
- repaint();
- }
- public void drawText () {
- gc.setTextAlign(TextAlignment.CENTER);
- gc.setTextBaseline(VPos.CENTER);
- gc.setLineWidth(0.3);
- gc.setFill(Color.BLACK);
- gc.setTransform(new Affine());
- }
- public void zoom (double factor, double x, double y) {
- transform.prependScale(factor, factor, x, y);
- repaint();
- }
- public void zoomNight (double factor, double x, double y) {
- transform.prependScale(factor, factor, x, y);
- repaintNight();
- }
- public double getValueForZoom() {
- float minX = 0,maxX = 0;
- try {
- Point2D minCoord = transform.inverseTransform(getModelXmin(),getModelYMin());
- Point2D maxCoord = transform.inverseTransform(getModelXmax(), getModelYMax());
- minX = (float) minCoord.getX();
- maxX = (float) maxCoord.getX();
- } catch (NonInvertibleTransformException ex) {
- ex.printStackTrace();
- }
- double value = (111139 * ((maxX/model.lonfactor) - (minX/model.lonfactor))) / (1200.0/105.0);
- int value1 = (int) (value * 100);
- value2 = value1 / 100.0;
- value3 = value2 * 1000;
- return value2;
- }
- public Point2D modelCoords (double x, double y) {
- try {
- return transform.inverseTransform(x, y);
- } catch (NonInvertibleTransformException e) {
- e.printStackTrace();
- return null;
- }
- }
- public Point2D modelCoords2 (double x, double y) {
- return transform.transform(x, y);
- }
- public void drawRange (float minx, float miny, float maxx, float maxy) {
- gc.beginPath();
- gc.moveTo(minx, miny);
- gc.lineTo(minx, maxy);
- gc.lineTo(maxx, maxy);
- gc.lineTo(maxx, miny);
- gc.lineTo(minx, miny);
- gc.setStroke(Color.RED);
- gc.stroke();
- }
- public void drawCitys() {
- for (OSMNode node:model.getNodesOfType(NodeType.VILLAGE)) {
- Point2D pos = transform.transform(node.getX(), node.getY());
- gc.fillText("", pos.getX(), pos.getY());
- drawText();
- }
- for (OSMNode node:model.getNodesOfType(NodeType.TOWN)) {
- Point2D pos = transform.transform(node.getX(), node.getY());
- gc.fillText("", pos.getX(), pos.getY());
- drawText();
- }
- }
- public void repaintNight() {
- double stdLinewidth = 1 / Math.sqrt(Math.abs(transform.determinant()));
- getValueForZoom();
- gc.setTransform(new Affine());
- if (model.getWaysOfType(WayType.COASTLINE).iterator().hasNext()) {
- gc.setFill(Color.web("3E6177"));
- } else gc.setFill(Color.web("647B89"));
- gc.fillRect(0, 0, getWidth(), getHeight());
- gc.setTransform(transform);
- gc.setLineCap(StrokeLineCap.ROUND);
- gc.setStroke(Color.WHITE);
- gc.setLineWidth(stdLinewidth);
- gc.setFillRule(FillRule.EVEN_ODD);
- float minX = 0, minY = 0, maxX = 0, maxY = 0;
- try {
- Point2D minCoord = transform.inverseTransform((getWidth() / 3), (getHeight() / 3));
- Point2D maxCoord = transform.inverseTransform((getWidth() / 3) * 2, -(getHeight() / 3) * 2);
- minX = (float) minCoord.getX();
- minY = (float) minCoord.getY();
- maxX = (float) maxCoord.getX();
- maxY = (float) maxCoord.getY();
- } catch (NonInvertibleTransformException e) {
- e.printStackTrace();
- }
- model.getKdtreeCoastline().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(Color.BLACK);
- gc.setFill(Color.web("647B89"));
- for (Drawable d : model.getKdtreeCoastline().foundDrawables) {
- d.stroke(gc);
- d.fill(gc);
- }
- if (value3 <= 10000) {
- drawLevel2Night(minX, minY, maxX, maxY);
- }
- if (value3 <= 8000) {
- drawLevel3Night(minX, minY, maxX, maxY);
- }
- if (value3 <= 1200) {
- drawLevel4(minX, minY, maxX, maxY);
- }
- if (value3 <= 400) {
- model.getKdtreeBicycle().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(WayType.BICYCLE.getColor());
- gc.setLineDashes((5 * (stdLinewidth)));
- for (Drawable d : model.getKdtreeBicycle().foundDrawables) {
- d.stroke(gc);
- }
- model.getKdtreeFootway().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(WayType.FOOTWAY.getColor());
- gc.setLineDashes((5 * (stdLinewidth)));
- for (Drawable d : model.getKdtreeFootway().foundDrawables) {
- d.stroke(gc);
- }
- gc.setLineDashes(0);
- model.getKdtreeBuilding().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(WayType.BUILDING.getColor());
- gc.setFill(WayType.BUILDING.getColor());
- for (Drawable d : model.getKdtreeBuilding().foundDrawables) {
- d.stroke(gc);
- d.fill(gc);
- }
- if (nearestNode != null) {
- drawText();
- Point2D pos = transform.transform(nearestNode.getX(), nearestNode.getY());
- gc.fillText("*nn*", pos.getX(), pos.getY());
- }
- drawRange(minX, minY, maxX, maxY);
- drawCitys();
- }
- }
- private void drawLevel2Night(float minX, float minY, float maxX, float maxY) {
- model.getKdtreeFarmland().rangeSearch(minX, minY, maxX, maxY);
- gc.setFill(Color.web("647B89"));
- for (Drawable d : model.getKdtreeFarmland().foundDrawables) {
- d.fill(gc);
- }
- model.getKdtreeLanduse().rangeSearch(minX, minY, maxX, maxY);
- gc.setFill(Color.web("335643"));
- for (Drawable d : model.getKdtreeLanduse().foundDrawables) {
- d.fill(gc);
- }
- if (model.getKdtreeMotorway() != null) {
- model.getKdtreeMotorway().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(WayType.MOTORWAY.getColor());
- for (Drawable d : model.getKdtreeMotorway().foundDrawables) {
- d.stroke(gc);
- }
- }
- }
- private void drawLevel3Night(float minX, float minY, float maxX, float maxY) {
- double stdLinewidth = 1 / Math.sqrt(Math.abs(transform.determinant()));
- gc.setLineWidth(stdLinewidth);
- if (model.getKdtreeResidentialArea()!= null) {
- model.getKdtreeResidentialArea().rangeSearch(minX, minY, maxX, maxY);
- gc.setFill(Color.web("798187"));
- for (Drawable d : model.getKdtreeResidentialArea().foundDrawables) {
- d.fill(gc);
- }
- }
- model.getKdtreeWater().rangeSearch(minX, minY, maxX, maxY);
- gc.setFill(Color.web("427493"));
- for(Drawable d :model.getKdtreeWater().foundDrawables) {
- d.fill(gc);
- }
- model.getKdtreeLeisure().rangeSearch(minX, minY, maxX, maxY);
- gc.setFill(WayType.LEISURE.getColor());
- for(Drawable d : model.getKdtreeLeisure().foundDrawables) {
- d.fill(gc);
- }
- if (model.getKdtreePrimaryRoad() != null) {
- model.getKdtreePrimaryRoad().rangeSearch(minX, minY, maxX, maxY);
- gc.setStroke(WayType.PRIMARYROAD.getColor());
- gc.setLineWidth((stdLinewidth) * (WayType.PRIMARYROAD.getLineWidth()));
- for (Drawable d : model.getKdtreePrimaryRoad().foundDrawables) {
- d.stroke(gc);
- }
- }
- gc.setLineWidth(stdLinewidth);
- }
- public void drawSearchedAddress() {
- Point2D pos = transform.transform(value4, value5);
- gc.drawImage(new Image(Objects.requireNonNull(ClassLoader.getSystemResourceAsStream("Images/mi.png"))), pos.getX(), pos.getY(), 25, 25);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement