我见过很多其他类似的问题(here、here 和 here),但他们都接受了不能解决我的问题的答案。我发现该问题的最佳解决方案是 StyledMarker 库,它允许您为标记定义自定义颜色,但我无法让它使用默认标记(当您进行谷歌地图搜索时获得的标记) - 中间有一个点),它似乎只是提供带有字母或特殊图标的标记。
您可以使用以下网址从 Google charts api 动态请求图标图像:
http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|FE7569
https://i.stack.imgur.com/cdiAE.png
而且您还需要一个单独的阴影图像(这样它就不会与附近的图标重叠):
http://chart.apis.google.com/chart?chst=d_map_pin_shadow
https://i.stack.imgur.com/A46OX.png
构建 MarkerImage 时,您需要相应地设置大小和锚点:
var pinColor = "FE7569";
var pinImage = new google.maps.MarkerImage("http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|" + pinColor,
new google.maps.Size(21, 34),
new google.maps.Point(0,0),
new google.maps.Point(10, 34));
var pinShadow = new google.maps.MarkerImage("http://chart.apis.google.com/chart?chst=d_map_pin_shadow",
new google.maps.Size(40, 37),
new google.maps.Point(0, 0),
new google.maps.Point(12, 35));
然后,您可以使用以下命令将标记添加到地图中:
var marker = new google.maps.Marker({
position: new google.maps.LatLng(0,0),
map: map,
icon: pinImage,
shadow: pinShadow
});
https://i.stack.imgur.com/cdiAE.png
归功于 Jack B Nimble 的灵感;)
如果您使用 Google Maps API v3,您可以使用 setIcon
,例如
marker.setIcon('http://maps.google.com/mapfiles/ms/icons/green-dot.png')
或作为标记初始化的一部分:
marker = new google.maps.Marker({
icon: 'http://...'
});
其他颜色:
蓝色标记
红色标记
紫色记号笔
黄色标记
绿色标记
使用以下代码更新具有不同颜色的默认标记。
(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ROSE)
这是使用 Google Maps API 本身的一个很好的解决方案。没有外部服务,没有额外的图书馆。它支持自定义形状以及多种颜色和样式。该解决方案使用矢量标记,googlemaps api 将其称为 Symbols。
除了少数有限的预定义符号外,您还可以通过指定 SVG 路径字符串 (Spec) 来制作任何颜色的任何形状。
要使用它,您无需将“图标”标记选项设置为图像 url,而是将其设置为包含符号选项的字典。例如,我设法制作了一个与标准标记非常相似的符号:
function pinSymbol(color) {
return {
path: 'M 0,0 C -2,-20 -10,-22 -10,-30 A 10,10 0 1,1 10,-30 C 10,-22 2,-20 0,0 z M -2,-30 a 2,2 0 1,1 4,0 2,2 0 1,1 -4,0',
fillColor: color,
fillOpacity: 1,
strokeColor: '#000',
strokeWeight: 2,
scale: 1,
};
}
var marker = new google.maps.Marker({
map: map,
position: new google.maps.LatLng(latitude, longitude),
icon: pinSymbol("#FFF"),
});
https://i.stack.imgur.com/sBnjv.png
如果您小心地将形状关键点保持在 0,0,您就不必定义标记图标居中参数。另一个路径示例,没有点的相同标记:
path: 'M 0,0 C -2,-20 -10,-22 -10,-30 A 10,10 0 1,1 10,-30 C 10,-22 2,-20 0,0 z',
https://i.stack.imgur.com/Cvw7X.png
在这里你有一个非常简单和丑陋的彩色标志:
path: 'M 0,0 -1,-2 V -43 H 1 V -2 z M 1,-40 H 30 V -20 H 1 z',
https://i.stack.imgur.com/BfEEV.png
您还可以使用 Inkscape(GNU-GPL,多平台)等可视化工具创建路径。一些有用的提示:
Google API 只接受单个路径,因此您必须将任何其他对象(正方形、圆环...)转换为路径并将它们作为一个单独的路径加入。路径菜单中的两个命令。
要将路径移动到 (0,0),请转到路径编辑模式 (F2) 选择所有控制节点并拖动它们。用 F1 移动对象,不会改变路径节点坐标。
为确保参考点位于 (0,0),您可以单独选择它并在顶部工具栏上手动编辑坐标。
保存作为 XML 的 SVG 文件后,使用编辑器打开它,查找 svg:path 元素并复制“d”属性的内容。
好吧,我能用 StyledMarker 得到的最接近的东西是 this。
不过,中间的子弹并不像默认子弹那么大。 StyledMarker 类只是构建这个 url 并要求 google api 创建标记。
在 class use example 中,使用 "%E2%80%A2" 作为您的文本,如下所示:
var styleMaker2 = new StyledMarker({styleIcon:new StyledIcon(StyledIconTypes.MARKER,{text:"%E2%80%A2"},styleIconClass),position:new google.maps.LatLng(37.263477473067, -121.880502070713),map:map});
您将需要修改 StyledMarker.js 以注释掉以下行:
if (text_) {
text_ = text_.substr(0,2);
}
因为这会将文本字符串修剪为 2 个字符。
或者,您可以使用您想要的颜色基于默认图像创建自定义标记图像,并使用如下代码覆盖默认标记:
marker = new google.maps.Marker({
map:map,
position: latlng,
icon: new google.maps.MarkerImage(
'http://www.gettyicons.com/free-icons/108/gis-gps/png/24/needle_left_yellow_2_24.png',
new google.maps.Size(24, 24),
new google.maps.Point(0, 0),
new google.maps.Point(0, 24)
)
});
我对 vokimon's answer 进行了一些扩展,使其也更方便地更改其他属性。
function customIcon (opts) {
return Object.assign({
path: 'M 0,0 C -2,-20 -10,-22 -10,-30 A 10,10 0 1,1 10,-30 C 10,-22 2,-20 0,0 z M -2,-30 a 2,2 0 1,1 4,0 2,2 0 1,1 -4,0',
fillColor: '#34495e',
fillOpacity: 1,
strokeColor: '#000',
strokeWeight: 2,
scale: 1,
}, opts);
}
用法:
marker.setIcon(customIcon({
fillColor: '#fff',
strokeColor: '#000'
}));
或者在定义新标记时:
const marker = new google.maps.Marker({
position: {
lat: ...,
lng: ...
},
icon: customIcon({
fillColor: '#2ecc71'
}),
map: map
});
嗨,您可以将图标用作 SVG 并设置颜色。看到这个代码
/* * 将地图和地点声明为全局变量 */ var map; var places = [ ['Place 1', "
从 google maps API 3.11 版开始,Icon
对象替换了 MarkerImage
。 Icon 支持与 MarkerImage 相同的参数。我什至发现它更直截了当。
一个示例可能如下所示:
var image = {
url: place.icon,
size: new google.maps.Size(71, 71),
origin: new google.maps.Point(0, 0),
anchor: new google.maps.Point(17, 34),
scaledSize: new google.maps.Size(25, 25)
};
如需更多信息check this site
正如其他人所提到的,vokimon's answer 很棒,但不幸的是,当同时有许多基于 SymbolPath/SVG 的标记时,Google 地图有点慢。
看起来使用数据 URI 的速度要快得多,与 PNG 大致相当。
此外,由于它是一个完整的 SVG 文档,因此可以为点使用适当的实心圆。修改了路径,使其不再偏移到左上角,因此需要定义锚点。
这是生成这些标记的修改版本:
var coloredMarkerDef = {
svg: [
'<svg viewBox="0 0 22 41" width="22px" height="41px" xmlns="http://www.w3.org/2000/svg">',
'<path d="M 11,41 c -2,-20 -10,-22 -10,-30 a 10,10 0 1 1 20,0 c 0,8 -8,10 -10,30 z" fill="{fillColor}" stroke="#ffffff" stroke-width="1.5"/>',
'<circle cx="11" cy="11" r="3"/>',
'</svg>'
].join(''),
anchor: {x: 11, y: 41},
size: {width: 22, height: 41}
};
var getColoredMarkerSvg = function(color) {
return coloredMarkerDef.svg.replace('{fillColor}', color);
};
var getColoredMarkerUri = function(color) {
return 'data:image/svg+xml,' + encodeURIComponent(getColoredMarkerSvg(color));
};
var getColoredMarkerIcon = function(color) {
return {
url: getColoredMarkerUri(color),
anchor: coloredMarkerDef.anchor,
size: coloredMarkerDef.size,
scaledSize: coloredMarkerDef.size
}
};
用法:
var marker = new google.maps.Marker({
map: map,
position: new google.maps.LatLng(latitude, longitude),
icon: getColoredMarkerIcon("#FFF")
});
缺点,很像 PNG 图像,是整个矩形都是可点击的。理论上,trace the SVG path 并生成一个 MarkerShape 多边形并不难。
stroke="{strokeColor}"
使其更加可定制。
在 Internet Explorer 中,此解决方案不适用于 ssl。可以在控制台中看到错误为:SEC7111:HTTPS 安全性因此受到损害,解决方法:作为此处的一位用户建议将 chart.apis.google.com 替换为 chart.googleapis.com 的 URL 路径以避免 SSL 错误。
您可以使用此代码,它工作正常。
var pinImage = new google.maps.MarkerImage("http://www.googlemapsmarkers.com/v1/009900/");<br>
var marker = new google.maps.Marker({
position: yourlatlong,
icon: pinImage,
map: map
});
将路径绘制轮廓的 symbol-based 标记与中心的“●”字符组合在一起。您可以根据需要将点替换为其他文本(“A”、“B”等)。
此函数返回具有给定文本(如果有)、文本颜色和填充颜色的标记的选项。它使用文本颜色作为轮廓。
function createSymbolMarkerOptions(text, textColor, fillColor) {
return {
icon: {
path: 'M 0,0 C -2,-20 -10,-22 -10,-30 A 10,10 0 1,1 10,-30 C 10,-22 2,-20 0,0 z',
fillColor: fillColor,
fillOpacity: 1,
strokeColor: textColor,
strokeWeight: 1.8,
labelOrigin: { x: 0, y: -30 }
},
label: {
text: text || '●',
color: textColor
}
};
}
我尝试了两种方法来创建自定义谷歌地图标记,这个使用canvg.js的运行代码是浏览器的最佳兼容性。注释掉的代码目前不支持IE11。
变量标记; var CustomShapeCoords = [16, 1.14, 21, 2.1, 25, 4.2, 28, 7.4, 30, 11.3, 30.6, 15.74, 25.85, 26.49, 21.02, 31.89, 15.92, 43.86, 10.92, 9, 2.6, 10.92, 31.89, 1.6 15.74、2.1、11.3、4、7.4、7.1、4.2、11、2.1、16、1.14]; function initMap() { var map = new google.maps.Map(document.getElementById('map'), { zoom: 13, center: { lat: 59.325, lng: 18.070 } }); var markerOption = {纬度:59.327,经度:18.067,颜色:“#”+“000”,文本:“ha”};标记 = createMarker(markerOption);标记.setMap(地图); marker.addListener('click', changeColorAndText); };函数 changeColorAndText() { var iconTmpObj = createSvgIcon( "#c00", "ok" ); marker.setOptions( { icon: iconTmpObj } ); }; function createMarker(options) { //IE MarkerShape 有问题 var markerObj = new google.maps.Marker({ icon: createSvgIcon(options.color, options.text), position: { lat: parseFloat(options.latitude), lng: parseFloat(options.longitude) }, draggable: false, visible: true, zIndex: 10, shape: { coords: CustomShapeCoords, type: 'poly' } });返回标记物; };函数 createSvgIcon(color, text) { var div = $("
"); var svg = $( '' ); div.append(svg); var dd = $("我尝试了很长时间来改进 vokimon 的绘制标记,使其更类似于谷歌地图(并且几乎成功)。这是我得到的代码:
let circle=true;
path = 'M 0,0 C -0.7,-9 -3,-14 -5.5,-18.5 '+
'A 16,16 0 0,1 -11,-29 '+
'A 11,11 0 1,1 11,-29 '+
'A 16,16 0 0,1 5.5,-18.5 '+
'C 3,-14 0.7,-9 0,0 z '+
['', 'M -2,-28 '+
'a 2,2 0 1,1 4,0 2,2 0 1,1 -4,0'][new Number(circle)];
我还将它缩放了 0.8。
这些是自定义圆形标记
小红:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAiklEQVR42mNgQIAoIF4NxGegdCCSHAMzEC+NUlH5v9rF5f+ZoCAwHaig8B8oPhOmKC1NU/P//7Q0DByrqgpSGAtSdOCAry9WRXt9fECK9oIUPXwYFYVV0e2ICJCi20SbFAuyG5uiECUlkKIQmOPng3y30d0d7Lt1bm4w301jQAOgcNoIDad1yOEEAFm9fSv/VqtJAAAAAElFTkSuQmCC
小黄:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAi0lEQVR42mNgQIAoIF4NxGegdCCSHAMzEC+NijL7v3p1+v8zZ6rAdGCg4X+g+EyYorS0NNv////PxMCxsRYghbEgRQcOHCjGqmjv3kKQor0gRQ8fPmzHquj27WaQottEmxQLshubopAQI5CiEJjj54N8t3FjFth369ZlwHw3jQENgMJpIzSc1iGHEwB8p5qDBbsHtAAAAABJRU5ErkJggg==
小绿:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAiElEQVR42mNgQIAoIF4NxGegdCCSHAMzEC81izL7n746/X/VmSowbRho+B8oPhOmKM02zfb/TCzQItYCpDAWpOhA8YFirIoK9xaCFO0FKXrY/rAdq6Lm280gRbeJNikWZDc2RUYhRiBFITDHzwf5LmtjFth3GesyYL6bxoAGQOG0ERpO65DDCQDX7ovT++K9KQAAAABJRU5ErkJggg==
小蓝:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAiklEQVR42mNgQIAoIF4NxGegdCCSHAMzEC81M4v6n56++n9V1RkwbWgY+B8oPhOmKM3WNu3/zJn/MbCFRSxIYSxI0YHi4gNYFRUW7gUp2gtS9LC9/SFWRc3Nt0GKbhNtUizIbmyKjIxCQIpCYI6fD/JdVtZGsO8yMtbBfDeNAQ2AwmkjNJzWIYcTAMk+i9OhipcQAAAAAElFTkSuQmCC
小紫色:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAi0lEQVR42mNgQIAoIF4NxGegdCCSHAMzEC+NMov6vzp99f8zVWfAdKBh4H+g+EyYorQ027T//2f+x8CxFrEghbEgRQcOFB/Aqmhv4V6Qor0gRQ8ftj/Equh2822QottEmxQLshubohCjEJCiEJjj54N8tzFrI9h36zLWwXw3jQENgMJpIzSc1iGHEwBt95qDejjnKAAAAABJRU5ErkJggg==
它们是 9x9 png 图像。
一旦它们出现在您的页面上,您只需将它们拖走,您就会拥有实际的 png 文件。
将其更改为 chart.googleapis.com 作为路径,否则 SSL 将不起作用
使用 swift 和 Google Maps Api v3,这是我能够做到的最简单的方法:
icon = GMSMarker.markerImageWithColor(UIColor.blackColor())
希望它可以帮助某人。
有时很简单的事情,可以回答复杂。我并不是说上述任何答案都不正确,但我只是申请,它可以像这样简单地完成:
我知道这个问题很老,但如果有人只想更改别针或标记颜色,请查看文档:https://developers.google.com/maps/documentation/android-sdk/marker
添加标记时,只需设置图标属性:
GoogleMap gMap;
LatLng latLng;
....
// write your code...
....
gMap.addMarker(new MarkerOptions()
.position(latLng)
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
有 10 种默认颜色可供选择。如果这还不够(简单的解决方案),那么我可能会选择其他答案中给出的更复杂的,以满足更复杂的需求。
ps:我在另一个 answer 中写过类似的东西,因此我应该参考那个答案,但上次我这样做时,我被要求发布答案,因为它太短了(就像这个一样) ..
您也可以使用颜色代码。
const marker: Marker = this.map.addMarkerSync({
icon: '#008000',
animation: 'DROP',
position: {lat: 39.0492127, lng: -111.1435662},
map: this.map,
});
不定期副业成功案例分享