如何使用 react-google-maps 库创建折线

Posted

技术标签:

【中文标题】如何使用 react-google-maps 库创建折线【英文标题】:How to create Polyline using react-google-maps library 【发布时间】:2018-01-07 17:15:46 【问题描述】:

我正在尝试使用 react-google-maps 库在 4 个 GPS 坐标之间绘制折线。地图上没有渲染任何内容

import React from 'react';
import  withGoogleMap, GoogleMap, Marker, InfoWindow,Polyline  from 'react-google-maps';


class googleMapComponent extends React.Component 

//高阶组件​​:withGoogleMap作为函数调用使用。此函数返回另一个组件定义,该定义稍后会安装在渲染中

 // maintain a refernce to a map inside the component, so that
    constructor()
        super()
        this.state =
            map:null
        
    

    mapMoved()
        console.log('mapMoved: ' + JSON.stringify(this.state.map.getCenter()))
    

    mapLoaded(map)
        //console.log('mapLoaded: ' + JSON.stringify(map.getCenter()))
        if(this.state.map !==null)
            return

        this.setState(
            map:map
        )
    

    zoomchanged()
        console.log('mapZoomed: ' + JSON.stringify(this.state.map.getZoom()))
    
    handleMarkerClick(targetMarker) 
        this.setState(
            markers: this.state.markers.map(marker => 
                if (marker === targetMarker) 
                    return 
                        ...marker,
                        showInfo: true,
                    ;
                
                return marker;
            ),
        );
    

    handleMarkerClose(targetMarker) 
        this.setState(
            markers: this.state.markers.map(marker => 
                if (marker === targetMarker) 
                    return 
                        ...marker,
                        showInfo: false,
                    ;
                
                return marker;
            ),
        );
    

    render() 

        const markers= [
            
                position: new google.maps.LatLng(36.05298766, -112.0837566),
                showInfo: false,
                infoContent: false,
            ,
            
                position: new google.maps.LatLng(36.21698848, -112.0567275),
                showInfo: false,
                infoContent: false,
            ,
        ]
        const lineCoordinates= [
        coordinate:  new google.maps.LatLng(36.05298766, -112.0837566),
        coordinate:  new google.maps.LatLng(36.0529832169413, -112.083731889724),
        coordinate:  new google.maps.LatLng(36.0529811214655, -112.083720741793),
        coordinate:  new google.maps.LatLng(36.0529811214655, -112.083720741793),
    ]

        return (
            <GoogleMap
                ref=this.mapLoaded.bind(this)
                onDragEnd=this.mapMoved.bind(this)
                onZoomChanged=this.zoomchanged.bind(this)
                defaultZoom=this.props.zoom
                defaultCenter=this.props.center
            >
                markers.map((marker, index) => (
                    <Marker
                        position=marker.position
                        title="click on it Sir..!!"
                        defaultPosition=this.props.center
                        style=height: '2xpx', width: '2px'
                    />
                ))

                lineCoordinates.map((polyline,index)=>(
                <Polyline
                    defaultPosition=this.props.center
                    path= polyline.coordinate
                    geodesic= true
                    strokeColor= #FF0000
                    strokeOpacity= 1.0
                    strokeWeight= 2
                />

            </GoogleMap>

        )
    

export default withGoogleMap(googleMapComponent);

任何关于它的建议都会有所帮助。如果库不支持此功能。我也可以切换库。

【问题讨论】:

【参考方案1】:

当您运行映射函数时,您是否为每组坐标创建了一条新的折线?查看the Google Maps docs,折线将对象数组作为路径参数。 google-maps-react 只是该 API 的包装器,因此您应该能够通过传入对象数组作为路径来创建折线。目前,您正在尝试根据微小的坐标片段生成一堆折线对象。

【讨论】:

【参考方案2】:

是的。示例:

render() 
    const pathCoordinates = [
         lat: 36.05298765935, lng: -112.083756616339 ,
         lat: 36.2169884797185, lng: -112.056727493181 
    ];
    return (
        <GoogleMap
            defaultZoom=this.props.zoom
            defaultCenter=this.props.center
        >
            /*for creating path with the updated coordinates*/
            <Polyline
                path=pathCoordinates
                geodesic=true
                options=
                    strokeColor: "#ff2527",
                    strokeOpacity: 0.75,
                    strokeWeight: 2,
                    icons: [
                        
                            icon: lineSymbol,
                            offset: "0",
                            repeat: "20px"
                        
                    ]
                
            />
        </GoogleMap>
    );

【讨论】:

是的,它正在工作。可以看例子here 花了一段时间试图弄清楚为什么这对我不起作用,结果发现 path 需要在 options 中设置。也许这在某些时候发生了变化。 不是@IanW。也许您可以在options 中设置path,但您认为这不起作用的原因是以前的strokeOpacity 设置为0.0。将其设置为更明显的作品。 @JayantBhawal 这不是我的问题;我将 strokeOpacity 设置为 1。 啊哈。另一件事可能是交换了 Lat 和 Lng 值,因此它本来可以工作,但您不会看到它们。这和 strokeOpacity 是让我认为它在不同时间点不起作用的两件事。即使这样,这也可能无法解决您的问题,但也许它会帮助其他人环顾四周。【参考方案3】:

一个更简单的示例,仅显示一条正在绘制的多段线:

<GoogleMap defaultZoom=7 defaultCenter= lat: -34.897, lng: 151.144 >
    <Polyline path=[ lat: -34.397, lng: 150.644 ,  lat: -35.397, lng: 151.644 ]/>
</GoogleMap>

对于不清楚正确导入和设置的人来说,整个 sn-p (使用重组)

import React from "react";
import ReactDOM from "react-dom";
import  compose, withProps  from "recompose";
import 
  withScriptjs,
  withGoogleMap,
  GoogleMap,
  Marker,
  Polyline
 from "react-google-maps";

const MyMapComponent = compose(
  withProps(
    googleMapURL:
      "https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&v=3.exp&libraries=geometry,drawing,places",
    loadingElement: <div style= height: `100%`  />,
    containerElement: <div style= height: `400px`  />,
    mapElement: <div style= height: `100%`  />
  ),
  withScriptjs,
  withGoogleMap
)(props => (
  <GoogleMap defaultZoom=7 defaultCenter= lat: -34.897, lng: 151.144 >
    <Polyline path=[ lat: -34.397, lng: 150.644 ,  lat: -35.397, lng: 151.644 ]/>
  </GoogleMap>
));

ReactDOM.render(<MyMapComponent />, document.getElementById("root"));

和上面的例子一样,没有重构

import React from "react";
import ReactDOM from "react-dom";
import 
  withScriptjs,
  withGoogleMap,
  GoogleMap,
  Polyline
 from "react-google-maps";

const InternalMap = props => (
  <GoogleMap defaultZoom=7 defaultCenter= lat: -34.897, lng: 151.144 >
    <Polyline
      path=[ lat: -34.397, lng: 150.644 ,  lat: -35.397, lng: 151.644 ]
    />
  </GoogleMap>
);

const MapHoc = withScriptjs(withGoogleMap(InternalMap));

const MyMapComponent = props => (
  <MapHoc
    googleMapURL="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&v=3.exp&libraries=geometry,drawing,places"
    loadingElement=<div style= height: `100%`  />
    containerElement=<div style= height: `400px`  />
    mapElement=<div style= height: `100%`  />
  />
);

ReactDOM.render(
  <MyMapComponent />,
  document.getElementById("root")
);

【讨论】:

以上是关于如何使用 react-google-maps 库创建折线的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 react-google-maps 通过单击在地图上添加标记?

如何在 react-google-maps 中添加标记?

react-google-maps:如何使用 fitBounds、panBy、panTo、panToBounds 公共 API?

如何将自定义按钮添加到 react-google-maps?

如何使用 react-google-maps 在 React.JS 中获取多边形的坐标

如何更改 React-Google-Maps 多边形的样式选项 onHover?