在地图上定位
React Locate on map
我想在地图上添加模块 "React-leaflet-locate-control"。不幸的是,我遇到了这个错误 "TypeError: Cannot read property 'addLayer' of undefined",我不知道如何纠正这个错误。
你能帮帮我吗?
这是我的组件地图:
import './Map.css';
import React, { Component } from 'react';
import { Map, TileLayer, Marker, Popup } from 'react-leaflet';
import L from "leaflet";
import { getLat, getLng } from '../../Store.js';
import SearchBar from '../SearchBar/SearchBar.js';
import LocateControl from 'react-leaflet-locate-control';
const customMarker = new L.icon({
iconUrl: "https://unpkg.com/leaflet@1.4.0/dist/images/marker-icon.png",
iconSize: [25, 41],
iconAnchor: [13, 0]
});
export default class MapLeaflet extends Component {
constructor(props) {
super(props);
this.state = {
lat: getLat(),
lng: getLng(),
}
}
updateMarker = (e) => {
this.props.updateMarkerPosition(e.latlng.lat, e.latlng.lng);
this.setState({
lat: e.latlng.lat,
lng: e.latlng.lng
})
}
render() {
const position = [this.state.lat, this.state.lng]
const locateOptions = {
position: 'topright',
strings: {
title: 'Show me where I am, yo!'
},
onActivate: () => {} // callback before engine starts retrieving locations
}
return (
<div className="map">
<Map center={position} zoom={13} className="map" onClick={this.updateMarker}>
<TileLayer
attribution='&copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
<Marker position={position} icon={customMarker}>
<Popup>
A pretty CSS3 popup. <br /> Easily customizable.
</Popup>
</Marker>
<SearchBar />
<LocateControl options={locateOptions} startDirectly/>
</Map>
</div>
)
}
}
react-leaflet-locate-control
package is not compatible with the latest version (v2) of react-leaflet
and in fact the similar issue has been reported here
由于 react-leaflet-locate-control
表示 leaflet-locatecontrol
plugin 的包装器,因此可以使用 react-leaflet
的以下自定义组件,它提供与 react-leaflet-locate-control
相同的功能:
import React, { Component } from "react";
import { withLeaflet } from "react-leaflet";
import Locate from "leaflet.locatecontrol";
class LocateControl extends Component {
componentDidMount() {
const { options, startDirectly } = this.props;
const { map } = this.props.leaflet;
const lc = new Locate(options);
lc.addTo(map);
if (startDirectly) {
// request location update and set location
lc.start();
}
}
render() {
return null;
}
}
export default withLeaflet(LocateControl);
Installation
1) install a plugin: npm install leaflet.locatecontrol
2) include the following CSS resources into public/index.html
:
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/leaflet.locatecontrol/dist/L.Control.Locate.min.css">
这里是a demo (source code)
如果你像我一样使用 Typescript。我使用下面的组件代码
使其与 v2
一起使用
import L from 'leaflet';
import { withLeaflet, MapControl, MapControlProps } from 'react-leaflet';
import Locate from 'leaflet.locatecontrol';
import './Geolocate.css';
type GeolocateProps = L.Control.LocateOptions & MapControlProps;
class Geolocate extends MapControl<GeolocateProps> {
createLeafletElement(props: GeolocateProps) {
const { leaflet, ...options } = props;
const locate = Locate as any;
const lc = new locate(options);
return lc;
}
}
export default withLeaflet(Geolocate);
此外,您可以跳过包含 Font awesome 和库自己的 css 文件,而是提供您自己的样式
Geolocate.css
.leaflet-control-locate a.leaflet-bar-part div {
background-image: url(../../images/geolocation.png);
background-size: 22px 74px;
background-position: top 2px left 2px;
background-repeat: no-repeat;
width: 30px;
height: 30px;
}
.leaflet-control-locate a.leaflet-bar-part div.loading {
background-position: top -24px left 2px;
}
.leaflet-control-locate.active a.leaflet-bar-part div.locate {
background-position: top -50px left 2px;
}
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
.leaflet-control-locate a.leaflet-bar-part div {
background-image: url(../../images/geolocation-2x.png);
}
}
当然,您必须先使用 npm
安装 leaflet.locatecontrol
npm i leaflet.locatecontrol
希望对您有所帮助。
您实际上不需要任何外部模块来获取 React 或任何其他 JavaScript 库中的当前位置
你可以使用
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(position => //Do something with it );
}
这是一种反应方式:
const [currentLocation, setCurrentLocation] = React.useState([0, 0]);
//change [0,0] to something that makes sense to your users in case they deny access to location.
useEffect(() => {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
position =>
setCurrentLocation([position.coords.latitude, position.coords.longitude]))
}
}, []);
return (
<Map center={currentLocation} zoom={15}>
// the rest ie . TileLayer,Marker,Popup
</Map>
我想在地图上添加模块 "React-leaflet-locate-control"。不幸的是,我遇到了这个错误 "TypeError: Cannot read property 'addLayer' of undefined",我不知道如何纠正这个错误。
你能帮帮我吗?
这是我的组件地图:
import './Map.css';
import React, { Component } from 'react';
import { Map, TileLayer, Marker, Popup } from 'react-leaflet';
import L from "leaflet";
import { getLat, getLng } from '../../Store.js';
import SearchBar from '../SearchBar/SearchBar.js';
import LocateControl from 'react-leaflet-locate-control';
const customMarker = new L.icon({
iconUrl: "https://unpkg.com/leaflet@1.4.0/dist/images/marker-icon.png",
iconSize: [25, 41],
iconAnchor: [13, 0]
});
export default class MapLeaflet extends Component {
constructor(props) {
super(props);
this.state = {
lat: getLat(),
lng: getLng(),
}
}
updateMarker = (e) => {
this.props.updateMarkerPosition(e.latlng.lat, e.latlng.lng);
this.setState({
lat: e.latlng.lat,
lng: e.latlng.lng
})
}
render() {
const position = [this.state.lat, this.state.lng]
const locateOptions = {
position: 'topright',
strings: {
title: 'Show me where I am, yo!'
},
onActivate: () => {} // callback before engine starts retrieving locations
}
return (
<div className="map">
<Map center={position} zoom={13} className="map" onClick={this.updateMarker}>
<TileLayer
attribution='&copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
<Marker position={position} icon={customMarker}>
<Popup>
A pretty CSS3 popup. <br /> Easily customizable.
</Popup>
</Marker>
<SearchBar />
<LocateControl options={locateOptions} startDirectly/>
</Map>
</div>
)
}
}
react-leaflet-locate-control
package is not compatible with the latest version (v2) of react-leaflet
and in fact the similar issue has been reported here
由于 react-leaflet-locate-control
表示 leaflet-locatecontrol
plugin 的包装器,因此可以使用 react-leaflet
的以下自定义组件,它提供与 react-leaflet-locate-control
相同的功能:
import React, { Component } from "react";
import { withLeaflet } from "react-leaflet";
import Locate from "leaflet.locatecontrol";
class LocateControl extends Component {
componentDidMount() {
const { options, startDirectly } = this.props;
const { map } = this.props.leaflet;
const lc = new Locate(options);
lc.addTo(map);
if (startDirectly) {
// request location update and set location
lc.start();
}
}
render() {
return null;
}
}
export default withLeaflet(LocateControl);
Installation
1) install a plugin:
npm install leaflet.locatecontrol
2) include the following CSS resources into
public/index.html
:<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/leaflet.locatecontrol/dist/L.Control.Locate.min.css">
这里是a demo (source code)
如果你像我一样使用 Typescript。我使用下面的组件代码
使其与v2
一起使用
import L from 'leaflet';
import { withLeaflet, MapControl, MapControlProps } from 'react-leaflet';
import Locate from 'leaflet.locatecontrol';
import './Geolocate.css';
type GeolocateProps = L.Control.LocateOptions & MapControlProps;
class Geolocate extends MapControl<GeolocateProps> {
createLeafletElement(props: GeolocateProps) {
const { leaflet, ...options } = props;
const locate = Locate as any;
const lc = new locate(options);
return lc;
}
}
export default withLeaflet(Geolocate);
此外,您可以跳过包含 Font awesome 和库自己的 css 文件,而是提供您自己的样式
Geolocate.css
.leaflet-control-locate a.leaflet-bar-part div {
background-image: url(../../images/geolocation.png);
background-size: 22px 74px;
background-position: top 2px left 2px;
background-repeat: no-repeat;
width: 30px;
height: 30px;
}
.leaflet-control-locate a.leaflet-bar-part div.loading {
background-position: top -24px left 2px;
}
.leaflet-control-locate.active a.leaflet-bar-part div.locate {
background-position: top -50px left 2px;
}
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
.leaflet-control-locate a.leaflet-bar-part div {
background-image: url(../../images/geolocation-2x.png);
}
}
当然,您必须先使用 npm
安装 leaflet.locatecontrol
npm i leaflet.locatecontrol
希望对您有所帮助。
您实际上不需要任何外部模块来获取 React 或任何其他 JavaScript 库中的当前位置
你可以使用
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(position => //Do something with it );
}
这是一种反应方式:
const [currentLocation, setCurrentLocation] = React.useState([0, 0]);
//change [0,0] to something that makes sense to your users in case they deny access to location.
useEffect(() => {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
position =>
setCurrentLocation([position.coords.latitude, position.coords.longitude]))
}
}, []);
return (
<Map center={currentLocation} zoom={15}>
// the rest ie . TileLayer,Marker,Popup
</Map>