7

我想知道是否有人在同一版本中实现了谷歌地图V2和百度地图;因为通用汽车在中国没有按预期工作?

还是应该将项目分成两个分支?但是,最好跳过维护两个分支。

4

6 回答 6

3

我的解决方案是像往常一样实施 GM,但是如果用户有中国设置(通过设置)静态地图将被使用,但静态地图是从百度而不是谷歌获取的。

staticUrl = "http://api.map.baidu.com/staticimage?center=" 
                + location.getLongitude() + "," + location.getLatitude() 
                + "&width=" + width + "&height=" + width + "&zoom=15"
                + "&markers=" + location.getLongitude() + "," + location.getLatitude();

https://api.map.baidu.com/staticimage?center=121,31&width=300&height=300&zoom=15的结果:

百度地图瓦片

如果尝试实施真实地图解决方案,不建议使用此方法。由于我只有不同国家使用的不同位置,因此可以使用此解决方案。

所以,这就是我解决它的方法。希望有人觉得这很有帮助。

于 2014-01-21T13:59:29.663 回答
2

另外,我发现如果你在中国使用http://ditu.google.cn,它确实有效。

在你的应用中使用中国的在线地图时,无论是谷歌地图还是百度,都会因为法律原因而发生经纬度的变换

谷歌地图中的卫星视图使用“地球”(WGS-84)坐标。GMaps中国地图视图使用“火星”坐标(GCJ-02),两者之间有代码转换。百度地图使用“熊掌”坐标,偏移量不同。百度地图 API 有一个在谷歌坐标和它自己的系统之间转换的演示

在中国,GPS 和所有东西一样,有一层额外的复杂性 :)

如果您已构建此应用程序,请发布详细信息。有百度地图的英文界面会很棒。

于 2014-10-20T00:49:33.853 回答
1

您可以同时使用谷歌地图和百度地图,但请确保将 WGS-84 坐标(世界大部分地区使用)转换为百度坐标(BD-09,与中国的 GCJ-02 不同)。以下是基于百度地图 API 示例的一些代码:

// Google coordinates
var gPoint = new BMap.Point(121.4914, 31.2423);  // lon, lat of the Bund Museum in Shanghai - https://www.google.com/maps/@31.2423,121.4914,19z
// gPoint = new BMap.Point(-122.0851053, 37.4219593);  // lon, lat of the Googleplex (no Baidu map data but zooms out in Mountain View)

var labelOffset = { offset: new BMap.Size(20, -10) };

// Initialize map
var map = new BMap.Map('allmap');
map.centerAndZoom(gPoint, 15);
map.addControl(new BMap.ScaleControl({anchor: BMAP_ANCHOR_TOP_LEFT}));  // add scale
map.addControl(new BMap.NavigationControl());
map.addControl(new BMap.MapTypeControl());   // map type control: street/satellite/2.5D
map.enableScrollWheelZoom();  // mouse wheel scroll is disabled by default

// Add Google marker and label
var markerG = new BMap.Marker(gPoint);
map.addOverlay(markerG);
markerG.setLabel(new BMap.Label('Google coordinates marker appears<br/>at incorrect location on Baidu Map', labelOffset));

// Coordinate conversion ... GCJ-02 coordinates ... Baidu coordinates
BMap.Convertor.translate(gPoint, 2, function (point) {
  var marker = new BMap.Marker(point);
  map.addOverlay(marker);
  marker.setLabel(new BMap.Label('Converted to Baidu coordinates:<br/>' +
    point.lng + ', ' +
    point.lat +
    '<br/>(note the offset of ' + (map.getDistance(gPoint, point)).toFixed(2) + ' meters)',
  labelOffset));
  
  map.addOverlay(new BMap.Polyline([gPoint, point]));  // draw a line between points

});
<style type="text/css">
	body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=gd0GyxGUxSCoAbmdyQBhyhrZ"></script>
<script type="text/javascript" src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script>

<div id="allmap"></div>

如果上面的代码片段由于 StackOverflow 沙箱脚本的方式而无法正常工作,请尝试Google -> 百度坐标转换的 JSbin 演示

如果您必须离线执行转换,请查看 GitHub 上的evil transform项目。

目前尚不清楚中文本地化的浏览器将通过navigator.geolocationAPI 返回哪些坐标类型。我为此制作了一个测试应用程序,并将问题发布在
Showing navigator.geolocation.getCurrentPosition in Baidu Maps

进一步阅读:

于 2015-04-06T09:12:44.803 回答
1

可能有点晚了,但我最近偶然发现了一些可能对你有帮助的东西。

我尝试了百度地图,设置起来非常困难,使用起来也很糟糕,所以我环顾四周,突然间,谷歌地图在没有 vpn 的情况下对我有用!

我意识到旧的谷歌中国服务器仍然处于活动状态,如果你尝试:

maps.google.cn

您会发现使用 google.cn 地址创建 iframe 是可行的!

于 2015-08-05T02:01:51.050 回答
0

尝试使用这种方式与谷歌坐标

http://api.map.baidu.com/marker?location=39.916979519873,116.41004950566&output=html
于 2020-03-06T10:33:41.520 回答
-1

如果您的服务器可以毫无问题地访问 GM(例如,您的主机不在中国大陆或它在但有未经审查的连接),为什么您不让服务器从 GM 加载数据并将其路由给用户呢?我们过去为几个项目这样做过,就像一个魅力。

ps 你可以让 php 从 GM 中提取请求的 long/lat 静态地图,将其存储到服务器上的临时文件中,然后将 url 传回临时文件。从用户的角度来看,他们将查看(静态)GM。

pps 如果您需要用户能够使用 GM 的 UI(进行平移/缩放),那么您需要一个更复杂的 php 来更改从 GM 加载的所有 JS,因此所有数据仍将被请求到您的服务器,然后得到地图 - 所以基本上是为了避免来自客户端机器的任何请求发送到 GM 服务器,而是全部发送到您的服务器。

于 2014-04-09T06:18:28.383 回答