coords = First@Interpreter["StreetAddress"]["14 James Way, Cambridge MA"];
For the first part of the question, you can extract and post-process the callout graphics primitives from ListPlot[Callout[..]]
and use them with GeoGraphics
:
GeoGraphics[{Polygon[Entity["City", {"Cambridge", "Massachusetts", "UnitedStates"}]],
GeoMarker[coords, Style["\[FilledCircle]", 14, Blue]],
Cases[ListPlot[{Callout[coords, "Hi", "CalloutStyle" -> Red]}], _GraphicsGroup, All] /.
Offset[a_, b_] :> Offset[a, GeoPosition[b]]}]
Alternatively, you can use the CalloutMarker
as the GeoMarker
:
GeoGraphics[{Polygon[Entity["City", {"Cambridge", "Massachusetts", "UnitedStates"}]],
Cases[ListPlot[{Callout[coords, "Hi", "CalloutStyle" -> Red,
CalloutMarker -> "Star"]}], _GraphicsGroup, All] /.
{Offset[a_, b_] :> Offset[a, GeoPosition[b]],
Inset[a_, b_, c__] :> Inset[a, GeoGridPosition[GeoPosition[b], "Mercator"], c]}}]
With the options GeoProjection -> {"Bonne", "Centering" -> {0, 0}}
and GeoRange -> "World"
we get