Вот карта интеграции в реагирующее мобильное приложение - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь внедрить API-интерфейс heremap в реагирующий проект. При поиске получено https://www.npmjs.com/package/react-native-heremaps. Но нет подходящих документов для использования этой библиотеки.Я новичок в реакции-родной.Пожалуйста, дайте мне несколько советов для реализации этого.

1 Ответ

1 голос
/ 23 сентября 2019

!если вы не используете выставку, пожалуйста, прокомментируйте, и я немного изменю ответ!

Прежде всего, поскольку вы, вероятно, знаете, что вам необходимо создать учетную запись на ЗДЕСЬ Разработчик webiste .

После того, как вы создали учетную запись, вам нужно создать проект (вы можете получить план Freemium бесплатно, и у него есть множество доступных запросов бесплатно, обновите, если вам нужно больше).После этого вам нужно «Сгенерировать приложение» для REST & XYZ HUB API / CLI на странице вашего проекта.После этого вы получите APP ID и APP CODE.На этом настройка учетной записи разработчика HERE завершена.

Теперь перейдем к React Native.

Прежде всего вам необходимо установить пакет npm с именем react-native-maps, который мы будем использовать для отображенияданные, которые ЗДЕСЬ предоставляет.Вы можете увидеть инструкции по установке здесь .

После этого давайте предположим, что вы уже создали компонент, который будет отображать карту.Вам нужно импортировать это:

import { Marker, Polyline } from 'react-native-maps'
import { MapView } from 'expo'

. Теперь наша карта почти готова.

В этом примере я буду использовать axios, но вы можете использовать fetch для отправки запросовЗДЕСЬ, если хотите.

Поэтому мы импортируем axios (если вы никогда не работали с ним, вы можете узнать о нем больше здесь ):

import axios from 'axios'

Теперь вам следуетиметь координаты этих двух местоположений, готовых в состоянии или где-то еще, и это должно выглядеть примерно так:

constructor(props){
    super(props)
    this.state = {
        startingLocation: {
            latitude: "xx.x",
            longitude: "yy.y",
        },
        finishLocation: {
           latitude: "xx.x",
           longitude: "yy.y",
        }
    }
}

С "xx.x" и "yy.y" - это фактические координаты, которые вы хотите.

Так что теперь, когда у вас есть координаты начального и конечного местоположения, вы можете сделать запрос к вашему проекту HERE API.Это так просто (я получил этот API от здесь ):

// I will create a function which will call this, you can call it whenever you want
_getRoute = () => {
    // we are using parseFloat() because HERE API expects a float
    let from_lat = parseFloat(this.state.startingLocation.latitude)
    let from_long = parseFloat(this.state.startingLocation.longitude)
    let to_lat = parseFloat(this.state.finishLocation.latitude)
    let to_long = parseFloat(this.state.finishLocation.longitude)
    // we will save all Polyline coordinates in this array
    let route_coordinates = []
    axios.get(`https://route.api.here.com/routing/7.2/calculateroute.json?app_id=PUT_YOUR_APP_ID_HERE&app_code=PUT_YOUR_APP_CODE_HERE&waypoint0=geo!${from_lat},${from_long}&waypoint1=geo!${to_lat},${to_long}&mode=fastest;bicycle;traffic:disabled&legAttributes=shape`).then(res => {
        // here we are getting all route coordinates from API response
        res.data.response.route[0].leg[0].shape.map(m => {
            // here we are getting latitude and longitude in seperate variables because HERE sends it together, but we
            // need it seperate for <Polyline/>
            let latlong = m.split(',');
            let latitude = parseFloat(latlong[0]);
            let longitude = parseFloat(latlong[1]);
            routeCoordinates.push({latitude: latitude, longitude: longitude});
        }
        this.setState({
            routeForMap: routeCoordinates,
            // here we can access route summary which will show us how long does it take to pass the route, distance etc.
            summary: res.data.response.route[0].summary,
            // NOTE just add this 'isLoading' field now, I'll explain it later
            isLoading: false,
        })
    }).catch(err => {
        console.log(err)
    })
}

ПРИМЕЧАНИЕ Здесь есть несколько вещей, на которые стоит обратить внимание.Во-первых, вы должны заменить идентификатор приложения и код приложения на действительный идентификатор приложения и код приложения из своего проекта ЗДЕСЬ.Второе замечание: я добавил &legAttributes=shape в конце URL-адреса запроса, но его нет в документации.Я поставил его таким образом, чтобы координаты Полилинии имели правильную форму, если вы не укажете ее, она просто ответит координатами поворотов дороги, и эта полилиния пройдет по зданиям и тому подобному, просто будет плохо выглядеть.

OK.Итак, теперь у нас есть координаты для создания полилинии, давайте сделаем это.

<MapView>
  <Polyline coordinates={this.state.routeForMap} strokeWidth={7} strokeColor="red" geodesic={true}/>
  <Marker coordinate={{latitude: this.state.startingLocation.latitude, longitude: this.state.startingLocation.longitude}} title="Starting location"/>
  <Marker coordinate={{latitude: this.state.finishLocation.latitude, longitude: this.state.finishLocation.longitude}} title="Finishlocation"/>
</MapView>

Объяснение: Polyline.coordinates отобразит все предоставленные нами координаты и нарисует полилинию.strokeWidth - это то, насколько толстой должна быть ваша линия, а strokeColor - это, очевидно, цвет линии.

Теперь вам нужно добавить region к вашему компоненту MapView, чтобы он знал, какую начальную область выхочу показать на карте.Поэтому я предлагаю вам сделать что-то вроде этого:

В состоянии определите поле региона и задайте ему те же координаты, что и в начальной позиции, а затем установите дельту, чтобы увеличить изображение.

// so in state just add this
region: {
  latitude: parseFloat("xx.x"),
  longitude: parseFloat("yy.y"),
  latitudeDelta: 0.0922,
  longitudeDelta: 0.0421,
}

А теперь добавьте region={this.state.region} в MapView.

Вы бы сделали это сейчас, но давайте удостоверимся, что это работает каждый раз.Вы должны убедиться, что запрос HERE API завершен, прежде чем карта будет отображаться.Я бы сделал это так:

// in your state define field to control if loading is finished
isLoading: true,

Теперь вы бы вызвали функцию _getRoute(), которую мы сделали ранее в функции жизненного цикла componendDidMount (), предоставленной React Native.Например:

componentDidMount() {
  // when this function is finished, we will set isLoading state to false to let program know that API request has finished and now we can render the map
  this._getRoute()
}

Итак, наконец, последний шаг - управление isLoading в вашей функции render ():

render() {
  if(this.state.isLoading) {
    return (
      <Text>Loading...(you could also use <ActivityIndicator/> or what ever you want to show while loading the request)</Text>
    )
  } else {
    // just put everything we already did here + stuff you already have
  }
}

Итак, вот оно.Я постарался сделать это как можно более подробным, чтобы вам и другим людям, которые будут нуждаться в помощи, было легко.

Не стесняйтесь спрашивать меня, если что-то неясно, или это не работает, или вынужна дополнительная помощь!Я всегда рад помочь: D

...