简体   繁体   English

使地图视图适合标记以使用 Hooks、Function 对原生地图做出反应

[英]Fit map view to markers react native maps with Hooks, Function

So I have mapview:所以我有地图视图:

import * as React from 'react';
import {
    StyleSheet,
    View,
    Text,
    ScrollView,
    Animated,
    Dimensions,
    Image,
} from "react-native";
import MapView, {Callout, Marker, PROVIDER_GOOGLE} from "react-native-maps";
import * as Location from 'expo-location';
QueryResult from '../../assets/Data.json'; //JSON FILE in desc
import {AppLoading} from "expo";

const styles = StyleSheet.create({
    page: {
        flex: 1,
        justifyContent: "center",
        alignItems: "center",
        backgroundColor: "#F5FCFF"
    },
    container: {
        flex:1,
        backgroundColor: "tomato"
    },
    map: {
        flex: 1
    },
    bubble:{
        backgroundColor: Colors.WHITE1,
        borderRadius: 20,
        flexDirection: "column",
    },
    name:{

    },
    icon:{
        width: 30,
        height:30,
    },
});

const { width, height } = Dimensions.get("window");

function GoogleMapItem() {

    const initialRegion = {
        latitude: 53.3661,
        longitude: 14.5943,
    }

    const navigation = useNavigation();
    const [location, setLocation] = React.useState(initialRegion);
    const [errorMsg, setErrorMsg] = React.useState(null);
    const mapRef = React.useRef()
    const [QueryResult, SetQueryResult] = React.useState(null);

    let iz ={
        latDelta: 0.015,
        longDelta: 0.08,
    }
    let ZOOMS = {
        _latitudeDeltaZOOM_OUT1 : iz.latDelta,
        _longitudeDeltaZOOM_OUT1: iz.longDelta,
        _latitudeDeltaZOOM_INITIAL : iz.latDelta*0.2,
        _longitudeDeltaZOOM_INITIAL: iz.longDelta*0.2,
        _latitudeDeltaZOOM_IN1 :  iz.latDelta*0.1,
        _longitudeDeltaZOOM_IN1:  iz.longDelta*0.1,
    }

    React.useEffect(() => {
        (async () => {
            let { status } = await Location.requestPermissionsAsync();
            if (status !== 'granted') {
                setErrorMsg('Permission to access location was denied');
            }

            let location = await Location.getCurrentPositionAsync({});
            const {longitude, latitude} = location.coords
            setLocation({
                ...location,
                longitude: longitude,
                latitude: latitude,
            })
        })();
    }, []);

        return(
            <View style={styles.map}>
                <MapView style={styles.map}
                         provider={PROVIDER_GOOGLE}
                         loadingEnabled={true}
                         region={{
                             latitude: location.latitude,
                             longitude: location.longitude,
                             latitudeDelta:  ZOOMS._latitudeDeltaZOOM_OUT1,
                             longitudeDelta: ZOOMS._latitudeDeltaZOOM_OUT1,
                         }}
                         showsUserLocation
                         followsUserLocation
                         userLocationUpdateInterval
                         ref={mapRef}

                >
                    {QueryResult.results.map((element,index)=>
                        <Marker key={index} identifier={element.place_id} coordinate={{
                            latitude: element.geometry.location.lat,
                            longitude: element.geometry.location.lng,
                        }}
                        >
                            <View>
                                <Image source={{uri: element.icon}} style={{width:25,height:25,}}></Image>
                            </View>
                        </Marker>
                    )}
                </MapView>
            </View>

        )

}




export default React.memo(GoogleMapItem)

and shortened to two entries json file:并缩短为两个条目 json 文件:

{
   "results" : [
      {
         "business_status" : "OPERATIONAL",
         "geometry" : {
            "location" : {
               "lat" : 53.368006,
               "lng" : 14.6198066
            },
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/v1/png_71/generic_recreational-71.png",
         "name" : "Park Leśny Zdroje",
         "place_id" : "ChIJ7adAEfunAEcRUlmcp_1ReY8",
      },
      {
         "business_status" : "OPERATIONAL",
         "geometry" : {
            "location" : {
               "lat" : 53.3789812,
               "lng" : 14.6186994
            },
         },
         "icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/v1/png_71/generic_business-71.png",
         "name" : "Usługi Ogrodnicze Szczecin Miłorząb M.",
         "place_id" : "ChIJxwSQa_SnAEcRsgtHuw_eeuE",
      },
   ],
   "status" : "OK"
}

And this view is rendering markers from query (View with restaurants or other objects) I want to fit mapview to see all possible markers.这个视图正在从查询(带有餐厅或其他对象的视图)中渲染标记,我想拟合 mapview 以查看所有可能的标记。

Is this possible with hooks ?这可以用钩子吗? (almost all solutions on internet uses: {mapRef=> this.mapRef= mapRef} so It needs class component. (互联网上几乎所有的解决方案都使用: {mapRef=> this.mapRef= mapRef}所以它需要类组件。

Tried different things like :尝试了不同的事情,例如:

OnMapReady or onLayout={ mapRef.current.fitToSuppliedMarkers(markerArray)}
OnMapReady or onLayout={ mapRef.current.fitToElements(true)}

adding all markers Lat,Lng to array and then:将所有标记 Lat,Lng 添加到数组中,然后:

OnMapReady or onLayout={ mapRef.current.fitToCoordinates(markerArrayLatLng}

Tried also using those methods in useEffect but it dont see mapRef at all (mapRef undefined).也尝试在 useEffect 中使用这些方法,但它根本看不到 mapRef(mapRef 未定义)。

But nothing happens and i think the error is that on First initial render those methods dont see ref to map.但是没有任何反应,我认为错误是在第一次初始渲染时,这些方法看不到 ref 映射。 Because when i use button to call method it's working fine.因为当我使用按钮调用方法时它工作正常。

<Button title={"test"} onPress={mapRef.current.fitToElements(true)}/>

Is this possible in function with hooks or I need to rearange entire function to class component?这在带有钩子的函数中是否可行,或者我需要将整个函数重新排列为类组件?

Sorry for errors in my language.抱歉我的语言有错误。

followUserLocation is autozooming to user location (so fast) that fitToElements and others doesn't work(they work but are zoomed immediately). followUserLocation 会自动缩放到用户位置(如此之快),以至于 fitToElements 和其他方法不起作用(它们起作用但会立即缩放)。 So I set timeout on following.所以我设置了以下超时。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM