【问题标题】:react-native-maps fitToSuppliedMarker/fitToCorodinates does not show all markersreact-native-maps fitToSuppliedMarker/fitToCorodinates 不显示所有标记
【发布时间】:2019-03-22 05:56:04
【问题描述】:

我正在尝试使用简单的 MapView 并显示 2 个标记。

它们都在地图视图中正确显示,但同时在屏幕上不可见(默认呈现 Image1)

在屏幕上可以看到两个标记之前,我必须执行手动拖动操作。(我手动拖动地图后的 Image2 以便它们可以在屏幕上看到)

我尝试使用 fitToSuppliedMarkers/fitToCocordinates 但似乎没有任何效果。

export default class FavItemMapView extends Component{

constructor(props){
    super(props)
    this.state={
        position:{
            latitude:1.286353,
            longitude:103.853067,
            latitudeDelta: 0,
            longitudeDelta: 0,
        },
        error:null
    }
    this.mapRef = null;
}

componentWillMount(){

    const favPlaceLatitude = parseFloat(this.props.navigation.state.params.latitude)
    const favPlaceLongitude = parseFloat(this.props.navigation.state.params.longitude)
    markers.push({latitude:favPlaceLatitude,longitude:favPlaceLongitude});
    navigator.geolocation.getCurrentPosition(
        (position) => {
          console.log("wokeeey" + width + height);
          console.log(position);
          var lat = parseFloat(position.coords.latitude)
          var long = parseFloat(position.coords.longitude)

          var initialRegion = {
            latitude: lat,
            longitude: long,
            latitudeDelta: LATITUDE_DELTA,
            longitudeDelta: LONGITUDE_DELTA,
          }

          this.onRegionChange(initialRegion)
        },
        (error) => this.setState({ error: error.message }),
        { enableHighAccuracy: false, timeout: 200000, maximumAge: 1000 },
      );
}

onRegionChange(region) {
    this.setState({ position:region })
}

componentDidMount(){
    //this.mapRef.fitToSuppliedMarkers(markerIDs,true);
    const favPlaceLatitude = parseFloat(this.props.navigation.state.params.latitude)
    const favPlaceLongitude = parseFloat(this.props.navigation.state.params.longitude)
    this.mapRef.fitToCoordinates([{latitude:favPlaceLatitude,longitude:favPlaceLongitude}], {
        edgePadding: {
          bottom: 200, right: 50, top: 150, left: 50,
        },
        animated: true,
    });
}

render(){

    const { navigation } = this.props;
    const favPlaceLatitude = parseFloat(navigation.state.params.latitude)
    const favPlaceLongitude = parseFloat(navigation.state.params.longitude)

    return(
        <View style={styles.container}>
            <MapView provider={MapView.PROVIDER_GOOGLE} ref={ref => {this.mapRef = ref;}} style={styles.map} region={this.state.position}>
                {this.state.position.latitude &&
                    <MapView.Marker identifier="Marker2" coordinate={{latitude:this.state.position.latitude,longitude:this.state.position.longitude}} pinColor="red"/>
                }
                {this.state.position.longitude &&
                    <MapView.Marker identifier="Marker1" coordinate={{latitude:favPlaceLatitude,longitude:favPlaceLongitude}} pinColor="green"/>
                }
            </MapView>
        </View>
    );
  }
}

const styles={
  container:{
    ...StyleSheet.absoluteFillObject,
    justifyContent: 'flex-end',
    alignItems: 'center',
  },
  map:{
    padding:100,
    ...StyleSheet.absoluteFillObject
  }
}

你能提出什么问题吗?附上模拟器图像以供参考。

【问题讨论】:

  • 你找到解决办法了吗?
  • @AhmedImam 你知道了吗?

标签: ios react-native react-native-ios react-native-maps


【解决方案1】:
<MapView
    provider={MapView.PROVIDER_GOOGLE}
    ref={map => {this.map = map}}
    style={{ flex: 1 }}
    initialRegion={{latitude:this.state.request.latitude,
      longitude:this.state.request.longitude,
      latitudeDelta: 0.0922,
      longitudeDelta: 0.0421,}}
    onMapReady={() => {this.map.fitToSuppliedMarkers(['mk1','mk2'],{ edgePadding: 
      {top: 50,
        right: 50,
        bottom: 50,
        left: 50}

    })}}
    >
    <Marker
    image={require('../../../assets/pin.png')}
    coordinate={{latitude:this.state.request.latitude,longitude:this.state.request.longitude}} 
    title='Punto de partida'
    identifier={'mk1'}
    >

    </Marker>

    <Marker
    image={require('../../../assets/pin_final.png')}
    coordinate={{latitude:this.state.request.latitude_destinity,longitude:this.state.request.longitude_destinity}} 
    title='Punto de destino'
    identifier={'mk2'}
>

【讨论】:

  • 这个答案对我有用。我为每个Marker 使用了identifier 标记,以在fitToSuppliedMarkers 方法中以字符串形式获取对每个标记的引用。
【解决方案2】:

所以根据我使用这个库的经验 - 我发现最好的体验是在 MapView 组件上使用 onMapReady 属性。

https://github.com/react-native-community/react-native-maps/blob/master/docs/mapview.md#events

<MapView
  ...
  onMapReady{() => {
    this.mapRef.fitToCoordinates(...)
  }}
/>

<MapView
  ...
  onMapReady{() => {
    this.mapRef.fitToSuppliedMarkers(...)
  }}
/>

让我知道这是否有帮助,我仍在学习它,但这种方法假设您有现成可用的标记,您可以将这些标记传递给地图组件以进行渲染。

【讨论】:

    【解决方案3】:

    在我看来,最好的方法是在 iOS 中使用 fitToElements,在 Android 中使用 fitToSuppliedMarkers(或 fitToCoordinates)。我生成的代码最终是这样的:

    import React, { useRef, useCallback } from 'react';
    import { Platform } from 'react-native';
    import MapView, { PROVIDER_GOOGLE, LatLng, Marker } from 'react-native-maps';
    
    type Props = {
      origin: LatLng;
      destination: LatLng;
    }
    
    export default function ({ origin, destination }: Props) {
        const ref = useRef<MapView>(null);
    
        // effects
        const onMapReadyHandler = useCallback(() => {
          if (Platform.OS === 'ios') {
            ref?.current?.fitToElements(false);
          } else {
            ref?.current?.fitToCoordinates([origin, destination], {
              animated: true,
              edgePadding: {
                top: 150,
                right: 50,
                bottom: 50,
                left: 50,
              },
            });
          }
        }, [ref]);
    
        // UI
        return (
          <MapView
            style={{ width: '100%', height: '100%' }}
            ref={ref}
            provider={PROVIDER_GOOGLE}
            onMapReady={onMapReadyHandler}
          >
            <Marker coordinate={origin} identifier="origin" />
            <Marker coordinate={destination} identifier="destination" />
          </MapView>
        );
      }
    );
    

    【讨论】:

      【解决方案4】:

      你能检查缩​​放级别吗?地图视图有一个缩放属性可以帮助解决这个问题。你也可以使用 animateToCamera

      【讨论】:

      猜你喜欢
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 2021-10-21
      • 2021-11-04
      • 1970-01-01
      相关资源
      最近更新 更多