我想知道是否有人在同一版本中实现了谷歌地图V2和百度地图;因为通用汽车在中国没有按预期工作?
还是应该将项目分成两个分支?但是,最好跳过维护两个分支。
我想知道是否有人在同一版本中实现了谷歌地图V2和百度地图;因为通用汽车在中国没有按预期工作?
还是应该将项目分成两个分支?但是,最好跳过维护两个分支。
我的解决方案是像往常一样实施 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的结果:
如果尝试实施真实地图解决方案,不建议使用此方法。由于我只有不同国家使用的不同位置,因此可以使用此解决方案。
所以,这就是我解决它的方法。希望有人觉得这很有帮助。
另外,我发现如果你在中国使用http://ditu.google.cn,它确实有效。
在你的应用中使用中国的在线地图时,无论是谷歌地图还是百度,都会因为法律原因而发生经纬度的变换。
谷歌地图中的卫星视图使用“地球”(WGS-84)坐标。GMaps中国地图视图使用“火星”坐标(GCJ-02),两者之间有代码转换。百度地图使用“熊掌”坐标,偏移量不同。百度地图 API 有一个在谷歌坐标和它自己的系统之间转换的演示。
在中国,GPS 和所有东西一样,有一层额外的复杂性 :)
如果您已构建此应用程序,请发布详细信息。有百度地图的英文界面会很棒。
您可以同时使用谷歌地图和百度地图,但请确保将 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.geolocation
API 返回哪些坐标类型。我为此制作了一个测试应用程序,并将问题发布在
Showing navigator.geolocation.getCurrentPosition in Baidu Maps。
进一步阅读:
可能有点晚了,但我最近偶然发现了一些可能对你有帮助的东西。
我尝试了百度地图,设置起来非常困难,使用起来也很糟糕,所以我环顾四周,突然间,谷歌地图在没有 vpn 的情况下对我有用!
我意识到旧的谷歌中国服务器仍然处于活动状态,如果你尝试:
maps.google.cn
您会发现使用 google.cn 地址创建 iframe 是可行的!
尝试使用这种方式与谷歌坐标
http://api.map.baidu.com/marker?location=39.916979519873,116.41004950566&output=html
如果您的服务器可以毫无问题地访问 GM(例如,您的主机不在中国大陆或它在但有未经审查的连接),为什么您不让服务器从 GM 加载数据并将其路由给用户呢?我们过去为几个项目这样做过,就像一个魅力。
ps 你可以让 php 从 GM 中提取请求的 long/lat 静态地图,将其存储到服务器上的临时文件中,然后将 url 传回临时文件。从用户的角度来看,他们将查看(静态)GM。
pps 如果您需要用户能够使用 GM 的 UI(进行平移/缩放),那么您需要一个更复杂的 php 来更改从 GM 加载的所有 JS,因此所有数据仍将被请求到您的服务器,然后得到地图 - 所以基本上是为了避免来自客户端机器的任何请求发送到 GM 服务器,而是全部发送到您的服务器。