Due to the non-sphericity of the Earth, there is no exact way of rotating a polygon, but the following is a good approximation.
Suppose we want to rotate the UK polygon so that London is moved to Lansing:
In[]:= london = GeoPosition[Entity["City", {"London", "GreaterLondon", "UnitedKingdom"}]];
In[]:= lansing = GeoPosition[Entity["City", {"Lansing", "Michigan", "UnitedStates"}]];
That means we need to implement these changes in latitude and longitude:
In[]:= dlat = Latitude[lansing] - Latitude[london]
Out[]= Quantity[-8.79021, "AngularDegrees"]
In[]:= dlon = Longitude[lansing] - Longitude[london]
Out[]= Quantity[-84.4396, "AngularDegrees"]
We will do it in two steps, first changing latitudes along the London meridian and then changing longitudes along the Lansing parallel. This will preserve the North-orientation of the UK.
In[]:= axis = FromSphericalCoordinates[{1, Pi/2, -Pi/2 + Normal@Longitude[london]}];
Out[]= {-0.00203622, -0.999998, 0};
In[]:= rot = Transpose[RotationMatrix[dlon, {0, 0, 1}].RotationMatrix[dlat, axis]];
Get the points of our polygon of the UK:
In[]:= UK = First@EntityValue[Entity["Country", "UnitedKingdom"], "Polygon"];
Finally perform the rotation (note that we act with the rot matrix on the right, which explains the use of Transpose before):
In[]:= newUK = GeoPosition@ GeoPositionXYZ[Dot[#, rot] & /@ First@GeoPositionXYZ[UK]];
Now we can plot:
In[]:= GeoGraphics[{GeoMarker[lansing], Polygon[newUK]}]
