Skip to main content
3 of 6
added 44 characters in body
kglr
  • 400.5k
  • 18
  • 488
  • 929
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, GeoGridPosition[GeoPosition[b], "Mercator"]]}]

enter image description here

kglr
  • 400.5k
  • 18
  • 488
  • 929