์ ์๊ฒ ์ ๊ณต๋๋ ์ด๋ฏธ์ง 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 (๊ธ์ง๋จ)
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๊ณผ ์ ๋จ์ง๋ฅผ ์ฌ์ฉํ๋ ์์ ํ ๋ค๋ฅธ ๋ ํ๋ก์ ํธ์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ง๋์ ๋ง์ปค๋ฅผ ์ถ๊ฐํ๋ฉด ์ด๋ฏธ์ง๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์์ ๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ข์, ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ์ป์๋ค.
๋ฐ๋ผ์ ํ์ฌ ์ด๋ฏธ์ง(์์ด์ฝ ๋ฐ ๊ทธ๋ฆผ์)๋ฅผ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ง์ปค๊ฐ ์ด์ ๊ฐ์ด ๋ณด์
๋๋ค.
์ ๋จ์ง์ ์ด ๊ธฐ๋ฅ:
_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 ๊ฒฝ๋ก๊ฐ ์ด๋ฏธ ์๋ชป๋์๊ณ ๊ทธ ์ด์ ๋ ์์ง ๋ชจ๋ฆ ๋๋ค. ์ด์ ๋ง์ปค๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ ๋๋ค.
@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
๋ง์ปค ์ด๋ฏธ์ง๋ฅผ ํ๋ ์ฝ๋ฉํ๋์ด ์ปค๋ฐ๊ณผ ๊ด๋ จ ๋ ์ ์์ต๋๊น?
https://github.com/Leaflet/Leaflet/commit/837d19093307eb5eeb1fca6536962a1ab1573dd5
@Radu-Filip PR์ ๋ํ ์ด๋ฌํ ์์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ต๋๋ค. ํ์ง๋ง ์ด๊ฒ์ด ์ด๋ค ๋ค๋ฅธ ์ํฅ์ ๋ฏธ์น ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ฌธ์ ๋ ๋น์ ์ด ๋งํ๋ฏ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์์ด์ฝ์ ๋ํ ๊ธฐ๋ณธ 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);
์ด ๋ฌธ์ ์ ๋ํ ์ข์ ์์ ์ด ์์ ๋๊น์ง _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);
@ajoslin103 , ์ด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ณ ๋ ค
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 ์ฑ๋ฅ ๋ณด๊ธฐ์ ๋๋ค.
์ธ๋ผ์ธ base64๋ก 1000๊ฐ์ ๋ง์ปค ์์ด์ฝ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋น๊ตํ์ฌ(ํ์๋ผ์ธ์ ๋ํด ๋ค๋ฅธ ๋ฐฐ์จ์ ํ์ธํ์ญ์์ค. ์ฃ์กํฉ๋๋ค):
๋ณด์๋ค์ํผ, ์ธ๋ผ์ธ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ๋ ์ด๋ค ์ด์ ๋ก ๋ ์ด์ด ๊ตฌ์ฑ์ด ์ง์ฐ๋์ด ์ ์ฒด ๋ก๋๊ฐ ์ฝ 1์ด ๋ ์ค๋ ๊ฑธ๋ฆฝ๋๋ค.
์ผ์์ ์ธ ์ฌ์ฉ์ ๊ฒฝ์ฐ ์ด๊ฒ์ ์ค์ํ์ง ์์ ์ ์์ง๋ง ๋ง์ปค๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ด๋ จ์ด ์์ ์ ์์ต๋๋ค.
์ด ์ฅ๊ธฐ๊ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์:
๋ ๋ค๋ฅธ ์ต์ ์ ์ด๋ฏธ์ง ๊ฒฝ๋ก๋ฅผ ๊ฐ์งํ๊ธฐ ์ํด ์ด์ (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๊ฐ์ง ์ ํ์ ๋๋ค.
๊ฝค ๋ง์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋๋ผ๋ ์ฒซ ๋ฒ์งธ ์ ์ ํผํ ์ ์๋ค๋ฉด ๋ ๋ฒ์งธ ์ ์ ํฅ๋ฏธ๋กญ์ต๋๋ค.
์ฒซ ๋ฒ์งธ๋ ์ค์ ๋ก 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 )๋ฅผ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๋ฏธ์ง๋ฅผ 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:
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ชป๋ data:url ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ด๊ฐ ํ ์ผ์ ๊ณต์ ํ๊ณ ์ถ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ธฐ๋ณธ ์์ด์ฝ์ ์ ๊ณต๋ ๋ง์ปค ์์ด์ฝ๊ณผ ๊ทธ๋ฆผ์๋ฅผ ์ฌ์ฉํ๋ ์ ์์ด์ฝ์ผ๋ก ์ค์ ํ์ง๋ง webpack์ด ํด๋น ์ด๋ฏธ์ง์ ๋ฐ์ดํฐ ์ธ์ฝ๋ฉ์ ๊ฐ๋ณ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ํฉ๋๋ค. ์ด๋๊ฐ์ ์ด์ ๊ฐ์ ํ์ผ์ ํฌํจํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๋ง๋ง ์์ด์ฝ๋ ํฌํจํ๋๋ก ์กฐ์ ํ ์ ์์ต๋๋ค.