使用 font awesome 自定义 react-leaflet 标记图标
Customizing react-leaflet marker icons by using font awesome
与其说是问题,不如说是理论问题
如何将font awesome icons用作react-leaflet map marker icons?
我想要这样一个图标选择器控件来分配(自定义)我在地图上获得的每个标记图标。顺便说一下,我正在使用 Map 和 Marker 的 JSX 组件。
有可能实现吗?
有人有这方面的样品笔吗?我真的用谷歌搜索了一下,但找不到任何插件,只有一个仅适用于 Leaflet 1.0 的 fontawesome 插件。
所以任何想法表示赞赏。
提前致谢。
由于某些原因代码没有格式化。请参阅 code sandbox
上的代码
这里介绍了如何使用超棒的字体图标作为标记。
- 将超棒的 CDN 添加到您的
index.html
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" integrity="sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU"
crossorigin="anonymous">
使用 divIcon
和 react-dom/server
中的 renderToStaticMarkup
生成标记图标。并将此 divIcon
作为 icon
道具传递给 Marker
。
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import { renderToStaticMarkup } from 'react-dom/server';
import { divIcon } from 'leaflet';
import { Map, TileLayer, Marker, Popup } from 'react-leaflet';
import './styles.css';
class App extends Component {
state = {
lat: 51.505,
lng: -0.091,
zoom: 13,
};
render() {
const position = [this.state.lat, this.state.lng];
const iconMarkup = renderToStaticMarkup(<i className=" fa fa-map-marker-alt fa-3x" />);
const customMarkerIcon = divIcon({
html: iconMarkup,
});
return (
<Map center={position} zoom={this.state.zoom}>
<TileLayer
attribution="&copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors"
url="https://{s}.tile.osm.org/{z}/{x}/{y}.png"
/>
<Marker position={position} icon={customMarkerIcon}>
<Popup>
A pretty CSS3 popup. <br /> Easily customizable.
</Popup>
</Marker>
</Map>
);
}
}
const rootElement = document.getElementById('root');
ReactDOM.render(<App />, rootElement);
通过将以下 class 添加到您的 css 文件
来覆盖 divIcon 默认样式
.leaflet-div-icon {
background: transparent;
border: none;
}
- 这是一个相同的工作示例:
https://codesandbox.io/s/4ry180jl34
对于已经在使用Fontawesome(FontAwesomeIcon)的React组件的用户,有一个解决方案不需要再次通过CDN导入。它使用与 Murli 的答案相同的原则,但不是添加 <i className=" fa fa-map-marker-alt fa-3x" />
,您可以将 FontAwesomeIcon 组件转换为 html 并将其传递到 divIcon 的 html 属性中。它看起来像这样(改编了已接受答案的示例):
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import ReactDOMServer from 'react-dom/server';
import Leaflet from 'leaflet'
import { Map, TileLayer, Marker, Popup } from 'react-leaflet';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import './styles.css';
// FontAwesome requirements
import { faUserAstronaut } from '@fortawesome/free-solid-svg-icons'
library.add(faUserAstronaut)
class App extends Component {
state = {
lat: 51.505,
lng: -0.091,
zoom: 13,
};
render() {
const position = [this.state.lat, this.state.lng];
const iconHTML = ReactDOMServer.renderToString(<FontAwesomeIcon icon='user-astronaut' />)
const customMarkerIcon = new Leaflet.DivIcon({
html: iconHTML,
});
return (
<Map center={position} zoom={this.state.zoom}>
<TileLayer
attribution="&copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors"
url="https://{s}.tile.osm.org/{z}/{x}/{y}.png"
/>
<Marker position={position} icon={customMarkerIcon}>
<Popup>
A pretty CSS3 popup. <br /> Easily customizable.
</Popup>
</Marker>
</Map>
);
}
}
const rootElement = document.getElementById('root');
ReactDOM.render(<App />, rootElement);
创建 divIcon
并将其插入 icon
属性:
// marker-icons.js
import L from 'leaflet';
const factory = new L.divIcon({
className: '',
iconAnchor: [12, 25],
labelAnchor: [-6, 0],
popupAnchor: [0, -15],
iconSize: [25, 41],
html: `<span class="fa fa-industry"></span>`
});
export default { factory };
在组件文件中使用图标:
// component.js
import { factory } from './marker-icons';
<MapContainer center={[12.23432, 87.234]} zoom={6} scrollWheelZoom={false}>
<TileLayer attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"/>
<Marker position={45.4534, 23.43]} icon={factory}>
<Popup>Help text</Popup>
</Marker>
</MapContainer>
与其说是问题,不如说是理论问题
如何将font awesome icons用作react-leaflet map marker icons?
我想要这样一个图标选择器控件来分配(自定义)我在地图上获得的每个标记图标。顺便说一下,我正在使用 Map 和 Marker 的 JSX 组件。
有可能实现吗?
有人有这方面的样品笔吗?我真的用谷歌搜索了一下,但找不到任何插件,只有一个仅适用于 Leaflet 1.0 的 fontawesome 插件。
所以任何想法表示赞赏。
提前致谢。
由于某些原因代码没有格式化。请参阅 code sandbox
上的代码这里介绍了如何使用超棒的字体图标作为标记。
- 将超棒的 CDN 添加到您的
index.html
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css" integrity="sha384-mzrmE5qonljUremFsqc01SB46JvROS7bZs3IO2EmfFsd15uHvIt+Y8vEf7N7fWAU"
crossorigin="anonymous">
使用
divIcon
和react-dom/server
中的renderToStaticMarkup
生成标记图标。并将此divIcon
作为icon
道具传递给Marker
。import React, { Component } from 'react'; import ReactDOM from 'react-dom'; import { renderToStaticMarkup } from 'react-dom/server'; import { divIcon } from 'leaflet'; import { Map, TileLayer, Marker, Popup } from 'react-leaflet'; import './styles.css'; class App extends Component { state = { lat: 51.505, lng: -0.091, zoom: 13, }; render() { const position = [this.state.lat, this.state.lng]; const iconMarkup = renderToStaticMarkup(<i className=" fa fa-map-marker-alt fa-3x" />); const customMarkerIcon = divIcon({ html: iconMarkup, }); return ( <Map center={position} zoom={this.state.zoom}> <TileLayer attribution="&copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors" url="https://{s}.tile.osm.org/{z}/{x}/{y}.png" /> <Marker position={position} icon={customMarkerIcon}> <Popup> A pretty CSS3 popup. <br /> Easily customizable. </Popup> </Marker> </Map> ); } } const rootElement = document.getElementById('root'); ReactDOM.render(<App />, rootElement);
通过将以下 class 添加到您的 css 文件
来覆盖 divIcon 默认样式.leaflet-div-icon { background: transparent; border: none; }
- 这是一个相同的工作示例:
https://codesandbox.io/s/4ry180jl34
- 这是一个相同的工作示例:
对于已经在使用Fontawesome(FontAwesomeIcon)的React组件的用户,有一个解决方案不需要再次通过CDN导入。它使用与 Murli 的答案相同的原则,但不是添加 <i className=" fa fa-map-marker-alt fa-3x" />
,您可以将 FontAwesomeIcon 组件转换为 html 并将其传递到 divIcon 的 html 属性中。它看起来像这样(改编了已接受答案的示例):
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import ReactDOMServer from 'react-dom/server';
import Leaflet from 'leaflet'
import { Map, TileLayer, Marker, Popup } from 'react-leaflet';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import './styles.css';
// FontAwesome requirements
import { faUserAstronaut } from '@fortawesome/free-solid-svg-icons'
library.add(faUserAstronaut)
class App extends Component {
state = {
lat: 51.505,
lng: -0.091,
zoom: 13,
};
render() {
const position = [this.state.lat, this.state.lng];
const iconHTML = ReactDOMServer.renderToString(<FontAwesomeIcon icon='user-astronaut' />)
const customMarkerIcon = new Leaflet.DivIcon({
html: iconHTML,
});
return (
<Map center={position} zoom={this.state.zoom}>
<TileLayer
attribution="&copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors"
url="https://{s}.tile.osm.org/{z}/{x}/{y}.png"
/>
<Marker position={position} icon={customMarkerIcon}>
<Popup>
A pretty CSS3 popup. <br /> Easily customizable.
</Popup>
</Marker>
</Map>
);
}
}
const rootElement = document.getElementById('root');
ReactDOM.render(<App />, rootElement);
创建 divIcon
并将其插入 icon
属性:
// marker-icons.js
import L from 'leaflet';
const factory = new L.divIcon({
className: '',
iconAnchor: [12, 25],
labelAnchor: [-6, 0],
popupAnchor: [0, -15],
iconSize: [25, 41],
html: `<span class="fa fa-industry"></span>`
});
export default { factory };
在组件文件中使用图标:
// component.js
import { factory } from './marker-icons';
<MapContainer center={[12.23432, 87.234]} zoom={6} scrollWheelZoom={false}>
<TileLayer attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"/>
<Marker position={45.4534, 23.43]} icon={factory}>
<Popup>Help text</Popup>
</Marker>
</MapContainer>