在Meteor应用中获取用户的地理位置

时间:2016-08-21 15:32:28

标签: meteor geolocation

现在我正在开发一款严重依赖用户地理定位的应用。此时我只需要通过该用户的纬度和经度获取用户的地址。要做到这一点,我使用两个包:mdg:geolocation(获取纬度和经度)和meteor-google-reverse-geocode(从纬度和经度转换为地址)。 现在我有以下代码:

import React, { Component, PropTypes } from 'react';
import { Meteor } from 'meteor/meteor';
import { Accounts } from 'meteor/accounts-base';
import { Geolocation } from 'meteor/mdg:geolocation';
import { reverseGeocode } from 'meteor/jaymc:google-reverse-geocode';

export default class Profile extends Component {
    setLocation() {
        var latLng = Geolocation.latLng();
        var lat = latLng.lat;
        var lng = latLng.lng;
        reverseGeocode.getSecureLocation(lat, lng, function(location) {
            Meteor.users.update(Meteor.userId(), {
                $set: {"profile.location": reverseGeocode.getAddrStr()}
            });
        });
    }
    render() {
        return (
            <div className="container">
                <div className="row">
                    <div className="col s4">
                        <User />
                    </div>
                    <button onClick={this.setLocation.bind(this)}>Set location</button>
                </div>
    </div>
        )
    }
}

我有一个User组件,显示用户在其他参数中的位置,但首先应该从注册和登录中获取此location参数(我将实现以后的会话),所以我创建了一个按钮来完成这个技巧,但只有当我点击两次时才会这样做。第一次点击它没有得到任何信息,而不是在控制台中显示我的错误,但当我第二次点击它时,它以某种方式按我的意愿工作,即获取正确的地址,然后在我的User组件中显示它。好吧,它可以抓取数据,但只有当我点击两次这是不可接受的,因为我想在注册或登录后抓取这些数据,即第一次点击,而不是第二次,但我仍然没有知道怎么做。任何帮助或想法将不胜感激。感谢您花时间致力于描述问题!

UPD

经过一些研究后,我发现Geolocation功能不具有反应性,可能需要一些时间来加载数据,因此我使用ReactiveVar使其成为被动的Tracker在完成计算时手动停止计算。现在我的代码看起来像这样:

setLocation() {
    var latLng = new ReactiveVar();
    Tracker.autorun(function(computation) {
        latLng.set(Geolocation.latLng());
        if (latLng.get()) {
            computation.stop();
            console.log(latLng);
            var lat = latLng.lat;
            var lng = latLng.lng;
            reverseGeocode.getSecureLocation(lat, lng, function(location) {
                Meteor.users.update(Meteor.userId(), {
                    $set: {"profile.location": reverseGeocode.getAddrStr()}
                });
            });
        }
    })
}

首次点击时会计算lanlng属性,但Uncaught TypeError: Cannot read property 'formatted_address' of undefined文件中出现另一个错误google-reverse-geocode.js

1 个答案:

答案 0 :(得分:2)

好的伙计们,我解决了这个问题。我看了ReactiveVar输出,发现了我的错误。请参阅输出包含和对象curValue,其中存储了lanlng属性,因此要提取这些属性,我只需要像latLng.curValue.lat一样明确地调用它们。这里的固定功能与我在第一篇文章中描述的方式一致:

setLocation() {
    var latLng = new ReactiveVar();
    Tracker.autorun(function(computation) {
        latLng.set(Geolocation.latLng());
        if (latLng.get()) {
            computation.stop();
            console.log(latLng);
            var lat = latLng.curValue.lat;
            var lng = latLng.curValue.lng;
            reverseGeocode.getSecureLocation(lat, lng, function(location) {
                Meteor.users.update(Meteor.userId(), {
                    $set: {"profile.location": reverseGeocode.getAddrStr()}
                });
            });
        }
    })
}

希望它有所帮助!