如何创建在 React-Native 中检测自动位置的地图

2024-05-14

我已经在react-native中创建了地图,参考https://github.com/lelandrichardson/react-native-maps https://github.com/lelandrichardson/react-native-maps地图已创建,但我想使用 GPS 检测自动位置。这是渲染具有静态纬度和经度的地图的代码。 这是我更新的代码。但它仍然没有呈现完美的位置

getInitialState() {
    return {
        initialPosition: 'unknown',
        lastPosition: 'unknown',
    };
  },

  componentDidMount() {
    navigator.geolocation.getCurrentPosition(
      (position) => {
        var initialPosition = JSON.stringify(position);
        this.setState({initialPosition});
      },
      {enableHighAccuracy: true, timeout: 20000, maximumAge: 1000}
    );
    this.watchID = navigator.geolocation.watchPosition((position) => {
      var lastPosition = JSON.stringify(position);
      this.setState({lastPosition});
    });
  },

  componentWillUnmount() {
    navigator.geolocation.clearWatch(this.watchID);
  },

  render() {
    return (
      <View style={styles.container}>
        <MapView
          ref="map"
          mapType="terrain"
          style={styles.map}
          initialPosition={this.state.initialPosition}
          lastPosition={this.state.lastPosition}
        >
        </MapView>
      </View>

你能更正一下吗?

提前致谢


您可以使用 React-native 地理定位来做到这一点:
https://facebook.github.io/react-native/docs/geolocation.html https://facebook.github.io/react-native/docs/geolocation.html

那里已经有一个很好的例子来说明如何做到这一点:

componentDidMount: function() {
  navigator.geolocation.getCurrentPosition(
    (position) => {
      var initialPosition = JSON.stringify(position);
      this.setState({initialPosition});
    },
    (error) => alert(error.message),
    {enableHighAccuracy: true, timeout: 20000, maximumAge: 1000}
  );
  this.watchID = navigator.geolocation.watchPosition((position) => {
    var lastPosition = JSON.stringify(position);
    this.setState({lastPosition});
  });
}

您现在有了初始位置(纬度和经度),使用它代替硬编码值。每当位置发生变化时,watchPosition 就会调用成功回调。

我目前正在使用它在我们的应用程序中查找当地餐馆。


更新答案:

我正在使用 Genymotion 模拟器来运行它。如果您还打算在 Genymotion 上运行此代码,请确保您已经安装谷歌播放支持,否则react-native-maps将无法工作。如果您使用的是物理设备,则无需执行此步骤。

https://github.com/codepath/android_guides/wiki/Genymotion-2.0-Emulators-with-Google-Play-support https://github.com/codepath/android_guides/wiki/Genymotion-2.0-Emulators-with-Google-Play-support

关于地理定位,请确保您在AndroidManifest.xml中添加了ACCESS_FINE_LOCATION权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

否则,您将收到错误消息:“看起来该应用程序没有访问位置的权限。”

另请确保您的 GPS/Wifi/数据已启用,否则您的设备无法检索您的当前位置。

var React = require('react');
var ReactNative = require('react-native');
var {
  StyleSheet,
  PropTypes,
  View,
  Text,
  Dimensions,
  TouchableOpacity,
} = ReactNative;

var MapView = require('react-native-maps');

var { width, height } = Dimensions.get('window');
const ASPECT_RATIO = width / height;

// (Initial Static Location) Mumbai
const LATITUDE = 19.0760;
const LONGITUDE = 72.8777;

const LATITUDE_DELTA = 0.01;
const LONGITUDE_DELTA = LATITUDE_DELTA * ASPECT_RATIO;

var CustomMap = React.createClass({
  getInitialState() {
    return {
      region: {
        latitude: LATITUDE,
        longitude: LONGITUDE,
        latitudeDelta: LATITUDE_DELTA,
        longitudeDelta: LONGITUDE_DELTA
      },
    };
  },

  componentDidMount: function() {
    navigator.geolocation.getCurrentPosition(
      (position) => {
        this.setState({
          region: {
            latitude: position.coords.latitude,
            longitude: position.coords.longitude,
            latitudeDelta: LATITUDE_DELTA,
            longitudeDelta: LONGITUDE_DELTA
          }
        });
      },
      (error) => alert(error.message),
      {enableHighAccuracy: true, timeout: 20000, maximumAge: 1000}
    );

    this.watchID = navigator.geolocation.watchPosition((position) => {
      const newRegion = {
        latitude: position.coords.latitude,
        longitude: position.coords.longitude,
        latitudeDelta: LATITUDE_DELTA,
        longitudeDelta: LONGITUDE_DELTA
      }

      this.onRegionChange(newRegion);
    });
  },

  componentWillUnmount: function() {
    navigator.geolocation.clearWatch(this.watchID);
  },

  onRegionChange(region) {
    this.setState({ region });
  },

  render() {
    return (
      <View style={styles.container}>
        <MapView
          ref="map"
          mapType="terrain"
          style={styles.map}
          region={this.state.region}
          onRegionChange={this.onRegionChange}
        >
        </MapView>
        <View style={styles.bubble}>
          <Text style={{ textAlign: 'center'}}>
            {`${this.state.region.latitude.toPrecision(7)}, ${this.state.region.longitude.toPrecision(7)}`}
          </Text>
        </View>
      </View>
    );
  },
});

var styles = StyleSheet.create({
  container: {
    position: 'absolute',
    top: 0,
    left: 0,
    right: 0,
    bottom: 0,
    justifyContent: 'flex-end',
    alignItems: 'center',
  },
  map: {
    position: 'absolute',
    top: 0,
    left: 0,
    right: 0,
    bottom: 0,
  },
  bubble: {
    backgroundColor: 'rgba(255,255,255,0.7)',
    paddingHorizontal: 18,
    paddingVertical: 12,
    borderRadius: 20,
  },
});

module.exports = CustomMap;

运行上面的代码,您应该会发现,当调用 getCurrentPosition 时,您的原始静态位置(孟买)会通过 componentDidMount 被设备中的当前位置覆盖。

如果您需要跟踪位置变化,请使用观察位置结合区域更改时,否则如果您只需要获取初始位置即可删除观察位置 step.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建在 React-Native 中检测自动位置的地图 的相关文章

随机推荐

  • Plotly 绘图不会在 RMarkdown 文档的 for 循环内渲染

    我正在尝试动态构建一个需要运行循环的报告 并为每次迭代打印一些消息 表格和绘图 我可以让一切正常运转except为了情节 示例 rmd r echo FALSE results asis fig keep all message FALSE
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • Angular4 - 滚动到锚点

    我正在尝试对同一页面上的锚元素进行简单的滚动 基本上 用户点击 尝试 按钮 它就会滚动到页面下方 ID 为 登录 的区域 现在 它正在与一个基本的id login a href login a 但它正在跳转到该部分 理想情况下 我希望它滚动
  • 背景 JPanel 上的 JScrollPane 中的透明 JEditorPane

    如果我移动 JScrollPane 使其位于 JPanel 前面并部分覆盖 JPanel 则 JScrollPane 内部的 JEditorPane 会出现绘制问题 它无法正确地重新绘制 JPanel 的背景 因此 当您滚动时 您最终会遇到
  • 使用 GD lib 过滤器标准化 CSS 过滤器

    我想让用户拖动范围滑块并通过实时预览 CSS 滤镜 调整图像的亮度和对比度 然后使用 GD 库保存调整 但是 我似乎无法从 CSS 过滤器和 GD lib 亮度和对比度过滤器获得相同的结果 我的 CSS 过滤器范围为 50 150 其中 1
  • ScrollView 和 LinearLayout 的困难

    我正在尝试制作一个 Android 布局 垂直 LinearLayout 内有 3 个组件 中心组件是一个ScrollView其中包含一个TextView 当 的时候TextView包含大量文本 超出了屏幕所能容纳的范围 ScrollVie
  • Hashmap 中的重新哈希[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 初始容量和负载系数两个影响参数HashMap表现 默认负载系数 75 在时间和空间成本之间提供了良好的权衡 较高的值会减少空间开销 但
  • 从通知中打开文件

    我从服务器下载一个文件 对于此操作 我显示了进度不确定的通知 下载文件后 我想通过单击通知来打开它 我获得了扩展名并尝试使用以下命令打开它intent像这样 public static Intent openFile Context con
  • 我可以使用带有较新 JDK 的 ant 来编译较旧 Java 版本的 java,以便在编译使用较新 API 的代码时生成输出吗?

    我只想在我的系统上安装 JDK 8 并让 ant javac 编译操作为 java 6 环境创建工作类文件 如果我在语法上仅使用符合 java 6 的代码 那么这种方法就有效 但我的代码可以访问 java 8 API 的方法 类 并且根据
  • 如何在 Windows 上向 git 存储库添加符号链接?

    我使用 GitHub 的电子环境编译 OS X 的二进制文件 并希望将输出添加到 git 存储库 我试过 git add error readlink sulu app Contents Frameworks Electron Framew
  • 如何将两个不同的哈希数组中的值添加在一起?

    我有两个哈希数组 哈希值的键不同 player scores1 first name gt Bruce score gt 43 time gt 50 first name gt Clark score gt 45 minutes gt 20
  • 非法尝试将集合与两个开放会话关联 流畅的 nhibernate

    我有这个异常 非法尝试将集合与两个打开的会话关联 每次我保存包含子集合的实体时都会引发该异常 我用谷歌搜索一下 我发现在调用保存时我打开了两个或多个会话 但我确定我只使用了一个会话 我哪里做错了 我该如何解决这个问题 注意 我使用的是 MV
  • 是否可以将函数声明放在未命名的命名空间中?

    我有一个包含一组函数的文件 对于其中一个函数 我想编写一个辅助函数 它基本上采用 char 并跳过所有空格 我认为应该这样做 namespace const int kNotFound 1 void SkipWhitespace const
  • 如何使用 preg_replace 实现带条件的模板

    我正在尝试实现一个管理界面 经理可以在其中创建网站元标记形成的高级规则 我有一个函数 它采用模板并用 registry 中的值替换其中的占位符 并在需要时应用修饰符 registy array profession name gt acto
  • 在 OS X 上以编程方式禁用环境光传感器屏幕调暗

    我已经在内核代码仓库中挖掘了好几天了 但我在任何地方都找不到这个 我想禁用 启用 检测许多高端 Mac 笔记本电脑所具有的基于环境光传感器的屏幕调光的状态 这是通过显示控制面板中的 自动调整亮度 复选框激活的调光 请注意 我是NOT谈论半暗
  • Pytorch 与 joblib 的 autograd 问题

    将 pytorch 的 autograd 与 joblib 混合似乎存在问题 我需要并行获取大量样本的梯度 Joblib 与 pytorch 的其他方面配合良好 但是 与 autograd 混合时会出现错误 我做了一个非常小的例子 显示串行
  • 处理 C++ 中执行时间的大量分析

    我目前正在进行一个科学计算项目 涉及海量数据和复杂算法 因此需要进行大量代码分析 我目前依靠的是
  • 为什么在运行 gcov 时收到“has arcs from exit block”消息?

    我正在运行 gcov 来测量覆盖率 但我在 c 代码中使用的每个函数都收到 has arcs from exit block 消息 这个消息有问题吗 我应该忽略他们吗 这可能意味着您的 gcno 文件是使用较新 不同版本的 gcc 编译器生
  • Firefox 上的 Angular JS 输入日期

    我有这些输入和这个模型
  • 如何创建在 React-Native 中检测自动位置的地图

    我已经在react native中创建了地图 参考https github com lelandrichardson react native maps https github com lelandrichardson react nat