public function getImageCornerLatLngs() { $corners = array(); $rotation = -$this->rotation; $corners["ne"] = new LatLng($this->north, $this->east); $corners["nw"] = new LatLng($this->north, $this->west); $corners["sw"] = new LatLng($this->south, $this->west); $corners["se"] = new LatLng($this->south, $this->east); $projectionOrigin = new LatLng(($this->north + $this->south) / 2, ($this->east + $this->west) / 2); $projectedMapCenter = $projectionOrigin->project($projectionOrigin); $projectedCorners = array(); $projectedCorners["ne"] = $corners["ne"]->project($projectionOrigin); $projectedCorners["nw"] = $corners["nw"]->project($projectionOrigin); $projectedCorners["sw"] = $corners["sw"]->project($projectionOrigin); $projectedCorners["se"] = $corners["se"]->project($projectionOrigin); $projectedRotatedCorners = array(); $projectedRotatedCorners["ne"] = LinearAlgebraUtil::rotate($projectedCorners["ne"], $projectedMapCenter, $rotation); $projectedRotatedCorners["nw"] = LinearAlgebraUtil::rotate($projectedCorners["nw"], $projectedMapCenter, $rotation); $projectedRotatedCorners["sw"] = LinearAlgebraUtil::rotate($projectedCorners["sw"], $projectedMapCenter, $rotation); $projectedRotatedCorners["se"] = LinearAlgebraUtil::rotate($projectedCorners["se"], $projectedMapCenter, $rotation); $projectedRotatedCorners = array(); $projectedRotatedCorners["ne"] = LinearAlgebraUtil::rotate($projectedCorners["ne"], $projectedMapCenter, $rotation); $projectedRotatedCorners["nw"] = LinearAlgebraUtil::rotate($projectedCorners["nw"], $projectedMapCenter, $rotation); $projectedRotatedCorners["sw"] = LinearAlgebraUtil::rotate($projectedCorners["sw"], $projectedMapCenter, $rotation); $projectedRotatedCorners["se"] = LinearAlgebraUtil::rotate($projectedCorners["se"], $projectedMapCenter, $rotation); $rotatedCorners = array(); $rotatedCorners["nw"] = $projectedRotatedCorners["nw"]->deproject($projectionOrigin); $rotatedCorners["ne"] = $projectedRotatedCorners["ne"]->deproject($projectionOrigin); $rotatedCorners["sw"] = $projectedRotatedCorners["sw"]->deproject($projectionOrigin); $rotatedCorners["se"] = $projectedRotatedCorners["se"]->deproject($projectionOrigin); return $rotatedCorners; }
private function getKmlLatLonBox($pixelImageCorners, $projectionOrigin, $inverseTransformationMatrix) { // translate corner pixels of map image to projected points $projectedCorners = array(); $projectedCorners["nw"] = LinearAlgebraUtil::transformPoint($pixelImageCorners["nw"], $inverseTransformationMatrix); $projectedCorners["ne"] = LinearAlgebraUtil::transformPoint($pixelImageCorners["ne"], $inverseTransformationMatrix); $projectedCorners["sw"] = LinearAlgebraUtil::transformPoint($pixelImageCorners["sw"], $inverseTransformationMatrix); $projectedCorners["se"] = LinearAlgebraUtil::transformPoint($pixelImageCorners["se"], $inverseTransformationMatrix); // get rotation $dx = $projectedCorners["nw"]->x - $projectedCorners["sw"]->x; $dy = $projectedCorners["nw"]->y - $projectedCorners["sw"]->y; $mapRotation = $dy == 0 ? 0 : -atan($dx / $dy); // in radians $corners = array(); $corners["nw"] = $projectedCorners["nw"]->deproject($projectionOrigin); $corners["ne"] = $projectedCorners["ne"]->deproject($projectionOrigin); $corners["sw"] = $projectedCorners["sw"]->deproject($projectionOrigin); $corners["se"] = $projectedCorners["se"]->deproject($projectionOrigin); $mapCenter = new LatLng($corners["nw"]->lat / 4 + $corners["ne"]->lat / 4 + $corners["sw"]->lat / 4 + $corners["se"]->lat / 4, $corners["nw"]->lng / 4 + $corners["ne"]->lng / 4 + $corners["sw"]->lng / 4 + $corners["se"]->lng / 4); $projectedMapCenter = $mapCenter->project($projectionOrigin); $projectedRotatedCorners = array(); $projectedRotatedCorners["nw"] = LinearAlgebraUtil::rotate($projectedCorners["nw"], $projectedMapCenter, $mapRotation); $projectedRotatedCorners["ne"] = LinearAlgebraUtil::rotate($projectedCorners["ne"], $projectedMapCenter, $mapRotation); $projectedRotatedCorners["sw"] = LinearAlgebraUtil::rotate($projectedCorners["sw"], $projectedMapCenter, $mapRotation); $projectedRotatedCorners["se"] = LinearAlgebraUtil::rotate($projectedCorners["se"], $projectedMapCenter, $mapRotation); $rotatedCorners = array(); $rotatedCorners["nw"] = $projectedRotatedCorners["nw"]->deproject($projectionOrigin); $rotatedCorners["ne"] = $projectedRotatedCorners["ne"]->deproject($projectionOrigin); $rotatedCorners["sw"] = $projectedRotatedCorners["sw"]->deproject($projectionOrigin); $rotatedCorners["se"] = $projectedRotatedCorners["se"]->deproject($projectionOrigin); // get latlng bounding box $box = new KmlLatLonBox(); $box->north = max($rotatedCorners["nw"]->lat, $rotatedCorners["ne"]->lat, $rotatedCorners["sw"]->lat, $rotatedCorners["se"]->lat); $box->south = min($rotatedCorners["nw"]->lat, $rotatedCorners["ne"]->lat, $rotatedCorners["sw"]->lat, $rotatedCorners["se"]->lat); $box->east = max($rotatedCorners["nw"]->lng, $rotatedCorners["ne"]->lng, $rotatedCorners["sw"]->lng, $rotatedCorners["se"]->lng); $box->west = min($rotatedCorners["nw"]->lng, $rotatedCorners["ne"]->lng, $rotatedCorners["sw"]->lng, $rotatedCorners["se"]->lng); $box->rotation = $mapRotation; // still in radians, will get converted to degrees later on return $box; }