Карта Google в качестве фона для моей карты Sharpmap не выравнивается правильно
Я занимаюсь этим довольно давно. Здесь я пытаюсь добиться добавления карты Google в качестве фонового слоя к моей карте Sharpmap. Я могу добиться этого, но проблема, с которой я сейчас сталкиваюсь, заключается в том, что моя карта всегда находится в центре рядом с Гренландским морем на карте Google., как будто это не займет мои координаты центральной точки.
Я использую Sharpmap 1.1 с BruTile 0.7.4.4
Пока что я сделал ниже.
SharpMap.Map _map = new SharpMap.Map();
SharpMap.Layers.VectorLayer layer = new SharpMap.Layers.VectorLayer("parcel");
SharpMap.Data.Providers.MsSqlSpatial DBlayer = new SharpMap.Data.Providers.MsSqlSpatial(_connectionString, "XXXXXX", "XXXX", "XXX");
layer.Style.Fill = new SolidBrush(Color.Transparent);
layer.Style.Outline = new Pen(Color.Black);
layer.Style.EnableOutline = true;
layer.MaxVisible = 13000;
layer.DataSource = DBlayer;
ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory ctFact = new ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory();
layer.CoordinateTransformation = ctFact.CreateFromCoordinateSystems(ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84, ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WebMercator);
layer.ReverseCoordinateTransformation = ctFact.CreateFromCoordinateSystems(ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WebMercator, ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84);
//SharpMap.Layers.TileLayer layerBackground = new TileLayer(new BingTileSource(BingRequest.UrlBing, "", BingMapType.Aerial), "TileLayer");
SharpMap.Layers.TileLayer layerBackground = new TileLayer(new GoogleTileSource(GoogleMapType.GoogleMap), "googlemaps");
_map.Layers.Add(layerBackground);
_map.Layers.Add(layer);
_map.BackColor = Color.White;
//-98.526890,29.411539
_map.Center = new GeoAPI.Geometries.Coordinate(0,0);
return _map;
Даже если я даю географические координаты вручную, он просто указывает на одно и то же место в море.
Пожалуйста, смотрите ниже карту Google Geo point, это точка, где моя карта отображается в центре. Каждый раз, когда я генерирую, независимо от того, что я делаю, это показывает эту точку как ее центр.
71,946088, -3,956171
Буду признателен за любую оказанную помощь. Спасибо и ура!
1 ответ
Я обнаружил проблему с тем, что слой карты Google не центрируется. Причина в том, что я использовал QGIS для преобразования моего шейп-файла ESRI из формата WGS84(EPSG:4326) в Spherical Mercator(EPSG:900913), и он изменил формат координат, но
Карты Google используют Google Maps Global Mercator (Сферический Меркатор).
Когда я использовал онлайн-конвертер, чтобы проверить это, вы можете найти здесь. Когда я дал результирующие координаты, все получилось просто отлично. Теперь все, что мне нужно сделать, это найти способ конвертировать Google Maps Global Mercator (Spherical Mercator). Спасибо за вашу помощь @pauldendulk.
Я столкнулся с той же проблемой, и в своих примерах они предоставляют LatLongToGoogle
функция преобразования
public static ICoordinateTransformation LatLonToGoogle()
{
CoordinateSystemFactory csFac = new CoordinateSystemFactory();
CoordinateTransformationFactory ctFac = new CoordinateTransformationFactory();
IGeographicCoordinateSystem sourceCs = csFac.CreateGeographicCoordinateSystem(
"WGS 84",
AngularUnit.Degrees,
HorizontalDatum.WGS84,
PrimeMeridian.Greenwich,
new AxisInfo("north", AxisOrientationEnum.North),
new AxisInfo("east", AxisOrientationEnum.East));
List<ProjectionParameter> parameters = new List<ProjectionParameter>
{
new ProjectionParameter("semi_major", 6378137.0),
new ProjectionParameter("semi_minor", 6378137.0),
new ProjectionParameter("latitude_of_origin", 0.0),
new ProjectionParameter("central_meridian", 0.0),
new ProjectionParameter("scale_factor", 1.0),
new ProjectionParameter("false_easting", 0.0),
new ProjectionParameter("false_northing", 0.0)
};
IProjection projection = csFac.CreateProjection("Google Mercator", "mercator_1sp", parameters);
IProjectedCoordinateSystem targetCs = csFac.CreateProjectedCoordinateSystem(
"Google Mercator",
sourceCs,
projection,
LinearUnit.Metre,
new AxisInfo("East", AxisOrientationEnum.East),
new AxisInfo("North", AxisOrientationEnum.North));
ICoordinateTransformation transformation = ctFac.CreateFromCoordinateSystems(sourceCs, targetCs);
return transformation;