微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在react-google-maps中设置起点

如何解决如何在react-google-maps中设置起点

我正在开发一个我正在使用的应用程序react-google-maps,我在我的应用程序中集成了多个停止功能。现在我想设置它的起点,例如,我想从它的起点绘制多个停靠点,它必须是一个带有文本的标记(开始)。我真的尝试过但无法解决解决方案,我还将附上我想要实现的目标的图像。

image preview

代码

import React,{ useState } from "react";
import {
  GoogleMap,InfoWindow,Marker,polyline,} from "@react-google-maps/api";

function Map({ scheduledOrders }) {
  const [activeMarker,setActiveMarker] = useState(null);

  let markers =
    scheduledOrders !== undefined &&
    scheduledOrders &&
    scheduledOrders[0] &&
    scheduledOrders[0].map((item,index) => ({
      id: index + 1,name: item.customerName + " - " + item.customerAddress,position: {
        lat: Number(item && item.order_lat,10),lng: Number(item && item.order_lng,},}));


  console.log("@@@markser",markers);

  const handleActiveMarker = (marker) => {
    if (marker === activeMarker) {
      return;
    }
    setActiveMarker(marker);
  };

  const handleOnLoad = (map) => {
    const bounds = new window.google.maps.LatLngBounds();
    markers && markers.forEach(({ position }) => bounds.extend(position));
    map.fitBounds(bounds);
  };

  return (
    <GoogleMap
      onLoad={handleOnLoad}
      onClick={() => setActiveMarker(null)}
      mapContainerStyle={{ width: "100%",height: "88vh" }}
    >
      <polyline
        path={
          scheduledOrders !== undefined &&
          scheduledOrders &&
          scheduledOrders[0] &&
          scheduledOrders[0].map((item) => ({
            lat: Number(item && item.order_lat,}))
        }
        options={{
          strokeColor: "#07966B",strokeOpacity: 1,strokeWeight: 2,icons: [
            {
              icon: "hello",offset: "0",repeat: "10px",],}}
      />
      {markers &&
        markers.map(({ id,name,position }) => (
          <Marker
            key={id}
            position={position}
            onClick={() => handleActiveMarker(id)}
            label={{ text: `${id}`,color: "white" }}
          >
            {activeMarker === id ? (
              <InfoWindow onCloseClick={() => setActiveMarker(null)}>
                <div>{name}</div>
              </InfoWindow>
            ) : null}
          </Marker>
        ))}
    </GoogleMap>
  );
}

export default Map;

解决方法

您的代码对于折线的起点和终点路径似乎具有相同的坐标。为了实现您的用例,我有两种方法可以解决这个问题。

这里是第一个,你需要先得到你的起点的坐标并将它放在一个单独的变量中。然后你需要为这个坐标创建一个单独的 return Provider<ShoppingBasket>( create: (context) => ShoppingBasket(),child: Consumer<OurUser>( builder: (_,user,__) { return ChangeNotifierProvider<SignInViewModel>( create: (_) => SignInViewModel(context.read),builder: (_,child) { return Scaffold( appBar: AppBar( title: Text("My app"),actions: [ OurShoppingBasketIcon(),IconButton( icon: Icon( Icons.logout,color: Colors.white,),onPressed: () { context.read<FirebaseAuthService>().signOut(); },],); },); 对象,条件是它会检查是否起始坐标变量有值。这将创建一个单独的 Marker 对象,您可以自定义。 接下来,您只需要在 <Marker> 变量中映射所有中间(航点)坐标。

这是我制作的 https://stackoverflow.com/a/53237056/870135 和代码片段。我刚刚从 json 文件中传递了 scheduleOrders 值。

markers

第二种方法是简单地将条件放在您的 import React,{ useState } from "react"; import { GoogleMap,InfoWindow,Marker,Polyline } from "@react-google-maps/api"; import scheduledOrders from "./data.json"; function Map() { const [activeMarker,setActiveMarker] = useState(null); let startMarker = null; let wayptMarker = []; //get the first point and put it in a startMarker variable then put the middle points in an array(wayptMarker) scheduledOrders.map((item,index,arr) => { if (index == 0 || index == arr.length - 1) { //Since the start and end point are the same,I only get the start point details in my startMarker variable if (index == 0) { startMarker = item; } } else { wayptMarker.push(item); } }); //put your startposition here let startPosition = { lat: startMarker.order_lat,lng: startMarker.order_lng }; //put your start name here let startName = startMarker.customerName + " - " + startMarker.customerAddress; let markers = scheduledOrders !== undefined && scheduledOrders && wayptMarker.map((item,index) => ({ id: index + 1,name: item.customerName + " - " + item.customerAddress,position: { lat: Number(item && item.order_lat,10),lng: Number(item && item.order_lng,10) } })); console.log("@@@markser",scheduledOrders); const handleActiveMarker = marker => { if (marker === activeMarker) { return; } setActiveMarker(marker); }; const handleOnLoad = map => { const bounds = new window.google.maps.LatLngBounds(); markers && markers.forEach(({ position }) => bounds.extend(position)); map.fitBounds(bounds); }; return ( <GoogleMap onLoad={handleOnLoad} onClick={() => setActiveMarker(null)} mapContainerStyle={{ width: "100%",height: "88vh" }} > <Polyline path={ scheduledOrders !== undefined && scheduledOrders && scheduledOrders[0] && scheduledOrders.map(item => ({ lat: Number(item && item.order_lat,10) })) } options={{ strokeColor: "#07966B",strokeOpacity: 1,strokeWeight: 2,icons: [ { icon: "hello",offset: "0",repeat: "10px" } ] }} /> {/* I created a marker solely for startMArker where you can customize the icon for this only marker */} {startMarker != null && ( <Marker key="start" position={startPosition} onClick={() => handleActiveMarker("start")} label={{ text: `START`,color: "black" }} icon="http://maps.google.com/mapfiles/kml/shapes/arrow.png" > {activeMarker === "start" ? ( <InfoWindow onCloseClick={() => setActiveMarker(null)}> <div>{startName}</div> </InfoWindow> ) : null} </Marker> )} {/* The following Marker object will only create markers for the middle points */} {markers && markers.map(({ id,name,position }) => ( <Marker key={id} position={position} onClick={() => handleActiveMarker(id)} label={{ text: `${id}`,color: "white" }} > {activeMarker === id ? ( <InfoWindow onCloseClick={() => setActiveMarker(null)}> <div>{name}</div> </InfoWindow> ) : null} </Marker> ))} </GoogleMap> ); } export default Map; 对象中,该对象将检查您映射的 <Marker> 是第一个还是最后一个,然后它会显示一个{{1} } 对象作为起点,如果不是,则使用不同的 markers 对象来显示您的航点。

以下是 sample code 和代码片段:

<Marker>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。