Google-Map-React 如何获取边界内的标记?
Google-Map-React how to get markers inside bounds?
我在移动地图时有边界,但我不知道如何获取包含在这些边界内的标记。我不想必须使用 new google.map...
。我只想继续使用 React-Google-Map
。如果那不可能,那么我将使用 google 实例。
我会 post 我的代码如下。我正在控制台注销 google 地图的引用和 onChange
函数中的道具。
Props =>
bounds:{nw: {…}, se: {…}, sw: {…}, ne: {…}}
center:{lat: 53, lng: -7.77000000000001}
marginBounds:{nw: {…}, se: {…}, sw: {…}, ne: {…}}
size:{width: 1818, height: 455}
zoom:10
__proto__:Object
Map Ref => GoogleMap {props: {…}, context: {…}, refs: {…}, updater: {…}, _getMinZoom: ƒ, …}
import React, { Component } from 'react';
import GoogleMap from 'google-map-react';
function findMarkerIndex(id, markers) {
for (let i = markers.length; i--; ) {
if (markers[i].id === id) {
return i;
}
}
return null;
}
export default class Map extends Component {
constructor(props) {
super(props);
this.createMapOptions = this.createMapOptions.bind(this);
this.changeMap = this.changeMap.bind(this);
this.toggleMarker = this.toggleMarker.bind(this);
this.state = {
markers: []
};
}
changeMap(props) {
console.log(props);
console.log(this.map);
}
toggleMarker(id) {
const index = findMarkerIndex(id, this.state.markers);
if (index !== null) {
const markers = this.state.markers;
markers[index].show = !markers[index].show;
this.setState({ markers });
}
}
closeMarker(id) {
const index = findMarkerIndex(id, this.state.markers);
if (index !== null) {
const markers = this.state.markers;
markers[index].show = false;
this.setState({ markers });
}
}
createMapOptions(maps) {
return {
styles: this.props.styles
};
}
componentDidMount() {
this.setState({ markers: this.props.markers });
}
render() {
const Marker = this.props.markerComponent;
const markers = (this.state.markers || []).map(marker => (
<Marker
key={marker.id}
handleMarkerClick={this.toggleMarker}
handleMarkerClose={this.closeMarker}
{...marker}
/>
));
return (
<div
style={{
height: this.props.height || '800px',
width: this.props.width || '100%'
}}
>
<GoogleMap
ref={ref => {
this.map = ref;
}}
center={this.props.center || { lat: 50, lng: 25 }}
zoom={this.props.zoom || 8}
options={this.createMapOptions || {}}
onChange={this.changeMap}
>
{markers}
</GoogleMap>
</div>
);
}
}
当您控制放置在地图中的标记 (this.state.markers
) 时,您可以简单地 运行 .filter()
使用您拥有的边界覆盖它们。
const { markers } = this.state;
if (markers) {
const foundMarkers = markers.filter(marker => {
if (
marker.lat > se.lat &&
sw.lat &&
(marker.lat < ne.lat && nw.lat) &&
(marker.lng > nw.lng && sw.lng) &&
(marker.lng < ne.lng && se.lng)
) {
return marker;
}
});
console.log(foundMarkers);
}
不确定这是否是 "best" 方法,但我通过使用 onChange
方法中的边界稍微破解了这一点。
我抓住了每一个边界并将它们与我的标记进行了比较。我会 post 我所做的,它似乎工作得很好。如果它有缺陷,请告诉我!
changeMap(props) {
const {
bounds: { ne, nw, se, sw }
} = props;
// east for lng will be greater
// north for lat will be greater
const { markers } = this.state;
if (markers) {
markers.map(marker => {
if (
marker.lat > se.lat &&
sw.lat &&
(marker.lat < ne.lat && nw.lat) &&
(marker.lng > nw.lng && sw.lng) &&
(marker.lng < ne.lng && se.lng)
) {
console.log(marker);
}
});
}
}
使用 Es6,您可以通过将变量传递给 changeMap 函数来获取边界和其他地图选项:
changeMap = ({ center, zoom, bounds }) => {
console.log(bounds );
};
我在移动地图时有边界,但我不知道如何获取包含在这些边界内的标记。我不想必须使用 new google.map...
。我只想继续使用 React-Google-Map
。如果那不可能,那么我将使用 google 实例。
我会 post 我的代码如下。我正在控制台注销 google 地图的引用和 onChange
函数中的道具。
Props =>
bounds:{nw: {…}, se: {…}, sw: {…}, ne: {…}}
center:{lat: 53, lng: -7.77000000000001}
marginBounds:{nw: {…}, se: {…}, sw: {…}, ne: {…}}
size:{width: 1818, height: 455}
zoom:10
__proto__:Object
Map Ref => GoogleMap {props: {…}, context: {…}, refs: {…}, updater: {…}, _getMinZoom: ƒ, …}
import React, { Component } from 'react';
import GoogleMap from 'google-map-react';
function findMarkerIndex(id, markers) {
for (let i = markers.length; i--; ) {
if (markers[i].id === id) {
return i;
}
}
return null;
}
export default class Map extends Component {
constructor(props) {
super(props);
this.createMapOptions = this.createMapOptions.bind(this);
this.changeMap = this.changeMap.bind(this);
this.toggleMarker = this.toggleMarker.bind(this);
this.state = {
markers: []
};
}
changeMap(props) {
console.log(props);
console.log(this.map);
}
toggleMarker(id) {
const index = findMarkerIndex(id, this.state.markers);
if (index !== null) {
const markers = this.state.markers;
markers[index].show = !markers[index].show;
this.setState({ markers });
}
}
closeMarker(id) {
const index = findMarkerIndex(id, this.state.markers);
if (index !== null) {
const markers = this.state.markers;
markers[index].show = false;
this.setState({ markers });
}
}
createMapOptions(maps) {
return {
styles: this.props.styles
};
}
componentDidMount() {
this.setState({ markers: this.props.markers });
}
render() {
const Marker = this.props.markerComponent;
const markers = (this.state.markers || []).map(marker => (
<Marker
key={marker.id}
handleMarkerClick={this.toggleMarker}
handleMarkerClose={this.closeMarker}
{...marker}
/>
));
return (
<div
style={{
height: this.props.height || '800px',
width: this.props.width || '100%'
}}
>
<GoogleMap
ref={ref => {
this.map = ref;
}}
center={this.props.center || { lat: 50, lng: 25 }}
zoom={this.props.zoom || 8}
options={this.createMapOptions || {}}
onChange={this.changeMap}
>
{markers}
</GoogleMap>
</div>
);
}
}
当您控制放置在地图中的标记 (this.state.markers
) 时,您可以简单地 运行 .filter()
使用您拥有的边界覆盖它们。
const { markers } = this.state;
if (markers) {
const foundMarkers = markers.filter(marker => {
if (
marker.lat > se.lat &&
sw.lat &&
(marker.lat < ne.lat && nw.lat) &&
(marker.lng > nw.lng && sw.lng) &&
(marker.lng < ne.lng && se.lng)
) {
return marker;
}
});
console.log(foundMarkers);
}
不确定这是否是 "best" 方法,但我通过使用 onChange
方法中的边界稍微破解了这一点。
我抓住了每一个边界并将它们与我的标记进行了比较。我会 post 我所做的,它似乎工作得很好。如果它有缺陷,请告诉我!
changeMap(props) {
const {
bounds: { ne, nw, se, sw }
} = props;
// east for lng will be greater
// north for lat will be greater
const { markers } = this.state;
if (markers) {
markers.map(marker => {
if (
marker.lat > se.lat &&
sw.lat &&
(marker.lat < ne.lat && nw.lat) &&
(marker.lng > nw.lng && sw.lng) &&
(marker.lng < ne.lng && se.lng)
) {
console.log(marker);
}
});
}
}
使用 Es6,您可以通过将变量传递给 changeMap 函数来获取边界和其他地图选项:
changeMap = ({ center, zoom, bounds }) => {
console.log(bounds );
};