private Area createMapViewAreaForCenterImg(MapView mapView) { Point centerImgLocation = mapView.getCenterImgPosition(); GpsLocation gpsLoc = mapView.getGpsLocation(); int pixelsToLeftEdge = centerImgLocation.X; int pixelsToTopEdge = centerImgLocation.Y; Image centerPart = mapView.getImgByPoint(new Point(1, 1)); int pixelsToRightEdge = centerPart.Width - centerImgLocation.X; int pixelsToBottomEdge = centerPart.Height - centerImgLocation.Y; double latitudePerPixel = this.currentMapPkg.getLatitudePerPixel(); double longitudePerPixel = this.currentMapPkg.getLongitudePerPixel(); double topLeftLatitude = gpsLoc.getLatitude() + pixelsToTopEdge * latitudePerPixel; double topLeftLongitude = gpsLoc.getLongitude() - pixelsToLeftEdge * longitudePerPixel; double bottomRightLatitude = gpsLoc.getLatitude() - pixelsToBottomEdge * latitudePerPixel; double bottomRightLongitude = gpsLoc.getLongitude() + pixelsToRightEdge * longitudePerPixel; return new Area(topLeftLatitude, topLeftLongitude, bottomRightLatitude, bottomRightLongitude); }
// TODO: this method is too big public void createNew() { Debug.WriteLine("----- createCurrentView -----", ToString()); // container to keep map parts which create current map view Hashtable viewParts = new Hashtable(); // get current gps coordinates double latitude = this.currentGpsLocation.getLatitude(); double longitude = this.currentGpsLocation.getLongitude(); //Debug.WriteLine("latitude: " + latitude + ", longitude: " + longitude, this.ToString()); // get point which indicates part image for the location Point partPoint = this.currentMapPkg.getPartPoint(latitude, longitude); Debug.WriteLine("partPoint: " + PointUtil.pointStr(partPoint), ToString()); // get location (pixel coordinates) inside part image Point insidePartPosition = this.currentMapPkg.getInsidePartPosition(latitude, longitude); //Debug.WriteLine("insidePartPosition: (" + insidePartPosition.X + "; " + insidePartPosition.Y + ")", this.ToString()); // add center MapView point Point centerViewPoint = new Point(1, 1); viewParts[centerViewPoint] = this.currentMapPkg.getPart(partPoint); // map view has only sense when there is center map part if (viewParts[centerViewPoint] == null) { Debug.WriteLine("Can't get center part! viewParts[centerViewPoint] is null - skipping.", this.ToString()); // return when center part is null this.currentMapVeiw = null; return; } // add neighbours of center point foreach (DictionaryEntry entry in this.pointSurroundings) { Point directionPoint = (Point)entry.Value; Debug.WriteLine("directionPoint: " + PointUtil.pointStr(directionPoint), ToString()); Point viewNeighbour = PointMath.addPoints(centerViewPoint, directionPoint); Point mapNeighbour = PointMath.addPoints(partPoint, directionPoint); try { viewParts[viewNeighbour] = this.currentMapPkg.getPart(mapNeighbour); if (viewParts[viewNeighbour] == null) { Debug.WriteLine("looking for view neighbour:", this.ToString()); MapPackage neighbourPkg = null; int neighbourDirectionX = 0; if (mapNeighbour.X > this.currentMapPkg.getMaxX()) neighbourDirectionX = 1; if (mapNeighbour.X < 0) neighbourDirectionX = -1; int neighbourDirectionY = 0; if (mapNeighbour.Y > this.currentMapPkg.getMaxY()) neighbourDirectionY = 1; if (mapNeighbour.Y < 0) neighbourDirectionY = -1; Point neighbourDirection = new Point(neighbourDirectionX, neighbourDirectionY); try { Debug.WriteLine(" trying to get neighbour pkg for neighbour point: " + PointUtil.pointStr(neighbourDirection), ToString()); // get neighbour map package neighbourPkg = this.mapPkgRepository.getNeighbourMapPkg(this.currentMapPkg, neighbourDirection, this.currentZoom); } catch (MapNotFoundException e) { Debug.WriteLine(" Can't get neighbour pkg for: " + this.currentMapPkg + ", dircetion: (" + directionPoint.X + "; " + directionPoint.Y + "), ERROR: " + e.Message, this.ToString()); } if (neighbourPkg != null) { if (mapNeighbour.X > this.currentMapPkg.getMaxX()) mapNeighbour.X = 0; if (mapNeighbour.X < 0) mapNeighbour.X = neighbourPkg.getMaxX(); if (mapNeighbour.Y > this.currentMapPkg.getMaxY()) mapNeighbour.Y = 0; if (mapNeighbour.Y < 0) mapNeighbour.Y = neighbourPkg.getMaxY(); Debug.WriteLine(" getting map part from neighbour pkg for point: " + PointUtil.pointStr(mapNeighbour), this.ToString()); viewParts[viewNeighbour] = neighbourPkg.getPart(mapNeighbour); } } else Debug.WriteLine("view neighbour ok", this.ToString()); } catch (Exception e) { Debug.WriteLine("Can't get neighbour(" + entry.Key + ")! ERROR: " + e.Message, this.ToString()); } } // create map view MapView mapView = new MapView(this.currentGpsLocation, insidePartPosition, viewParts, this.orderingPoints); mapView.setLatitudePerPixel(this.currentMapPkg.getLatitudePerPixel()); mapView.setLongitudePerPixel(this.currentMapPkg.getLongitudePerPixel()); Area mapViewArea = createMapViewArea(mapView); Area centerImgArea = createMapViewAreaForCenterImg(mapView); mapView.setArea(mapViewArea); mapView.setCenterImgArea(centerImgArea); Debug.WriteLine("-----------------------------\n", ToString()); this.currentMapVeiw = mapView; }
private Area createMapViewArea(MapView mapView) { Area afci = createMapViewAreaForCenterImg(mapView); Image topLeftPart = mapView.getImgByPoint(new Point(0, 0)); double latitudeTopEdgeFix = topLeftPart.Size.Height * this.currentMapPkg.getLatitudePerPixel(); double longitudeLeftEdgeFix = topLeftPart.Size.Width * this.currentMapPkg.getLongitudePerPixel(); Image bottomRightPart = mapView.getImgByPoint(new Point(2, 2)); double latitudeBottomEdgeFix = bottomRightPart.Height * this.currentMapPkg.getLatitudePerPixel(); double longitudeRghtEdgeFix = bottomRightPart.Width * this.currentMapPkg.getLongitudePerPixel(); return new Area(afci.getTopLeftLatitude() + latitudeTopEdgeFix, afci.getTopLeftLongitude() - longitudeLeftEdgeFix, afci.getBottomRightLatitude() - latitudeBottomEdgeFix, afci.getBottomRightLongitude() + longitudeRghtEdgeFix); }