Leaflet: L.Icon.Default๊ฐ€ ์ž˜๋ชป๋œ ์ด๋ฏธ์ง€ URL์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 09์›” 28์ผ  ยท  90์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Leaflet/Leaflet

  • [ x] ๋„์›€์„ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ๋ฒ„๊ทธ๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.
  • [ ] ๋™์ž‘์ด ๋ฌธ์„œํ™”๋˜๊ณ  ์˜ˆ์ƒ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์„œ ๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
  • [x ] ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‚ด ์ž์‹ ์˜ ์ฝ”๋“œ๋‚˜ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ(Cordova, Ionic, Angular, Reactโ€ฆ)์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ „๋‹จ์ง€ ์ฝ”๋“œ ๋ฌธ์ œ๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.
  • [ ] ๋ฌธ์ œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์•„์ง ๋ณด๊ณ ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

์ €์—๊ฒŒ ์ œ๊ณต๋˜๋Š” ์ด๋ฏธ์ง€ URL ์ „๋‹จ์ง€๋Š” https://uismedia.geo-info-manager.com/apis/leaflet_1/imagesmarker-icon-2x.png์ž…๋‹ˆ๋‹ค. "/"๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค
leaflet.min.js:5 GET https://uismedia.geo-info-manager.com/apis/leaflet_1/images/403 (๊ธˆ์ง€๋จ)

compatibility

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ž˜๋ชป๋œ data:url ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๊ฐ€ ํ•œ ์ผ์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋ณธ ์•„์ด์ฝ˜์„ ์ œ๊ณต๋œ ๋งˆ์ปค ์•„์ด์ฝ˜๊ณผ ๊ทธ๋ฆผ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒˆ ์•„์ด์ฝ˜์œผ๋กœ ์„ค์ •ํ•˜์ง€๋งŒ webpack์ด ํ•ด๋‹น ์ด๋ฏธ์ง€์˜ ๋ฐ์ดํ„ฐ ์ธ์ฝ”๋”ฉ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋”˜๊ฐ€์— ์ด์™€ ๊ฐ™์€ ํŒŒ์ผ์„ ํฌํ•จํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

import L from 'leaflet';

import icon from 'leaflet/dist/images/marker-icon.png';
import iconShadow from 'leaflet/dist/images/marker-shadow.png';

let DefaultIcon = L.icon({
    iconUrl: icon,
    shadowUrl: iconShadow
});

L.Marker.prototype.options.icon = DefaultIcon;

๋ง๋ง‰ ์•„์ด์ฝ˜๋„ ํฌํ•จํ•˜๋„๋ก ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  90 ๋Œ“๊ธ€

  • ์„œ๋ฒ„์— ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐœ ์›นํŽ˜์ด์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ์–ด๋–ค OS์™€ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

leaflet.min.js:5 GET https://uismedia.geo-info-manager.com/apis/leaflet_1/images/403 (๊ธˆ์ง€๋จ)

์ด๊ฒƒ์€ https://github.com/Leaflet/Leaflet/issues/4849 ์—์„œ ๋…ผ์˜๋œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก . ์ด๊ฒƒ์ด ์žฌํ˜„๋  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„ ์•Œ๊ณ  ์ด์— ๋Œ€ํ•ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

RC3์—์„œ 1.0.1๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ฝ”๋“œ์—๋Š” L.Icon.Default.imagePath = 'images' ์ค„์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. - ์™œ ๊ทธ๋žฌ๋Š”์ง€ ์ž˜ ๊ธฐ์–ต๋‚˜์ง€ ์•Š์ง€๋งŒ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๊ฐ‘์ž๊ธฐ webpack๊ณผ ์ „๋‹จ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋‘ ํ”„๋กœ์ ํŠธ์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
์ง€๋„์— ๋งˆ์ปค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด๋ฏธ์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
image

์ข‹์•„, ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ์–ป์—ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ˜„์žฌ ์ด๋ฏธ์ง€(์•„์ด์ฝ˜ ๋ฐ ๊ทธ๋ฆผ์ž)๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ปค๊ฐ€ ์ด์™€ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค.
image

์ „๋‹จ์ง€์˜ ์ด ๊ธฐ๋Šฅ:

_getIconUrl: function (name) {
    if (!L.Icon.Default.imagePath) {    // Deprecated, backwards-compatibility only
        L.Icon.Default.imagePath = this._detectIconPath();
    }

    // <strong i="10">@option</strong> imagePath: String
    // `L.Icon.Default` will try to auto-detect the absolute location of the
    // blue icon images. If you are placing these images in a non-standard
    // way, set this option to point to the right absolute path.
    return (this.options.imagePath || L.Icon.Default.imagePath) + L.Icon.prototype._getIconUrl.call(this, name);
},

data:image URL์ด URL ๋์— ๋‹ค์Œ ๋ฌธ์ž์—ด์„ ๊ฐ–๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
")marker-icon-2x.png .

+ L.Icon.prototype._getIconUrl.call(this, name) ์„ ์‚ญ์ œํ•˜๋ฉด ํŒŒ์ผ ์ด๋ฆ„์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ") ๋ถ€๋ถ„์€ ์•„๋งˆ๋„ _detectIconPath ์ •๊ทœ์‹ ๋งˆ์ˆ ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ์น  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ง€๋ง‰ ๋‘ ๋ฌธ์ž๋ฅผ ์ž˜๋ผ๋‚ด๋ ค๊ณ  ์‹œ๋„ํ–ˆ๋Š”๋ฐ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

_getIconUrl: function (name) {
    if (!L.Icon.Default.imagePath) {    // Deprecated, backwards-compatibility only
        L.Icon.Default.imagePath = this._detectIconPath();
    }

    // <strong i="21">@option</strong> imagePath: String
    // `L.Icon.Default` will try to auto-detect the absolute location of the
    // blue icon images. If you are placing these images in a non-standard
    // way, set this option to point to the right absolute path.
  var url = (this.options.imagePath || L.Icon.Default.imagePath);

  return url.slice(0, - 2);
},

์ด์ œ ์•„์ด์ฝ˜์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋ฌธ์ œ๋Š” ๊ทธ๋ฆผ์ž ์ด๋ฏธ์ง€๋„ ๋งˆ์ปค ์•„์ด์ฝ˜์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. src ๊ฒฝ๋กœ๊ฐ€ ์ด๋ฏธ ์ž˜๋ชป๋˜์—ˆ๊ณ  ๊ทธ ์ด์œ ๋Š” ์•„์ง ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ด์ œ ๋งˆ์ปค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ž…๋‹ˆ๋‹ค.

image

@IvanSanchez ๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ขํžˆ๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๊นŒ?

@codeofsumit ์€ _detectIconPath ๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณด๊ณ  ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€, ํŠนํžˆ path ๋ณ€์ˆ˜๊ฐ€ ์ •๊ทœ์‹์„ ํ†ตํ•ด ์ „๋‹ฌ๋˜๊ธฐ ์ „์— ์–ด๋–ค ๊ฐ’์„ ๊ฐ–๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@IvanSanchez @perliedman ๋ฒ„๊ทธ๋ฅผ ์ฐพ์€ ๊ฒƒ

_detectIconPath

_detectIconPath: function () {
    var el = L.DomUtil.create('div',  'leaflet-default-icon-path', document.body);
    var path = L.DomUtil.getStyle(el, 'background-image') ||
               L.DomUtil.getStyle(el, 'backgroundImage');   // IE8
    document.body.removeChild(el);

    return path.indexOf('url') === 0 ?
        path.replace(/^url\([\"\']?/, '').replace(/marker-icon\.png[\"\']?\)$/, '') : '';
}

path ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQโ€ฆn3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=") .

์–ด๋Š ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ •๊ทœ์‹์€ ์—ฌ๊ธฐ์—์„œ data.image URL์„ ์ถ”์ถœํ•˜๋ ค๊ณ  ํ•˜๋ฉฐ ๋‹ค์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQโ€ฆn3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=")

path ๋ณ€์ˆ˜์—์„œ ์ œ๊ฑฐ๋˜์ง€ ์•Š์€ ๋งˆ์ง€๋ง‰ ") ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค. ์ •๊ทœ์‹ /^url\([\"\']?/ ์€ ๊ฒฝ๋กœ ์‹œ์ž‘ ๋ถ€๋ถ„์˜ url(" /^url\([\"\']?/ ๋งŒ ๋Œ€์ƒ์œผ๋กœ ํ•˜๊ณ  ๋์— ์žˆ๋Š” ") ๋Š” ๋Œ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
์ด ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

return path.indexOf('url') === 0 ?
    path.replace(/^url\([\"\']?/, '').replace(/\"\)$/, '').replace(/marker-icon\.png[\"\']?\)$/, '') : '';

์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ํ•จ๊ป˜ ์ด๋ฏธ์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

var url = (this.options.imagePath || L.Icon.Default.imagePath);

_getIconUrl ๋‚ด๋ถ€. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๊ทธ๋ฆผ์ž๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ๋ฆผ์ž์— ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ ,
_detectIconPath์˜ ๊ฒฝ๋กœ ๊ฐ’์€ "url("data:image/png;base64,i...5CYII=")"๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
_getIconUrl ๋ฐ _detectIconPath๊ฐ€ ๋ฐ์ดํ„ฐ URL์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆผ์ž ๋ฌธ์ œ๋Š” _getIconUrl ์—์„œ L.Icon.Default.imagePath
image

๋งˆ์ปค ์ด๋ฏธ์ง€๋ฅผ ํ•˜๋“œ ์ฝ”๋”ฉํ•˜๋Š”์ด ์ปค๋ฐ‹๊ณผ ๊ด€๋ จ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
https://github.com/Leaflet/Leaflet/commit/837d19093307eb5eeb1fca6536962a1ab1573dd5

@Radu-Filip PR์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ์ˆ˜์ •์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์–ด๋–ค ๋‹ค๋ฅธ ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
image

๋ฌธ์ œ๋Š” ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์•„์ด์ฝ˜์— ๋Œ€ํ•œ ๊ธฐ๋ณธ URL์ด ๋งˆ์ปค ์ด๋ฏธ์ง€๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์šฐ์„  CSS์— ๊ทธ๋ฆผ์ž์˜ ๊ธฐ๋ณธ URL์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

/* Default icon URLs */
.leaflet-default-icon-path {
    background-image: url(images/marker-icon.png);
}

.leaflet-default-shadow-path {
    background-image: url(images/marker-shadow.png);
}

๊ทธ๋Ÿฐ ๋‹ค์Œ _getIconUrl ์—์„œ _detectIconPath ์ด๋ฆ„์„ ์ „๋‹ฌํ•˜๊ณ  ๊ฒฝ๋กœ๊ฐ€ ์ถ”์ถœ๋˜๋Š” ์š”์†Œ์— ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

_getIconUrl: function (name) {

  L.Icon.Default.imagePath = this._detectIconPath(name);

    // <strong i="15">@option</strong> imagePath: String
    // `L.Icon.Default` will try to auto-detect the absolute location of the
    // blue icon images. If you are placing these images in a non-standard
    // way, set this option to point to the right absolute path.
  var path = this.options.imagePath || L.Icon.Default.imagePath;
  return path.indexOf("data:") === 0 ? path : path + L.Icon.prototype._getIconUrl.call(this, name);
},

_detectIconPath: function (name) {
    var el = L.DomUtil.create('div',  'leaflet-default-' + name + '-path', document.body);
    var path = L.DomUtil.getStyle(el, 'background-image') ||
               L.DomUtil.getStyle(el, 'backgroundImage');   // IE8

    document.body.removeChild(el);

    return path.indexOf('url') === 0 ? path.replace(/^url\([\"\']?/, '').replace(/(marker-icon\.png)?[\"\']?\)$/, '') : '';
}

detectIconPath ์ฃผ๋ณ€์˜ if/else๋„ ์ œ๊ฑฐํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆผ์ž ์•„์ด์ฝ˜์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ๊ธฐ๋ณธ ๋งˆ์ปค ์•„์ด์ฝ˜์— ๋Œ€ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์•„์ด์ฝ˜์€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@codeofsumit ์˜ˆ, https://github.com/Radu-Filip/Leaflet/tree/temp์—์„œ ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ์€ ํ•ดํ‚น์œผ๋กœ if๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Webpack et al์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•œ ๋” ๋งŽ์€ ๋ฏธ๋ž˜ ์ฆ๊ฑฐ ์†”๋ฃจ์…˜์ด ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@Radu-Filip ํ•ด๋‹น ์†”๋ฃจ์…˜์œผ๋กœ PR์„ ์—…๋ฐ์ดํŠธํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋ณ‘ํ•ฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@codeofsumit ์™„๋ฃŒ, ํ†ต๊ณผํ•˜๋Š”์ง€ ๋ด…์‹œ๋‹ค

์•ˆ๋…•,

์–ด์ฉŒ๋ฉด ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์ณค์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ Webpack ๋นŒ๋“œ์˜ ์ด ๋ฌธ์ œ๋Š” L.Icon.Default ๋™์ž‘์„ ์žฌ์ •์˜ํ•˜๋Š” Leaflet ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฐ๋ชจ: http://playground-leaflet.rhcloud.com/nexo/1/edit?html,css ,์ถœ๋ ฅ

์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๊นŒ๋‹ค๋กœ์šด RegExp๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๊ธฐ๋ณธ ๋งˆ์ปค ์ด๋ฏธ์ง€๊ฐ€ ์ธ๋ผ์ธ๋ฉ๋‹ˆ๋‹ค(ํ•˜๋“œ ์ฝ”๋”ฉ์— ์˜ํ•ด). ์ด๋Š” ์–ด์จŒ๋“  ์ž‘์€ ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด Webpack์ด ์˜๋„ํ•œ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๋‹จ์ ์€ ๊ฐ ๋งˆ์ปค์— ๊ณ ์œ ํ•œ base64 ์•„์ด์ฝ˜์ด ์žˆ์œผ๋ฉฐ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฅผ ์บ์‹œํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค... (PR #5041์˜ ๋‹จ์ ๋„ ๋™์ผ)
์˜ˆ๋ฅผ ๋“ค์–ด Layers Control ์•„์ด์ฝ˜์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ด๋ฏธ์ง€ src ์†์„ฑ์— ๋ฐฐ์น˜ํ•˜๋Š” ๋Œ€์‹  ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€๋กœ ์„ค์ •ํ•˜์—ฌ ๊ฐœ์„ ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(๊ฐ™์€ ์†Œ๋ฆฌ ํŽธ์ง‘์ด ์•„์ด๋””์–ด์— ์ˆจ๊ฒจ์ง„ ํ•จ์ •์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ํ•˜๋‚˜ ๋Š” ์ฒ˜์Œ์— ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ ํƒ์ง€๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์œผ๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‚˜๋Š” ํ™•์‹คํžˆ ๊ทธ๊ฒƒ์„ ์˜ค๋ž˜ ์ „์— ๊ตฌํ˜„ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๋ฐ๋ชจ: http://playground-leaflet.rhcloud.com/mey/1/edit?html ,css,output (๋ง๋ง‰์„ ๋Œ๋ณด์ง€ ์•Š์Œ)

ํ”Œ๋Ÿฌ๊ทธ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ Webpack ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด์„œ๋งŒ ์ด ํŠน์ • ๋™์ž‘์„ ์œ ์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

BTW, ์—ฌ๊ธฐ์— ๋ณธ์งˆ์ ์œผ๋กœ ์ž˜๋ชป๋œ ๊ฒƒ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Leaflet์€ CSS ํŒŒ์ผ๊ณผ ๋น„๊ตํ•˜์—ฌ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์œ„์น˜์— ์žˆ์–ด์•ผ ํ•˜๋Š” ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ "๋ณต์žกํ•œ" ๊ฒฝ๋กœ ๊ฐ์ง€๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ webpack ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ webpack์— ์š”์ฒญํ•˜๋Š” ๋‚ด์šฉ(์˜ˆ: ์ด๋ฏธ์ง€ ์š”๊ตฌ)์— ๋”ฐ๋ผ CSS๋ฅผ ๋ฒˆ๋“ค๋กœ ์ œ๊ณตํ•˜๊ณ  ์ด๋ฏธ์ง€๋„ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ฐ ์ด๋ฆ„ ๋ณ€๊ฒฝ!).
๋”ฐ๋ผ์„œ ์›นํŒฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ Leaflet ๊ฐ์ง€์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

PR #5041์€ Webpack์ด ๊ฐ ๋งˆ์ปค์— Base64 ์ด๋ฏธ์ง€๋ฅผ ๋ณต์ œํ•˜๋Š” ๋Œ€์‹  ์ด๋ฏธ์ง€๋ฅผ CSS์— ์ธ๋ผ์ธํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ฐ›์•„๋“ค์ด๋Š” ์†์ž„์ˆ˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์›นํŒฉ์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๋น„์šฉ์€ ๋งํ•  ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค.

PR #4979๋Š” ์›นํŒฉ ๋นŒ๋“œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€(ํŒŒ์ผ ๋ˆ„๋ฝ์œผ๋กœ ์ธํ•œ)๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ ์‹ค์ œ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ ํ•ด์ƒ๋„๋ฅผ ์ „ํ˜€ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์ž๊ฐ€ L.Icon.Default.imagePath ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?
@jasongrout ๋ฐ @Eschon , ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ–ˆ๋Š”์ง€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ •๋ง๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‚˜๋Š” ๋‹จ์ง€ ๊ธฐ๋ณธ ์•„์ด์ฝ˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฒ„๊ทธ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๋‚˜์—๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์•˜๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ 1.0.1 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ฒฝ๋กœ ์˜ค๋ฅ˜๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ „๋‹จ์ง€ Drupal ๋ชจ๋“ˆ(7.x-1.x-dev)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ๋ชจ๋“ˆ์— ๋ณด๊ณ ๋œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: https://www.drupal.org/node/2814039 ์œ ์šฉํ•œ.

๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ํ•œ "๋ฌธ์ œ"๊ฐ€ _getIconUrl ๊ธฐ๋Šฅ์— ์žˆ์Šต๋‹ˆ๊นŒ? L.Icon.Default.imagePath ๋’ค์— ์Šฌ๋ž˜์‹œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— Drupal์˜ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋Š” " /sites/all/libraries/leaflet/imagesmarker-icon.png "์™€ ๊ฐ™์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ์™€ ๋งˆ์ปค ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ด๋ฆ„(marker-icon.png) ์‚ฌ์ด์—๋Š” ์Šฌ๋ž˜์‹œ /๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @anairamzap-mobomo,

์‹ ๊ณ ํ•˜์‹  ๋‚ด์šฉ์€ ๋‹ค๋ฅธ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ํ”„๋ ˆ์ž„์›Œํฌ(Drupal)์— ๋Œ€ํ•œ ํฌํŠธ๊ฐ€ ํฌํ•จ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ๋จผ์ € ํ•ด๋‹น ํฌํŠธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๊ด€๋ จ์ด ์—†๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”๋‹๋ผ JS๊ฐ€ ์žˆ๋Š” ์ „๋‹จ์ง€ 1.0.x์—๋Š” ํ›„ํ–‰ ์Šฌ๋ž˜์‹œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. http://playground-leaflet.rhcloud.com/fosa/1/edit?html ,output

์˜ˆ๋ฅผ ๋“ค์–ด http://cgit.drupalcode.org/leaflet/tree/leaflet.module#n51 ์„ ์ฐธ์กฐ L.Icon.Default.imagePath ๋Š” Drupal ๋ชจ๋“ˆ์— ์˜ํ•ด ์žฌ์ •์˜๋ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ชจ๋“ˆ์ด Leaflet 0.7.x์™€ 1.0.x ์‚ฌ์ด์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์Šฌ๋ž˜์‹œ๋Š” ์ด์ œ L.Icon.Default.imagePath ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Leaflet 1.0.0์€ ์ฃผ์š” ๋ฆด๋ฆฌ์Šค์ด๋ฏ€๋กœ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•œ ์•ฝ์†์€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @ghybs ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค ... Drupal ๋ชจ๋“ˆ ์œ ์ง€ ๊ด€๋ฆฌ์ž์—๊ฒŒ ์—ฐ๋ฝํ•˜์—ฌ ์ด๋ฅผ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ 1.0.x ๋ฒ„์ „์— ์ž˜ ๋งž๋„๋ก ๋ชจ๋“ˆ์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ด์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜๋Š” ๋ฌธ์„œ์— ์ตœ์†Œํ•œ ๋ช‡ ์ค„์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

aurulia skeleton/esnext+webpack ํ”„๋กœ์ ํŠธ์—์„œ ์›๋ž˜ ๋ณด๊ณ ๋œ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ์ด๋ฏธ์ง€๋ฅผ ์†Œ์Šค ํด๋”์— ๋ณต์‚ฌํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ง€์ • ๋งˆ์ปค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ๊ธฐ/๋ฐฐ์น˜ ์ •๋ณด๋ฅผ ์ƒ๋žตํ•ด๋„ ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

        var customDefault = L.icon({
            iconUrl: 'images/marker-icon.png',
            shadowUrl: 'images/marker-shadow.png',
        });

์ž˜๋ชป๋œ data:url ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๊ฐ€ ํ•œ ์ผ์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋ณธ ์•„์ด์ฝ˜์„ ์ œ๊ณต๋œ ๋งˆ์ปค ์•„์ด์ฝ˜๊ณผ ๊ทธ๋ฆผ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒˆ ์•„์ด์ฝ˜์œผ๋กœ ์„ค์ •ํ•˜์ง€๋งŒ webpack์ด ํ•ด๋‹น ์ด๋ฏธ์ง€์˜ ๋ฐ์ดํ„ฐ ์ธ์ฝ”๋”ฉ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋”˜๊ฐ€์— ์ด์™€ ๊ฐ™์€ ํŒŒ์ผ์„ ํฌํ•จํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

import L from 'leaflet';

import icon from 'leaflet/dist/images/marker-icon.png';
import iconShadow from 'leaflet/dist/images/marker-shadow.png';

let DefaultIcon = L.icon({
    iconUrl: icon,
    shadowUrl: iconShadow
});

L.Marker.prototype.options.icon = DefaultIcon;

๋ง๋ง‰ ์•„์ด์ฝ˜๋„ ํฌํ•จํ•˜๋„๋ก ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ์ˆ˜์ •๋œ leaflet.js ํŒŒ์ผ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
@ajoslin103 ์ด ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ:
```var customDefault = L.icon({
iconUrl: '์ด๋ฏธ์ง€/๋งˆ์ปค-icon.png',
shadowUrl: '์ด๋ฏธ์ง€/๋งˆ์ปค-์„€๋„์šฐ.png',
});

๋‚˜๋Š” leaflet.js ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•˜๊ณ , ๋‹จ์ง€ ๋ฆฌํ”Œ๋ฆฟ ๋ฐฐํฌํŒ์—์„œ ๋‚ด ์ผ๋ฐ˜ ์ด๋ฏธ์ง€ ํด๋”๋กœ ๋งˆ์ปค ์ด๋ฏธ์ง€๋ฅผ ๋ณต์‚ฌํ•œ ๋‹ค์Œ, ๋‚ด๊ฐ€ ๊ฒŒ์‹œํ•œ ํ•ด๋‹น ์กฐ๊ฐ์„ ์‚ฌ์šฉ์ž ์ •์˜ ์•„์ด์ฝ˜์œผ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์›๋ž˜ CSS์—์„œ http๋กœ ์ฐธ์กฐ๋˜๊ณ  ๋‚ด ์‚ฌ์ดํŠธ๊ฐ€ https๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— crb611์˜ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

``` ํ•จ์ˆ˜ onLocationFound(e) {
var ๋ฐ˜๊ฒฝ = e.accuracy / 2;
var customDefault = L.icon({
iconUrl: 'marker_icon_2x',
shadowUrl: 'marker_shadow.png'
});
L.marker(e.latlng).addTo(์ง€๋„)
.bindPopup("์ด ์ง€์ ์—์„œ " + ๋ฐ˜๊ฒฝ + " ๋ฏธํ„ฐ ๋‚ด์— ์žˆ์Šต๋‹ˆ๋‹ค.").openPopup();
L.circle(e.latlng, ๋ฐ˜๊ฒฝ).addTo(์ง€๋„);
}

์ƒˆ ์•„์ด์ฝ˜์„ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์ƒ์„ฑ์ž์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์•„์ด์ฝ˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(์ €๋Š” Aurelia ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค).

        this.customDefault = L.icon({
            iconUrl: 'images/marker-icon.png',
            shadowUrl: 'images/marker-shadow.png',
        });

๊ทธ๋Ÿฐ ๋‹ค์Œ ์—ฐ๊ฒฐ๋œ() ๋ฉ”์„œ๋“œ์— ๋งˆ์ปค๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

        var map = L.map('mapid').setView([latitude, longitude], 13);
        let urlTemplate = 'http://{s}.tile.osm.org/{z}/{x}/{y}.png';
        map.addLayer(L.tileLayer(urlTemplate, { minZoom: 4 }));
        L.marker([latitude, longitude], { icon: this.customDefault }).addTo(map);

์ฐธ์กฐ: http://leafletjs.com/examples/custom-icons/

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ์ˆ˜์ •์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ _getIconUrl() (๋˜๋Š” ๋ฌด์—‡์ด๋“ )์ด ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ๋ฐ์ดํ„ฐ UI๋ฅผ ๋งŒ๋‚˜๋ฉด console.warn ํ†ตํ•ด Github ๋ฌธ์ œ URL์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Ÿฐํƒ€์ž„ ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ.

์ฆ‰, ๋ฐ”๋กœ ์ด๊ณณ์— ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค์„ ๋ฐ๋ ค์™€ (๊ฐ™์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ œ์•ˆ ์ด ํ•˜๋‚˜์˜ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ).

์ด๊ฒƒ์ด React(dev builds)๊ฐ€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋ฐ˜์‘ ๋ฌธ์ œ์—์„œ @PTihomir์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

import L from 'leaflet';
delete L.Icon.Default.prototype._getIconUrl;

L.Icon.Default.mergeOptions({
  iconRetinaUrl: require('leaflet/dist/images/marker-icon-2x.png'),
  iconUrl: require('leaflet/dist/images/marker-icon.png'),
  shadowUrl: require('leaflet/dist/images/marker-shadow.png'),
});

์ด๊ฒƒ์€ ์ „๋‹จ์ง€ ํ•ต์‹ฌ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

@codeofsumit : ์ฐธ๊ณ ๋กœ ์ œ๊ฐ€ ์ดํ•ดํ•œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์–ธ๊ธ‰๋œ ์„ธ ๊ฐœ์˜ ์•„์ด์ฝ˜์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

Leflet์ด ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฅธ ์•„์ด์ฝ˜์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ(๋˜๋Š” ํ–ฅํ›„์—) ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฒฝ์šฐ - ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค).


Webpack์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ: Webpack์€ ๋‹ค์Œ ์†์„ฑ์— ์ƒˆ URL์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

/***/ 5305024559067547:
/***/ function(module, exports, __webpack_require__) {

    module.exports = __webpack_require__.p + "d95d69fa8a7dfe391399e22c0c45e203.png";

/***/ },


...


    _leaflet2['default'].Icon.Default.mergeOptions({
      iconRetinaUrl: __webpack_require__(5305024559067547),
      iconUrl: __webpack_require__(6633266380715105),
      shadowUrl: __webpack_require__(880063406195787)
    });

(์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์‚ฌ์šฉ๋œ Webpack ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง)

@jampy ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ „๋‹จ์ง€ ํ•ต์‹ฌ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ˆ˜์ • ์‚ฌํ•ญ์€ ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ์—…๋ฐ์ดํŠธ์™€ ํ•จ๊ป˜ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ€์žฅ ๊ณ ํ†ต์Šค๋Ÿฌ์šด ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ ์ ˆํ•œ ์ˆ˜์ •์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ ์–ธ๊ธ‰๋œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๊ฐ™์€ ๋ฌธ์ œ๋Š” detectIconPath ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ http://localhost:8080/2273e3d8ad9264b7daa5bdbf8e6b47f8.png") ๊ฒฝ๋กœ์— url("http://localhost:8080/2273e3d8ad9264b7daa5bdbf8e6b47f8.png")

์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ webpack์„ ์‚ฌ์šฉํ•˜๊ณ  ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€๋ฅผ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์˜ ์ด๋ฏธ์ง€ ํด๋”์— ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚ด package.json์—์„œ postbuild npm ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค(์Šคํฌ๋ฆฝํŠธ ์„น์…˜์—์„œ).
" postbuild:prod ": "./Post-Build4Prod.sh"

์ด๋ฏธ์ง€ ํด๋”๋ฅผ dist์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

#bin/bash
cp -r ./images ./dist/.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์•„์ด์ฝ˜์— ๋Œ€ํ•œ customDefault๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

    this.customDefault = L.icon({
        iconUrl: 'images/marker-icon.png',
        shadowUrl: 'images/marker-shadow.png',
    });

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„ ์–ด๋””์—์„œ๋‚˜ ์‚ฌ์šฉ

    L.marker([latitude, longitude], { icon: this.customDefault }).addTo(map);

Vue webpack ํ”„๋กœ์ ํŠธ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

import L from 'leaflet';

L.Icon.Default.imagePath = '/';
L.Icon.Default.mergeOptions({
    iconRetinaUrl: require('leaflet/dist/images/marker-icon-2x.png'),
    iconUrl: require('leaflet/dist/images/marker-icon.png'),
    shadowUrl: require('leaflet/dist/images/marker-shadow.png'),
});

Django์˜ collectstatic ๋ฐ CachedStaticFilesStorage์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด ํŒŒ์ผ ๋‚ด์šฉ์˜ ํ•ด์‹œ๋ฅผ ์ •์  ํŒŒ์ผ์˜ ์ด๋ฆ„์— ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ marker-icon.png๋Š” marker-icon.2273e3d8ad92.png๊ฐ€ ๋œ ๋‹ค์Œ _detectIconPath ๋์— ์ •๊ทœ ํ‘œํ˜„์‹์ด ๋ฉ๋‹ˆ๋‹ค. ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ replace(/marker-icon[^"']+\.png[\"\']?\)$/, '') ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

์ €๋„ ํ˜„์žฌ ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
Leaflet 1.0.3 ๋ฐ Angular2 ์‚ฌ์šฉ.
๊ณ ๋ฐฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

Angular 2 ๋ฐ 4์˜ ๊ฒฝ์šฐ
๋‹ค์Œ ์ฝ”๋“œ๋กœ require.d.ts ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

interface WebpackRequire {
    <T>(path: string): T;
    (paths: string[], callback: (...modules: any[]) => void): void;
    ensure: (paths: string[], callback: (require: <T>(path: string) => T) => void) => void;
}
interface NodeRequire extends WebpackRequire {}
declare var require: NodeRequire;

๊ทธ๋Ÿฐ ๋‹ค์Œ ์š”๊ตฌ๋ฅผ ์‚ฌ์šฉ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด:

                  this.marker = L.marker(e.latlng, {
                    icon: L.icon({
                        iconUrl: require <any>('../../images/marker-icon.png'),
                        shadowUrl: require <any>('../../images/marker-shadow.png'),
                    })

webpack์ด ์žˆ๋Š” Vue.js์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•(ํฌ๊ธฐ ๋ฐ ์•ต์ปค ํฌํ•จ):

import L from 'leaflet'

// BUG https://github.com/Leaflet/Leaflet/issues/4968
import iconRetinaUrl from 'leaflet/dist/images/marker-icon-2x.png'
import iconUrl from 'leaflet/dist/images/marker-icon.png'
import shadowUrl from 'leaflet/dist/images/marker-shadow.png'
L.Marker.prototype.options.icon = L.icon({
  iconRetinaUrl,
  iconUrl,
  shadowUrl,
  iconSize: [25, 41],
  iconAnchor: [12, 41],
  popupAnchor: [1, -34],
  tooltipAnchor: [16, -28],
  shadowSize: [41, 41]
})

์™ธ๋ถ€ ์ด๋ฏธ์ง€ URL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ธฐ๋ณธ ์•„์ด์ฝ˜์„ base64๋กœ ์ธ๋ผ์ธํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋น ๋ฅธ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๋งˆ์ปค(๋‚ด ๊ฒฝ์šฐ์—๋Š” 1000๊ฐœ)๋ฅผ ๋กœ๋“œํ•  ๋•Œ base64 ์ธ๋ผ์ธ ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ด ๋ˆˆ์— ๋„๊ฒŒ ๋‚˜๋น ์ง‘๋‹ˆ๋‹ค.

๋‹ค์Œ์€ 1000๊ฐœ์˜ ๋งˆ์ปค ์•„์ด์ฝ˜์„ ์™ธ๋ถ€ URL๋กœ ๋กœ๋“œํ•  ๋•Œ์˜ Chrome devtools ์„ฑ๋Šฅ ๋ณด๊ธฐ์ž…๋‹ˆ๋‹ค.

1000 markers icons as external URLs

์ธ๋ผ์ธ base64๋กœ 1000๊ฐœ์˜ ๋งˆ์ปค ์•„์ด์ฝ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์—ฌ(ํƒ€์ž„๋ผ์ธ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๋ฐฐ์œจ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค):

1000 markers icons as inlined base64 URLs

๋ณด์‹œ๋‹ค์‹œํ”ผ, ์ธ๋ผ์ธ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์–ด๋–ค ์ด์œ ๋กœ ๋ ˆ์ด์–ด ๊ตฌ์„ฑ์ด ์ง€์—ฐ๋˜์–ด ์ „์ฒด ๋กœ๋“œ๊ฐ€ ์•ฝ 1์ดˆ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์ผ์ƒ์ ์ธ ์‚ฌ์šฉ์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋งˆ์ปค๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์žฅ๊ธฐ๊ฐ„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ œ์•ˆ:

  • ์ฝ”๋“œ ๋ฆฌ๋ทฐ์—์„œ ์–ธ๊ธ‰๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด #5041์„ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์ธ๋ผ์ธ ์•„์ด์ฝ˜์ด ์ฆ‰์‹œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ๋ผ์ธ ์•„์ด์ฝ˜์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ์ด์ƒ์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๊ฒฝ๊ณ ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „(0.7) ๋ฐฉ๋ฒ•์œผ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด์ง€๋งŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @perliedman ๋‹˜ ,

๋ฉ‹์ง„ ํ”„๋กœํŒŒ์ผ๋ง!
๋‚ด๊ฐ€ ์˜์‹ฌ ๋Œ€๋‹ต ํ–ˆ๋‹ค ๋‹ค์‹œ ์‚ฌ์šฉ ์ธ๋ผ์ธ ์ด๋ฏธ์ง€์˜ ์ธก๋ฉด ์•„๋ž˜์— ๊ด€ํ•œํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ PR #5041์€ (webpack๊ณผ ๊ฐ™์€ ๋นŒ๋“œ ์—”์ง„์— ์˜ํ•ด) CSS์—์„œ ์•„์ด์ฝ˜ ์ด๋ฏธ์ง€๊ฐ€ ์ธ๋ผ์ธ๋  ๋•Œ Leaflet์ด ์ฆ‰์‹œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฆฌํŒฉํ† ๋ง๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์†”๋ฃจ์…˜(๋Œ€๋ถ€๋ถ„ ์–ธ๊ธ‰๋œ PR๊ณผ ์œ ์‚ฌ)์€ ์ด๋ฏธ์ง€๋‹น 1๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ CSS(๋ฐ ์•„๋งˆ๋„ JS) ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ˆ˜์‹ญ ๋ฐ”์ดํŠธ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ: http://playground-leaflet.rhcloud.com/dulox/1/edit?html ,css,์ถœ๋ ฅ

ํ•˜์ง€๋งŒ ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด (๋นŒ๋“œ ์—”์ง„๊ณผ ํ•จ๊ป˜) ํ˜ธํ™˜์„ฑ ์ด์œ ๋กœ ์ธํ•ด ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์ด ์ด๋Ÿฌํ•œ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ๊ฒƒ์€ ์œ ๊ฐ์Šค๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— IconDefault ํด๋ž˜์Šค ์˜ต์…˜์—์„œ ํ•˜๋“œ ์ฝ”๋”ฉ๋œ ํŒŒ์ผ ์ด๋ฆ„์„ ์ œ๊ฑฐํ•˜๊ณ  ์ „์ฒด ๊ฒฝ๋กœ(ํŒŒ์ผ ์ด๋ฆ„ ํฌํ•จ)๋ฅผ CSS์— ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ๊ฐ€ "๊นจ๋—ํ•˜๊ฒŒ" ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ (๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด) ์ด ๋ณต์žกํ•œ ๊ฐ์ง€์˜ ์š”์ ์€ JS ํŒŒ์ผ์—์„œ ์ด๋ฏธ์ง€ ์œ„์น˜๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋Œ€์‹  CSS ํŒŒ์ผ์— ๋Œ€ํ•œ ์ƒ๋Œ€์  ์œ„์น˜์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ์ผ ์ด๋ฆ„๋„ CSS์— ์ •์˜๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ imagePath ์˜ต์…˜๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๋Š” ์‹œ๋„๋„ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํ–‰ ๊ฒฝ๋กœ๋ฅผ ๊ต์ฒดํ•˜๊ณ  ํŒŒ์ผ ์ด๋ฆ„์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „์— ๊ฐ์ง€๋œ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ์ž‘์—…ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๊ฑฐ๊ธฐ์— ์ƒˆ๋กœ์šด RegExp๋ฅผ ๋„์ž…ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๊ฒƒ์ด ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์„์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๋Š” ๊ณ ๋„๋กœ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์•„์ด์ฝ˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ์ •์  ์ž์‚ฐ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋งค์šฐ ๋‹ค๋ฅธ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๊ฒฝ์šฐ์—๋„ ์‹คํŒจํ•˜๋Š” ์ผ๋ถ€ ๊ฒฝ์šฐ๊ฐ€ ์—ฌ์ „ํžˆ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ghybs ์ €๋Š” ๊ทธ ์˜ˆ์‹œ๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค( http://playground-leaflet.rhcloud.com/dulox/)!

๊ณผํ•œ ์ผ์ด์ง€๋งŒ ์ด CSS์—์„œ icon _size_๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ( width ๋ฐ height )? ๊ธฐ๋ณธ ์•„์ด์ฝ˜์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น CSS ๊ทœ์น™์„ ์žฌ์ •์˜ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CSS์˜ ์น˜์ˆ˜๊ฐ€ ์žˆ๋“  ์—†๋“ , ์ €๋Š” ์ด๊ฒƒ์ด ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋ชจ๋ฒ”์— ๋”ฐ๋ผ PR์„ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ง€๊ธˆ ๋‹น์žฅ ์‹œ๊ฐ„์ด๋‚˜ ์—๋„ˆ์ง€๊ฐ€ ์—†๋‹ค๋ฉด ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒƒ์„ ๋ง์”€ํ•ด ์ฃผ์„ธ์š”.

์‹ค์ œ๋กœ์ด ๋ฌธ์ œ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ๋ฅผ ๋‹ซ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @perliedman ๋‹˜ ,

CSS๋ฅผ ํ†ตํ•ด ์•„์ด์ฝ˜ ํฌ๊ธฐ๋„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ๊ธฐ์ค€์ ๋„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค CSS ๊ทœ์น™์ด ์ด์— ์ ํ•ฉํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค(์—ฌ๋ฐฑ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?). ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๊ฒฐ๊ณผ๋Š” ๋งค์šฐ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„์ด์ฝ˜์€ CSS์—์„œ ์™„์ „ํžˆ ์ •์˜๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋” ๋‚˜์•„๊ฐ€ ์•„์ด์ฝ˜์„ ์ •์˜ํ•˜๋Š” ์ถ”๊ฐ€ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 3๊ฐœ์˜ CSS ํด๋ž˜์Šค(์•„์ด์ฝ˜, ๋ง๋ง‰, ๊ทธ๋ฆผ์ž)๋ฅผ ์ง€์ •ํ•˜๋ฉด Leaflet์ด ๋ชจ๋“  ์•„์ด์ฝ˜ ์˜ต์…˜์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

์ด ์ž‘์—…์„ ์ž์œ ๋กญ๊ฒŒ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค. ๋ถˆํ–‰ํžˆ๋„ ์–ธ์ œ ์‹œ๊ฐ„์„ ๋‚ผ ์ˆ˜ ์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค...

์ด์ „ ์˜ˆ์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ padding ๋ฐ margin CSS ๊ทœ์น™์„ ์ฝ๊ณ  padding iconAnchor ( shadowAnchor ) ๋ฐ popupAnchor ์˜ต์…˜:
http://playground-leaflet.rhcloud.com/xuvi/1/edit?html , CSS, ์ถœ๋ ฅ

๋‚˜๋Š” ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์‚ฌ์‹ค ๋งˆ์Œ์— ๋“ค์ง€ padding ๊ฒฐ์ •ํ•˜๊ธฐ iconAnchor ๊ฒฐ๊ตญ ๋ฆฌํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, margin ์•„์ด์ฝ˜ ์ด๋ฏธ์ง€์˜ ์œ„์น˜๋ฅผ ...
๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์ฐพ์€ ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ CSS์—์„œ ์‹ ์†ํ•˜๊ฒŒ ํ•ญ๋ชฉ์„ ์ง€์ •ํ•˜๊ณ  ์•„์ด์ฝ˜ ์˜ต์…˜์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฐ’์„ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

CSS์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ์ง€์ •ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€๋งŒ L.Icon.Default.imagePath ์™€์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ์•„์ง ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

PR์„ ๋งŒ๋“ค ์‹œ๊ฐ„์ด ์—†์–ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ _detectIconPath ๊ฐ€ ์‹คํŒจํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ฅผ ์ง„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. Firefox(ESR ๋ฐ ํ˜„์žฌ ๋ฒ„์ „์—์„œ ํ…Œ์ŠคํŠธ๋จ)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ™˜๊ฒฝ ์„ค์ • โ†’ ์ฝ˜ํ…์ธ  โ†’ ์ƒ‰์ƒโ€ฆ background-image ์—์„œ ํ•˜๋‚˜๋ฅผ ํฌํ•จํ•˜์—ฌ ์†์„ฑ .leaflet-default-icon-path ๋”ฐ๋ผ์„œ ํœด์‹ _detectIconPath .

์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด Firefox ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ €๋Š” ์•„์ฃผ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉํ•ด ์™”์Šต๋‹ˆ๋‹ค.

url() ๋ฅผ ๋‹ค๋ฅธ CSS ์†์„ฑ์˜ ๊ฐ’์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค์Œ CSS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: .leaflet-default-icon-path { -leaflet-icon: url(images/marker-icon.png); } ์•„๋‹ˆ๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ CSS ์†์„ฑ์„ ์ง์ ‘ ์ •์˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ? ์–ด๋–ค ๋ธŒ๋ผ์šฐ์ €๋„ -leaflet-icon ์†์„ฑ์„ _์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ์—ฌ์ „ํžˆ ์ด๋ฅผ ์ฑ„์šฐ๊ณ  ์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•ด๋‹น ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @roques ๋‹˜

Firefox์—์„œ ์ด ํŠน์ • ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
Chrome์— ๊ณ ๋Œ€๋น„ ํ™•์žฅ ๊ธฐ๋Šฅ ์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ Leaflet์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ์ƒ‰์ƒ๋งŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ Firefox๋Š” ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” CSS ์†์„ฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ์ง€ CSS ๋ฐ์ดํ„ฐ ์œ ํ˜• ์€ cursor ๋น„๋กฏํ•œ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ทœ์น™๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Firefox์—์„œ ์ƒ‰์ƒ ์žฌ์ •์˜ ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
http://playground-leaflet.rhcloud.com/yov/1/edit?html , CSS, ์ถœ๋ ฅ

๋‚˜๋Š” ๋œ ์šฐ์•„ํ•œ ์‚ฌ์šฉ ์ฐพ์„ ์ˆ˜ cursor ๋Œ€์‹  background-image ์˜ ์‚ฌ์šฉ์ด ์šฐ๋ฆฌ๊ฐ€ CSS ์Šคํƒ€์ผ์„ ํ†ตํ•ด ๋งˆ์ปค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ด๋ผ๊ณ ์—์„œ ํ›จ์”ฌ ๋”์ด๊ธฐ ๋•Œ๋ฌธ์— ...ํ•˜์ง€๋งŒ ์–ด์จŒ๋“ ์ด ์ด๋ฏธ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ํ•ดํ‚น ํƒ์ง€๋งŒ.

๋‚˜๋Š” ์›นํŒฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด PR์„ ๋งŒ๋“ค๋ ค๊ณ  ํ–ˆ๊ณ  ์ง€๊ธˆ ๋ฐ”๋กœ ์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ํฌํ•จํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋‹จ์„œ๊ฐ€ ์—†์ง€๋งŒ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

Angular + Angular CLI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด @Shiva127 ์˜ ๋‹ต๋ณ€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ app.module.ts ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// BUG https://github.com/Leaflet/Leaflet/issues/4968
import {icon, Marker} from 'leaflet';
const iconRetinaUrl = 'assets/marker-icon-2x.png';
const iconUrl = 'assets/marker-icon.png';
const shadowUrl = 'assets/marker-shadow.png';
const iconDefault = icon({
  iconRetinaUrl,
  iconUrl,
  shadowUrl,
  iconSize: [25, 41],
  iconAnchor: [12, 41],
  popupAnchor: [1, -34],
  tooltipAnchor: [16, -28],
  shadowSize: [41, 41]
});
Marker.prototype.options.icon = iconDefault;

.angular-cli.json ๊ธ€๋กœ๋ธŒ ๋ผ์ธ์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

"assets": [
        "assets",
        "favicon.ico",
        { "glob": "**/*", "input": "../node_modules/leaflet/dist/images/", "output": "./assets/" }
      ],

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋นŒ๋“œ ์‹œ dist ํด๋”์˜ ์ž์‚ฐ ํด๋”์— ์•„์ด์ฝ˜์ด ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค(src/assets์—์„œ๋Š” ๋ณผ ์ˆ˜ ์—†์Œ). ๋˜ํ•œ app.module.ts ์— ์ž‘์—…์„ ๋„ฃ๋Š” ๊ฒƒ์€ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ธ€๋กœ๋ฒŒ ํ”„๋กœํ† ํƒ€์ž…(์˜ˆ: RxJS ๊ด€์ฐฐ ๊ฐ€๋Šฅ ํŒจ์น˜)์„ ์œ ์ง€ํ•˜๊ธฐ์— ์ข‹์€ ์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ Marker๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์ด๋ ‡๊ฒŒ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ปค drawOptions์— ๊ธฐ๋ณธ ์•„์ด์ฝ˜์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

const myIcon = L.icon({
    ...
    ...
});

const drawOptions = {
      ....
      marker: {
         icon: myIcon
      }
};

...

๊ทธ๋Ÿฐ ๋‹ค์Œ L.Draw.Event.CREATED์— ์•„์ด์ฝ˜ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

this.map.on(L.Draw.Event.CREATED, (e) => {

      const layer: any = (e as L.DrawEvents.Created).layer;
      const type = (e as L.DrawEvents.Created).layerType;

      // Create a marker.
      if (type === 'marker') {

        let feature = layer.feature = layer.feature || {};
        feature.type = "Feature";
        feature.properties = feature.properties || {};
        feature.properties["markerIconsPath"] = "/assets/icons/";
       }
 });


๋งˆ์ง€๋ง‰์œผ๋กœ ๋ ˆ์ด์–ด๋ฅผ ํ‘œ์‹œํ•  ๋•Œ imagePath๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

if(layer instanceof L.Marker) {
            L.Icon.Default.imagePath = layer.feature.properties.markerIconsPath;
            layer.setIcon(greenIcon);
 }

@codeofsumit ์ตœ์‹  ๋ฒ„์ „ 1.3.1์— ์ด๋Ÿฌํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋†€๋ž๊ฒŒ๋„ ๋ฒ„์ „ 1.3.1์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@vishalrajole ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ œ์ถœ๋œ ์œ ์ผํ•œ PR์€ #5041์ด๋ฉฐ, ์ด๋Š” _long_ ์‹œ๊ฐ„ ๋™์•ˆ ์š”์ฒญ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ ๊ณต๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๋” ๋งŽ์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฌํ•จ๋œ ๋Œ€์ฒด ์†”๋ฃจ์…˜ #5771๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด, ์•„๋ฌด๋„ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์Šน์ธ๋œ PR์„ ์ œ์ถœํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋„์›€์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

@perliedman ์€ #5771์˜ ๊ด€๋ จ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ์ƒํ™ฉ์—์„œ ์ด ๋ฌธ์ œ๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์™œ ๊ทธ๋ƒฅ ๋ณ‘ํ•ฉํ•˜์ง€?

์•ˆ๋…•ํ•˜์„ธ์š” @mb21 ๋‹˜

๊ด€๋ จ๋œ #5771 ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ œ์•ˆ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ 2๊ฐ€์ง€ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.

  • ์ด๋ฏธ์ง€ ํด๋” ์œ„์น˜ ๋Œ€์‹  ๊ฐ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋ฅผ ์ฝ์–ด์„œ ๋นŒ๋“œ ์—”์ง„(์˜ˆ: webpack ํŒŒ์ผ ๋กœ๋”)์— ์˜ํ•ด ์ˆ˜์ •๋œ URL์„ ์žฌ๊ตฌ์„ฑ/์ถ”์ธกํ•˜๋Š” ๋Œ€์‹  ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ฝ์Šต๋‹ˆ๋‹ค.
  • CSS์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ธฐ๋ณธ ์•„์ด์ฝ˜ ์˜ต์…˜์„ ์ฝ์–ด์„œ ๋ชจ๋“  ๊ตฌ์„ฑ์ด ํ•œ ๊ณณ์— ๋ชจ์ด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๊ฝค ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ ์ฒซ ๋ฒˆ์งธ ์ ์„ ํ”ผํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋‘ ๋ฒˆ์งธ ์ ์€ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ๋Š” ์‹ค์ œ๋กœ CSS์—์„œ URL์„ ์กฐ์ž‘ํ•˜๋Š” ๋นŒ๋“œ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌ์„ฑ์„ ์กฐ์ •ํ•˜๋Š” ๋ฐ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๋Š” ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ(์›นํŒฉ ํŒŒ์ผ ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•จ)์—์„œ๋„ Leaflet _0 ๊ตฌ์„ฑ ์ •์‹ _์„ ์œ ์ง€ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ƒ๋‹นํ•œ ์–‘์˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€๊ฐ€๋ฅผ ์น˜๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. IMHO _against_ Leaflet ์ •์‹ ์ž…๋‹ˆ๋‹ค(์ฝ”์–ด์—์„œ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์„ ์ง€์›ํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์œ„์ž„).
์œ„์˜ ์ˆ˜๋งŽ์€ ์ฃผ์„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ผ๋ฐ˜์ ์œผ๋กœ require(image) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ฒ˜์Œ์— ๋ฌธ์ œ๋ฅผ ๋งค์šฐ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ทธ PR์„ ์ž‘์„ฑํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๊ฒƒ์„ ํ•ต์‹ฌ์— ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ _๋‹ค์ˆ˜์—๊ฒŒ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค_.

๊ฐœ๋ฐœ์ž์˜ ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ๋Š” ํ™•์‹คํžˆ ์ข‹์ง€๋งŒ ๋ฌธ์ œ๋Š” ์ฃผ๋กœ ๋นŒ๋“œ ์—”์ง„/ํ”„๋ ˆ์ž„์›Œํฌ ๋ž˜ํผ์˜ ์ƒํ˜ธ ์ž‘์šฉ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. API.

์–ด์ฉŒ๋ฉด ์šฐ๋ฆฌ๋Š” ๋” ๋‚˜์€ ๋ฌธ์„œ(์˜ˆ: ๋นŒ๋“œ ์—”์ง„/ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„น์…˜?) ๋ฐ/๋˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ• ๊นŒ์š”?

๊ธ€์Ž„์š”, ์ œ๊ฐ€ ๋ณต์žกํ•œ ๋‚ด์šฉ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ _all_ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๊ฐ€ CSS์— ์ง€์ •๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ถ„๋ช… ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. webpack-users๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ ์ •์  ์ž์‚ฐ์— ํ•ด์‹œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” Rails ๋˜๋Š” Django ์ž์‚ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ์ €์™€ ๊ฐ™์€ ์‚ฌ๋žŒ๋“ค๋„ ์žˆ์Šต๋‹ˆ๋‹ค...

๋‚˜๋Š” ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค.
data:image/png;base64,iVBORw0...AAAASUVORK5CYII=")marker-shadow.png net::ERR_INVALID_URL

ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ์„ ๊ต์ฒดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

getIconUrl: function (name) {
        if (!IconDefault.imagePath) {   // Deprecated, backwards-compatibility only
            IconDefault.imagePath = this._detectIconPath();
        }

        // <strong i="8">@option</strong> imagePath: String
        // `Icon.Default` will try to auto-detect the location of the
        // blue icon images. If you are placing these images in a non-standard
        // way, set this option to point to the right path.
        return (this.options.imagePath || IconDefault.imagePath) + Icon.prototype._getIconUrl.call(this, name);
    },

์™€ ํ•จ๊ป˜:

 // ...
  const url = (this.options.imagePath || L.Icon.Default.imagePath);

  return url.slice(0, -2);

codeofsumit์—์„œ ์ œ์•ˆํ•œ ๋Œ€๋กœ.

์ˆ˜์ •์„ ์œ„ํ•œ PR์ด ์žˆ์ง€๋งŒ '๋Œ€๋‹ค์ˆ˜์—๊ฒŒ๋Š” ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค'๋Š” '๋Š๋‚Œ' ๋•Œ๋ฌธ์— ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์ด ์ •๋ง ์งœ์ฆ๋‚˜๋”๊ตฐ์š”. ์ฃ„์†กํ•˜์ง€๋งŒ PHP, RoR, Python(Django) ๋ฐ node.js์—์„œ ์ด ๋ฌธ์ œ๋กœ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ๋ณด์•˜๋Š”๋ฐ ์ด ๊ทธ๋ฃน ์™ธ์— "๋Œ€๋‹ค์ˆ˜"๊ฐ€ ์–ด๋””์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ์–ด๋–ค ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ถ”์ฒœํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@macwis๋‹˜ ๋ง์”€์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ๋งค์šฐ ๊น๋‹ˆ๋‹ค. PR์„ ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ๋Š๋‚Œ์ด ์•„๋‹ˆ๋ผ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๋Œ€๋‹ค์ˆ˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ CSS๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ™•์ธํ–ˆ์„ ๋•Œ Leaflet์€ unpkg CDN, ์ฆ‰ ๋ฒˆ๋“ค๋˜์ง€ ์•Š์€ CSS์—์„œ ๋‹ค์šด๋กœ๋“œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ ์ ˆํ•œ ์†”๋ฃจ์…˜์€ ์œ„์˜ ๋งŽ์€ ๋ฉ”์‹œ์ง€์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ๊ธฐ๋ณธ ์•„์ด์ฝ˜ ์˜ต์…˜์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ Leaflet ํ†ตํ•ฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ผ๋ถ€๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๋ณด๋‹ค ์ž๋™ํ™”๋œ ์†”๋ฃจ์…˜์„ ์›ํ•  ๊ฒฝ์šฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

PR์„ ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์˜๊ฒฌ์„ ์ฝ์œผ์‹ญ์‹œ์˜ค(์˜ˆ: https://github.com/Leaflet/Leaflet/issues/4968#issuecomment -382639119).

์•ฝ๊ฐ„์˜ ํžŒํŠธ๋ฅผ ๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋„ CDN์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์˜ˆ๋ฅผ ๋“ค์–ด React App์œผ๋กœ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” CDN์„ ํ†ตํ•ด ํฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

@googol7 ์ž…๋ ฅ

๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ •ํ•ด ์ฃผ์„ธ์š”. CDN์„ ํ†ตํ•ด Leaflet์„ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ CSS๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋Œ€๋‹ค์ˆ˜์ž…๋‹ˆ๋‹ค.

@gybs : ๋‚ด๊ฐ€ํ•ด์•ผ ํ•  ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// Workaround: https://github.com/Leaflet/Leaflet/issues/4968#issuecomment-269750768
/* eslint-disable no-underscore-dangle, global-require */
delete L.Icon.Default.prototype._getIconUrl

L.Icon.Default.mergeOptions({
    iconRetinaUrl: require("leaflet/dist/images/marker-icon-2x.png"),
    iconUrl: require("leaflet/dist/images/marker-icon.png"),
    shadowUrl: require("leaflet/dist/images/marker-shadow.png"),
})
/* eslint-enable no-underscore-dangle, global-require */

์›นํŒฉ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

module.exports = {
    externals: {
        leaflet: "L",
    },
}

@googol7 ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์•Œ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ CDN์—์„œ Leaflet JS๋ฅผ ๋กœ๋“œํ•˜์ง€๋งŒ ์•ฑ์— CSS์™€ ์ด๋ฏธ์ง€๋ฅผ ๋ฒˆ๋“ค๋กœ ํฌํ•จํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

@gybs ์˜ˆ, ์—ฌ๊ธฐ์—์„œ ์ผ์–ด๋‚˜๋Š”

์ฒ˜์Œ ๋‘ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค: https://leafletjs.com/examples/quick-start/
๋‚˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํŠœํ† ๋ฆฌ์–ผ์˜ CSS๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" integrity="sha512-Rksm5RenBEKSKFjgI3a41vrjkw4EVPlJ3+OiI65vTjIdo9brlAacEuKOiQ5OFh7cOI1bkDwLqdLw3Zg0cRJAAQ==" crossorigin=""/>

๊ทธ๋ฆฌ๊ณ  ๊ทธ ์งํ›„์˜ ์ „๋‹จ์ง€ ์Šคํฌ๋ฆฝํŠธ

<script src="https://unpkg.com/[email protected]/dist/leaflet.js" integrity="sha512-/Nsx9X4HebavoBvEBuyp3I7od5tA0UzAxs+j83KgC8PU0kgB4XiK4Lfe4y4cgBtaRJQEIFCW+oC506aPT2L1zw==" crossorigin=""></script>

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

๋‚ด PR https://github.com/Leaflet/Leaflet/pull/5771 ์—์„œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” Leaflet ํ”Œ๋Ÿฌ๊ทธ์ธ " leaflet-defaulticon-compatibility "๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค .
ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด Leaflet ๊ธฐ๋ณธ ์•„์ด์ฝ˜์ด ๋” ์ด์ƒ ์•„์ด์ฝ˜ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋ฅผ ์žฌ๊ตฌ์ถ•ํ•˜์ง€ ์•Š๊ณ  CSS์— ์™„์ „ํžˆ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด CSS๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์‚ฐ์„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š”(์ผ๋ฐ˜์ ์œผ๋กœ url() ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š”) ๋นŒ๋“œ ์—”์ง„ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ(CSS + JS) _after_ Leaflet์„ ๋กœ๋“œํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์›นํŒฉ์—์„œ:

import 'leaflet/dist/leaflet.css'
import 'leaflet-defaulticon-compatibility/dist/leaflet-defaulticon-compatibility.webpack.css'
import * as L from 'leaflet'
import 'leaflet-defaulticon-compatibility'

( ๋ฐ๋ชจ )

๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ Leaflet ์ฝ”์–ด์— ์ง์ ‘ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ–ˆ์„ ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ถ”๊ฐ€๋œ ์ฝ”๋“œ๋Š” ๋Œ€๋‹ค์ˆ˜์˜ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ์“ธ๋ชจ๊ฐ€ ์—†๋‹ค๋Š” ์ฃผ์žฅ์ด ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ต์‹ฌ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ ค๋Š” Leaflet ์ •์‹ ์— ๋งž์ถฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž‘๋™ ๋ฐฉ์‹์— ๋ฌธ์ œ๋‚˜ ์šฐ๋ ค ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์—์„œ ๋ฌธ์ œ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์—ฌ์‹ญ์‹œ์˜ค.

์‚ฌ์‹ค์€ ์›นํŒฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์›นํŒฉ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์ดํŠธ๊ฐ€ ์ ์  ๋Š˜์–ด๋‚˜๊ณ  ์žˆ๋Š” ์ถ”์„ธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋‘๋Š” ๊ฒƒ์€ IMHO์ฒ˜๋Ÿผ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ฐพ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๋‚ด๊ฐ€ dup์„ ์—ด์—ˆ์„ ๋•Œ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ).
์ด๊ฒƒ์€ ๊ธฐ๋Šฅ๋ณด๋‹ค ๋ฒ„๊ทธ ์ˆ˜์ •์— ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋‚ด๋ถ€ ์ „๋‹จ์ง€๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค...

Angular 6์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด angular.json ํ•˜์„ธ์š”.

 {
         "glob": "**/*",
         "input": "./node_modules/leaflet/dist/images/",
         "output": "./assets/leaflet/"
  }

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด์ „ ๋‹ต๋ณ€์—์„œ ์ œ์•ˆํ•œ ๋Œ€๋กœ Marker ๊ธฐ๋ณธ ๋™์ž‘์„ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

import { Icon, icon, Marker, marker } from 'leaflet';

@Component({
   selector: 'app-something',
   templateUrl: './events.component.html',
   styleUrls: ['./events.component.scss']
})
export class SomeComponent implements OnInit {
  // Override default Icons
  private defaultIcon: Icon = icon({
    iconUrl: 'assets/leaflet/marker-icon.png',
    shadowUrl: 'assets/leaflet/marker-shadow.png'
  });

  ngOnInit() {
     Marker.prototype.options.icon = this.defaultIcon;
  }
}

๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ Angular ํŒจํ‚ค์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ngx-leaflet

๋…ธํŠธ:
StackOverflow์˜๊ฐ€์— ๊ฐ๋„ 6 ์ž‘์€ ์บ์น˜ _t.animal_์—์„œ ์‘๋‹ต์œผ๋กœ,์ด ๋งํ•œ๋‹ค

Angular 6์—๋Š” build ๋ฐ test ์•„ํ‚คํ…ํŠธ์— ๋‘ ๊ฐœ์˜ ๊ด€๋ จ ๋นŒ๋”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

build ์•„๋ž˜์— ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@marko-jovanovic ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ž์‚ฐ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํŒจํ‚ค์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
๊ท€ํ•˜์˜ ์ œ์•ˆ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•, IMO์— ๋Œ€ํ•œ ๋‚ด ์ •์˜์— ์†ํ•ฉ๋‹ˆ๋‹ค.

@HarelM ๊ธ€์Ž„, ๋‚˜๋Š” ํ•™๊ต ํ”„๋กœ์ ํŠธ๋ฅผ ๋๋‚ด๊ธฐ ์œ„ํ•ด ์„œ๋‘๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์™„๋ฒฝํ•˜์ง€ ์•Š๊ณ  ํŒจํ‚ค์ง€ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋‚ด ์†”๋ฃจ์…˜์œผ๋กœ ์ถฉ๋ถ„ํ–ˆ์œผ๋ฉฐ ๋‚ด ๋‹ต๋ณ€์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋„ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@marko-jovanovic ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์€ ํ›Œ๋ฅญํ•˜๋ฉฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ๋„์šธ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ ํ•ด๊ฒฐ์ฑ…์„ ๋ฐ”๋ž„ ๋ฟ์ž…๋‹ˆ๋‹ค :-)

@marko-jovanovic ์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ๋„ˆ๋ฌด ํ•™๊ต ํ”„๋กœ์ ํŠธ(Angular 6)์— ์•‰์•„ ์žˆ๊ณ  ์™œ ์ €์—๊ฒŒ ํšจ๊ณผ๊ฐ€ ์—†๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ ๋งํ•ด์„œ ๋‚˜๋Š” ์—ฌ๊ธฐ์— ์žˆ๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ์™„์ „ํžˆ ๋ฉ์ฒญํ•œ ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค.

๋‚ด ๊ตฌ์„ฑ ์š”์†Œ์˜ ngOnInit -Function์— ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด iconUrl ๋ฐ shadowUrl ๋ฅผ ์„ค์ •ํ•œ ๋ถ€๋ถ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Argument of type '{ iconUrl: (options: IconOptions) => Icon<IconOptions>; shadowUrl: any; }' is not assignable to parameter of type 'IconOptions'. Types of property 'iconUrl' are incompatible. Type '(options: IconOptions) => Icon<IconOptions>' is not assignable to type 'string'.

๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

@gittiker ๊ฐ€์ ธ์˜ค๊ธฐ, ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ ngOnInit ์˜ˆ์ œ๋กœ ๋‹ต๋ณ€์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ๋˜์—ˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”. :)

@gittiker ๊ฐ€์ ธ์˜ค๊ธฐ, ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ ngOnInit ์˜ˆ์ œ๋กœ ๋‹ต๋ณ€์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ๋˜์—ˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”. :)

์˜ˆ, ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์นจ๋‚ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ URL์„ ์•ฝ๊ฐ„ ์กฐ์ž‘ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
'assets/leaflet/images/marker-icon.png ๋Œ€์‹  'assets/leaflet/marker-icon.png', . ๊ทธ๋ฆผ์ž ์ด๋ฏธ์ง€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

@crob611 ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

@marko-jovanovic ๋‹น์‹ ์ด ์ €๋ฅผ ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค! ๊ทธ๋Ÿฌ๋‚˜ @HarelM ์€ ์–ด๋–ป๊ฒŒ

๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €์—๊ฒŒ๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค: (Angular 6 ๋ฐ leaflet1.3.4)
์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„
(https://codehandbook.org/use-leaflet-in-angular/)
๊ทธ๋Ÿฌ๋‚˜ ์•„์ด์ฝ˜์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
์˜ค๋ฅ˜ ๊ฐ€์ ธ์˜ค๊ธฐ ์•„์ด์ฝ˜ ์ด๋ฏธ์ง€
net::ERR_INVALID_URL
๊ตฌ์„ฑ ์š”์†Œ์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ํ•ด๊ฒฐํ•˜์‹ญ์‹œ์˜ค.
์‚ญ์ œ L.Icon.Default.prototype._getIconUrl;`

L.Icon.Default.mergeOptions({
  iconRetinaUrl: '/assets/leaflet/dist/images/marker-icon-2x.png',
  iconUrl: '/assets/leaflet/dist/images/marker-icon.png',
  shadowUrl: '/assets/leaflet/dist/images/marker-shadow.png',
});`

vue2-leaflet 1.2.3๊ณผ ํ•จ๊ป˜ ์ „๋‹จ์ง€ 1.3.4๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์†”๋ฃจ์…˜:

import { L, LControlAttribution, LMap, LTileLayer, LMarker, LGeoJson, LPopup } from 'vue2-leaflet'
delete L.Icon.Default.prototype._getIconUrl
L.Icon.Default.mergeOptions({
  iconRetinaUrl: require('leaflet/dist/images/marker-icon-2x.png'),
  iconUrl: require('leaflet/dist/images/marker-icon.png'),
  shadowUrl: require('leaflet/dist/images/marker-shadow.png')
})

๋‚ด 2์„ผํŠธ: ์›นํŒฉ์— ๋Œ€ํ•œ ๋‚ด ๋ฌธ์ œ๋Š” ํ•ด์‹œ๋œ ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ ์ธํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ์ „๋‹จ์ง€์˜ ์ด๋ฏธ์ง€๋ฅผ ํ•ด์‹œํ•˜์ง€ ์•Š๋„๋ก file-loader ํ–ˆ์Šต๋‹ˆ๋‹ค.

use: [{
    loader: 'file-loader',
    options:
      {
        name(file) {
          console.log(file)
          if (file.match(/(layers-2x\.png|layers\.png|marker-icon\.png|marker-icon-2x\.png|marker-shadow\.png)/)) {
            return '[name].[ext]'
          }

          return '[name]-[hash].[ext]'
        },
        context: 'app/frontend' // <-- project specific
      }
  }]

๋ฌด๋ก€ํ•˜์ง€๋งŒ ํšจ์œจ์ ์ธ AFAIK.

@gybs ํ•ซํ”ฝ์Šค ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ์ด ๋ฒ„๊ทธ๋ฅผ ๋ช‡ ๋ฒˆ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด ์ „์ฒด ์Šค๋ ˆ๋“œ๋Š” ์ˆ˜์ •๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ๋ฌธ์ œ๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ ํ„ฐ๋ฌด๋‹ˆ์—†๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

Webpack๊ณผ ํ•จ๊ป˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— Google์—์„œ ์ €๋ฅผ ์—ฌ๊ธฐ๋กœ ๋ฐ๋ ค์™”์Šต๋‹ˆ๋‹ค.

์™œ ๊ทธ ์ด๋ฏธ์ง€๊ฐ€ svg๋กœ ์ธ๋ผ์ธ๋˜์ง€ ์•Š๋Š”์ง€ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

postcss ๋ฐ postcss-inline-svg ๋กœ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„์ด์ฝ˜์€ ์™ธ๋ถ€ png ๋Œ€์‹  ์ธ๋ผ์ธ svg ํŒŒ์ผ์ด ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด ์•„์ด์ฝ˜์ด ๋” ์„ ๋ช…ํ•ด์ง‘๋‹ˆ๋‹ค.

์™œ ๊ทธ ์ด๋ฏธ์ง€๊ฐ€ svg๋กœ ์ธ๋ผ์ธ๋˜์ง€ ์•Š๋Š”์ง€ ์•„๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ ˆ๊ฑฐ์‹œ ๋ธŒ๋ผ์šฐ์ € ์ง€์›.

@IvanSanchez ๊ฐ์‚ฌ

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ž ์žฌ์ ์ธ ์†”๋ฃจ์…˜์„ ๋ด…๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์ด๋ฏธ์ง€๋ฅผ base64๋กœ ์ธ์ฝ”๋”ฉ๋œ .png ๋กœ ์ธ๋ผ์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋Œ€์•ˆ์€ .svg ์•„์ด์ฝ˜์„ ์ธ๋ผ์ธํ•˜๊ณ  ๋ ˆ๊ฑฐ์‹œ ํ”Œ๋žซํผ์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ๋ณธ ์•„์ด์ฝ˜์„ ์žฌ์ •์˜ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜ ์ค‘ ํ’€ ๋ฆฌํ€˜์ŠคํŠธํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ „๋‹จ์ง€ ์—์„œ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ € ์ค‘ svg( caniuse )๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ 7 ๋ฐ 8
  • ์•ˆ๋“œ๋กœ์ด๋“œ ๋ธŒ๋ผ์šฐ์ € 2.*

์ด๋ฏธ์ง€๋ฅผ base64๋กœ ์ธ๋ผ์ธ

https://github.com/Leaflet/Leaflet/issues/4968#issuecomment -322422045 ์ฐธ์กฐ

์•ต์ปค์™€ ํฌ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

   import icon from 'leaflet/dist/images/marker-icon.png';
   import iconShadow from 'leaflet/dist/images/marker-shadow.png';

   let DefaultIcon = L.icon({
      iconUrl: icon,
      shadowUrl: iconShadow,
      iconSize: [24,36],
      iconAnchor: [12,36]
    });

    L.Marker.prototype.options.icon = DefaultIcon; 

์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(Flask๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์›นํŒฉ์ด๋ฏ€๋กœ ๋ชจ๋“  ์š”์†Œ๋Š” ์ •์  ํด๋”์— ์žˆ์–ด์•ผ ํ•จ). ํ•˜์ง€๋งŒ @giorgi-m ์ˆ˜์ •์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. '"๋‚ด๋ณด๋‚ด๊ธฐ"๊ฐ€ ์ฝ๊ธฐ ์ „์šฉ์ž…๋‹ˆ๋‹ค' ์˜ค๋ฅ˜( Firefox, png ๊ฐ€์ ธ์˜ค๊ธฐ์— ์—ฐ๊ฒฐ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?).
๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์ง€๋งŒ 1.4.0์—์„œ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

vue2-leaflet 2.0.2 ๋ฐ ์ „๋‹จ์ง€ 1.4.0์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฝค ์˜ค๋žซ๋™์•ˆ ์กด์žฌํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ์ œ์‹œ๋œ ์†”๋ฃจ์…˜์˜ ์ ˆ๋ฐ˜์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€์ด ๋ฌธ์ œ์˜ ๊ทผ์›์„ ์•Œ์•„ ๋ƒˆ์Šต๋‹ˆ๊นŒ?

"vue2-leaflet": "2.0.3" ์ „๋‹จ์ง€ "leaflet": "1.4.0" ๋ฒ„์ „๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์›นํŒฉ๋„ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

๋™์ผํ•œ ๋ฌธ์ œ์—์„œ ์ฐพ์€ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ vue2-leaflet 2.0.3 ๋ฐ ์ „๋‹จ์ง€ 1.4.0์„ ์„ฑ๊ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

import L from 'leaflet'
require('../../node_modules/leaflet/dist/leaflet.css')

// FIX leaflet's default icon path problems with webpack
delete L.Icon.Default.prototype._getIconUrl
L.Icon.Default.mergeOptions({
  iconRetinaUrl: require('leaflet/dist/images/marker-icon-2x.png'),
  iconUrl: require('leaflet/dist/images/marker-icon.png'),
  shadowUrl: require('leaflet/dist/images/marker-shadow.png')
})

์งˆ๋ฌธํ•ด์•ผ ํ•  ๋” ๋‚˜์€ ์งˆ๋ฌธ์€ ์™œ ์ด๊ฒƒ์ด ๋ฌธ์ œ๋ฅผ ์ข…๊ฒฐ์‹œํ‚จ ๋ณ‘ํ•ฉ๋œ ์ฝ”๋“œ๋กœ ์ˆ˜์ •๋˜์ง€ ์•Š์•˜๋Š๋ƒ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ํ›Œ๋ฅญํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•ด์•ผ ํ•˜๋ฉฐ ์—ฌ์ „ํžˆ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„ ๋ชจ๋‘์—๊ฒŒ,

์ „๋‹จ์ง€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Leaflet๊ณผ ๊ฒฐํ•ฉ๋œ Webpack(๋ฐ ๊ธฐํƒ€ ๋นŒ๋“œ ์—”์ง„)์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://github.com/Leaflet/Leaflet/issues/4968#issuecomment -399857656: leaflet-defaulticon-compatibility ์—์„œ ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์„ ์ฐธ์กฐ ํ•˜์„ธ์š”.

๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ Leaflet ์ฝ”์–ด์— ์ง์ ‘ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ–ˆ์„ ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ถ”๊ฐ€๋œ ์ฝ”๋“œ๋Š” ๋Œ€๋‹ค์ˆ˜์˜ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ์“ธ๋ชจ๊ฐ€ ์—†๋‹ค๋Š” ์ฃผ์žฅ์ด ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ต์‹ฌ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ ค๋Š” Leaflet ์ •์‹ ์— ๋งž์ถฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋กœ๋”๋ฅผ ๊ตฌ์„ฑํ•œ ํ›„์—๋Š” ๋˜ ๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜ ์ธ webpack์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

import L from 'leaflet';
delete L.Icon.Default.prototype._getIconUrl;

L.Icon.Default.mergeOptions({
  iconRetinaUrl: require('leaflet/dist/images/marker-icon-2x.png'),
  iconUrl: require('leaflet/dist/images/marker-icon.png'),
  shadowUrl: require('leaflet/dist/images/marker-shadow.png'),
});

๋‹ค๋ฅธ ๋นŒ๋“œ ์—”์ง„ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ ์กฐํ•ฉ์— ๋Œ€ํ•ด ์ด ์Šค๋ ˆ๋“œ์˜ ์ƒ์œ„์— ์ œ์•ˆ๋œ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜์ด ์ฃผ์„ ์•„๋ž˜์— ๋” ์ด์ƒ ๋ฌปํžˆ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ž ๊ธ€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ณต์œ  ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ๋ชจ๋‘ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! :+1:

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰