如何在 react-native-map 中放大/缩小?

Posted

技术标签:

【中文标题】如何在 react-native-map 中放大/缩小?【英文标题】:How to zoom in/out in react-native-map? 【发布时间】:2016-04-18 04:13:30 【问题描述】:

我正在使用 react-native 来构建地图应用程序。我使用的 api 来自这个链接:https://github.com/lelandrichardson/react-native-maps。以下是我将地图带到我的应用程序的代码。我徘徊如何在该地图上给出缩放值。以及当用户单击地图上的按钮时如何更改缩放值。我应该使用什么缩放 API 来实现这一点?

import React, 


AppRegistry,
  Component,
  StyleSheet,
  Text,
  View,
  Image,
  ListView,
  TextInput,
  TouchableHighlight,
  Dimensions,
 //MapView,
 from 'react-native';

import MapView from 'react-native-maps';

const styles = StyleSheet.create(
  map: 
    position: 'absolute',
    top: 0,
    left: 0,
    right: 0,
    bottom: 0,
  ,
  container: 
    flexDirection: 'row',
    justifyContent: 'space-between',
    padding: 30,
    flex: 1,
    alignItems: 'center'
  ,
  inputText: 
    height: 36,
      padding: 4,
      marginRight: 5,
      flex: 4,
      fontSize: 18,
      borderWidth: 1,
      borderColor: '#48BBEC',
      borderRadius: 8,
      color: '#48BBEC'
  
);

class MapPage extends Component

    constructor(props)
        super(props);
        this.state = 
            region:
                latitude: 4.21048,
                longitude: 101.97577,
            latitudeDelta: 10,
            longitudeDelta: 5
            
        
    

    render() 
        return(
            <View style=styles.container>
                <TextInput style=styles.inputText></TextInput>
                <MapView 
                    style= styles.map 
                    mapType="standard"
                    region=this.state.region
                    zoomEnabled=true
                    scrollEnabled=true
                    showsScale=true
                  ></MapView>
            </View>
            )
    


module.exports = MapPage;

【问题讨论】:

【参考方案1】:

您应该使用animateToRegion 方法(请参阅here)

它需要一个具有latitudeDeltalongitudeDelta 的区域对象。使用这些设置缩放级别。

更新:

Region 对象中,latitudelongitude 指定中心位置,latitudeDeltalongitudeDelta 指定可视地图区域的跨度。

这张来自this 博客文章的图片很好地说明了这一点(LatΔ 和 LngΔ)。

【讨论】:

纬度和纬度Delta有什么区别?有文件可以解释吗? 感谢您的回复。有没有例子来说明如何使用 animateToRegion? 是的,看这个例子:github.com/lelandrichardson/react-native-maps/blob/master/… 那么,如何使用自定义放大和缩小按钮设置增量?【参考方案2】:

我能够使用Dimensions.get('window'); 完成这项工作

            const window = Dimensions.get('window');
            const  width, height   = window
            LONGITUDE_DELTA = LATITUD_DELTA + (width / height)

默认设置LATITUD_DELTA = 0.0922。 然后只需使用 &lt;MapView&gt; 中的道具 onRegionChangeComplete 更新此值

【讨论】:

它为什么给你不同的价值观?它指的是与地图缩放级别无关的恒定屏幕尺寸 我觉得应该是 LONGITUDE_DELTA = LATITUD_DELTA * (width / height) @Shanaka 你为什么这么说? 本例采用这种方式:github.com/react-native-community/react-native-maps/blob/master/… 我们是如何得到 LATITUD_DELTA = 0.0922 的?这是什么意思?我们如何计算这个?【参考方案3】:

新的 React Native Maps API 让您可以选择使用 zoom 参数调用 animateCamera 方法。

const MapComponent= (props: any) => 

const map: LegacyRef<MapView> = useRef(null);

const onZoomInPress = () => 
    map?.current?.getCamera().then((cam: Camera) => 
        cam.zoom += 1;
        map?.current?.animateCamera(cam);
    );
;

return (
        <View>
            <MapView
                ref=map
                provider=PROVIDER_GOOGLE
                region=region>
            </MapView>
            <ButtonComponent
                style=position: 'absolute', bottom: 400, left: 0
                onPress=onZoomInPress>
                Zoom In
            </MainButtonBlue>
        </View>
    );

【讨论】:

【参考方案4】:
//Example of Pinch to Zoom Image in React Native
//https://aboutreact.com/react-native-pinch-to-zoom-image/

//import React in our code
import React from 'react';

//import all the components we are going to use
import  SafeAreaView, StyleSheet, View  from 'react-native';

//import ImageViewer which will help us to zoom Image
import ImageViewer from 'react-native-image-zoom-viewer';

const App = () => 
  const images = [
    
      url:
        'https://raw.githubusercontent.com/AboutReact/sampleresource/master/sample_img.png',
    ,
    
      url:
        'https://raw.githubusercontent.com/AboutReact/sampleresource/master/old_logo.png',
    ,
  ];

  return (
    <SafeAreaView style= flex: 1 >
      <View style=styles.container>
        <ImageViewer imageUrls=images renderIndicator=() => null />
      </View>
    </SafeAreaView>
  );
;

const styles = StyleSheet.create(
  container: 
    backgroundColor: '#F5FCFF',
    flex: 1,
  ,
);

export default App;

【讨论】:

【参考方案5】:

这就是我所做的,对我来说效果很好:

function getRegion(origin, destination, zoom) 
  const oLat = Math.abs(origin.latitude);
  const oLng = Math.abs(origin.longitude);
  const dLat = Math.abs(destination.latitude);
  const dLng = Math.abs(destination.longitude);

  return 
      latitude: (origin.latitude + destination.latitude) / 2,
      longitude: (origin.longitude + destination.longitude) / 2,
      latitudeDelta: Math.abs(oLat - dLat) + zoom,
      longitudeDelta: Math.abs(oLng - dLng) + zoom,
  ;                                                                                  

【讨论】:

以上是关于如何在 react-native-map 中放大/缩小?的主要内容,如果未能解决你的问题,请参考以下文章

react-native-maps:如何在按钮按下时跟随用户位置

React-Native-Maps 如何绘制折线

缩放到指定的标记 react-native-maps

React-Native-Maps:如何动画来协调?

react-native-maps@0.29.3: Android - 空地图

无法在我的项目中运行 react-native-maps