В основном вам нужен код для проекции поперечной проекции Меркатора (который используется картами Google и другими). Вот фрагмент кода C #, который я использовал в своем программном обеспечении Kosmos :
public Point2<int> ConvertMapToViewCoords (Point2<double> mapCoords)
{
double x = (mapCoords.X - MapPosition.Longitude) / resolution;
double y = Math.Log (Math.Tan (Math.PI*(0.25 + mapCoords.Y/360)))*u180dPiResolution;
return new Point2<int> ((int)(x + viewWidthHalf), (int)((y0 - y) + viewHeightHalf));
}
используемые переменные:
double resolution = 360.0 / (Math.Pow (2, MapPosition.ZoomFactor) * 256);
double u180dPiResolution = 40.7436654315252 * Math.Pow(2, MapPosition.ZoomFactor);
double y0 = Math.Log(Math.Tan(Math.PI * (0.25 + MapPosition.Latitude / 360))) * u180dPiResolution;
float viewWidthHalf = ViewWidth / 2.0f;
float viewHeightHalf = ViewHeight / 2.0f;
ZoomFactor - это уровень масштабирования Google (см. http://laudontech.com/GISBlog/?p=28).
Кстати, один и тот же код работает для OpenStreetMap, Yahoo Maps и т. Д., Поскольку все они используют одну и ту же систему проецирования и листов.