arn*_*bro 6 maps icons marker leaflet react-leaflet
我尝试了我在网上找到的所有东西,Stackoverflow和Github,我仍然无法做到.
我想用自定义图标制作自定义标记,但是我的代码总是出现错误:'TypeError:options.icon.createIcon不是函数'
这是我的代码(文件夹路径没有错误,一切都在src/js或src/img中)
Icon.js
import L from 'leaflet';
const iconPerson = L.Icon.extend({
options: {
iconUrl: require('../img/marker-pin-person.svg'),
iconRetinaUrl: require('../img/marker-pin-person.svg'),
iconAnchor: null,
popupAnchor: null,
shadowUrl: null,
shadowSize: null,
shadowAnchor: null,
iconSize: new L.Point(60, 75),
className: 'leaflet-div-icon'
}
});
export { iconPerson };
Run Code Online (Sandbox Code Playgroud)
MarkerPinPerson
import React from 'react';
import { Marker } from 'react-leaflet';
import { iconPerson } from './Icons';
export default class MarkerPinPerson extends React.Component {
render() {
return (
<Marker
position={this.props.markerPosition}
icon={ iconPerson }
>
</Marker>
);
}
}
Run Code Online (Sandbox Code Playgroud)
真的在寻求你的帮助!
arn*_*bro 19
我终于找到了Icon.js文件的正确代码:
import L from 'leaflet';
const iconPerson = new L.Icon({
iconUrl: require('../img/marker-pin-person.svg'),
iconRetinaUrl: require('../img/marker-pin-person.svg'),
iconAnchor: null,
popupAnchor: null,
shadowUrl: null,
shadowSize: null,
shadowAnchor: null,
iconSize: new L.Point(60, 75),
className: 'leaflet-div-icon'
});
export { iconPerson };
Run Code Online (Sandbox Code Playgroud)
小智 10
我也遇到了同样的问题。这是我的工作解决方案:
`import L from 'leaflet';
import marker from '../assets/placer.svg';
const myIcon = new L.Icon({
iconUrl: marker,
iconRetinaUrl: marker,
popupAnchor: [-0, -0],
iconSize: [32,45],
});`
Run Code Online (Sandbox Code Playgroud)
我是在试图弄清楚如何呈现自定义图标服务器端(使用 react-leaflet-universal)时被带到这里的。我想我会发布这个以防将来有人出于同样的原因发现自己在这里。就像在 react-leaflet-markercluster 的情况下一样,我能够通过在返回函数中要求传单来实现这一点,例如:
<Map center={this.props.center}
zoom={zoom}
className={leafletMapContainerClassName}
scrollWheelZoom={false}
maxZoom={18}
preferCanvas={false}
>
{() => {
const MarkerClusterGroup = require('react-leaflet-markercluster').default;
const L = require('leaflet');
const myIcon = L.icon({
iconUrl: require('../assets/marker.svg'),
iconSize: [64,64],
iconAnchor: [32, 64],
popupAnchor: null,
shadowUrl: null,
shadowSize: null,
shadowAnchor: null
});
return (
<React.Fragment>
<TileLayer
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
attribution=''
setParams={true}
/>
<MarkerClusterGroup>
{coordArray.map(item => {
return (
<Marker icon={myIcon} key={item.toString()} position={[item.lat, item.lng]}>
{item.title && <Popup>
<span>{item.title}</span>
</Popup>}
</Marker>
)
})}
</MarkerClusterGroup>
</React.Fragment>
);
}}
</Map>
Run Code Online (Sandbox Code Playgroud)
在react-leaflet v3中,这对我来说非常有效:首先我制作了一个SVG图标,然后我用它进行编码encodeURIComponent,最后我将它传递给Marker
import React, {useEffect} from 'react';
import {MapContainer, Marker, Popup, TileLayer} from 'react-leaflet';
import Main from "../publicComponents/main";
import L from "leaflet";
const position = [35.72428729739558, 51.447000503540046]
const Red_MARKER = `data:image/svg+xml;utf8,${encodeURIComponent(`<?xml version="1.0" encoding="iso-8859-1"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="36.059" height="36.059" viewBox="0 0 36.059 36.059" style="transform:rotate(${0}deg)">
<defs>
<filter id="Path_10080" x="0" y="0" width="36.059" height="36.059" filterUnits="userSpaceOnUse">
<feOffset input="SourceAlpha"/>
<feGaussianBlur stdDeviation="2.5" result="blur"/>
<feFlood flood-opacity="0.161"/>
<feComposite operator="in" in2="blur"/>
<feComposite in="SourceGraphic"/>
</filter>
</defs>
<g id="Group_8038" data-name="Group 8038" transform="translate(5719.5 1106.5)">
<rect id="Rectangle_2670" data-name="Rectangle 2670" width="21" height="21" transform="translate(-5712 -1099)" fill="none"/>
<g transform="matrix(1, 0, 0, 1, -5719.5, -1106.5)" filter="url(#Path_10080)">
<path id="Path_10080-2" data-name="Path 10080" d="M15.4,12.766a6.414,6.414,0,0,0,1.781-5.634l-.446-2.55-2.55-.446A6.414,6.414,0,0,0,8.553,5.916L6.746,7.723c.234-.232-.845.866-.626.626l-2.96,2.96a2.644,2.644,0,0,0,0,3.735l3.114,3.114a2.644,2.644,0,0,0,3.735,0l2.96-2.96Z" transform="translate(19.2 2.96) rotate(45)" fill="${"red"}"/>
</g>
</g>
</svg>
`)}`;
const BoatIcon = L.icon({
iconUrl: Red_MARKER,
iconSize: [40, 40],
iconAnchor: [12, 12],
popupAnchor: [0, 0],
});
const Index = () => {
return (<Main>
<MapContainer center={position} zoom={13}
style={{width: "100%", height: "calc(100vh - 80px)", overflow: "hidden"}}>
<TileLayer
attribution='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
<Marker position={position} icon={BoatIcon}>
<Popup>
A pretty CSS3 popup. <br/> Easily customizable.
</Popup>
</Marker>
</MapContainer></Main>
);
};
export default Index;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10243 次 |
| 最近记录: |