Ошибка при реализации Geojson в React Native

Я пытаюсь реализовать слой Geojson на карте в React-Native.

Среда разработки:

  • реагирующие нативные карты: 0.24.2,
  • выставка: 33.0.0

Я безуспешно пробовал следующие три метода:

  1. Наложение
  2. Многоугольник и значок (с использованием изображения)
  3. Geojson

Я считаю, что Geojson — это самый простой и прямой метод реализации этого слоя на карте (Apple Maps для iOS и Google Maps для Android). Метод Geojson, к сожалению, не работает.

Я не знаю, как создать codeandbox для React Native, но фрагмент моего кода вы найдете ниже.

displayLightPollutionLayer() {
  const features = {
    "type": "FeatureCollection",
    "name": "artificialNightSkyBrightness_example",
    "crs": { 
      "type": "name", 
      "properties": 
        { 
          "name": "urn:ogc:def:crs:OGC:1.3:CRS84" 
        }
      },
      "features": [
        {  
          "type": "Feature",
          "properties": 
            { 
              "Name": null, 
              "description": null, 
              "drawOrder": 15, 
              "icon": "https:\/\/nightskybrightness.s3.eu-west-3.amazonaws.com\/ArtificialSkyBrightness537.JPG" 
            }, 
          "geometry": 
            { 
              "type": "Polygon", 
              "coordinates": [ 
                [ 
                  [4.2499263, 50.937513844500003], 
                  [4.2499263, 42.404183924500003], 
                  [-4.12507035, 42.404183924500003], 
                  [-4.12507035, 50.937513844500003], 
                  [4.2499263, 50.937513844500003] 
                ] 
              ] 
            } 
        }
      ]
  }

  return (
    <Geojson geojson={features}/>
  )
}

Ошибка:

Нарушение инварианта: Нарушение инварианта: Нарушение инварианта: Недопустимый тип элемента: ожидалась строка (для встроенных компонентов) или класс/функция (для составных компонентов), но получено: не определено. Вероятно, вы забыли экспортировать свой компонент из файла, в котором он определен, или вы могли перепутать импорт по умолчанию и именованный импорт. Проверьте метод рендеринга LightPollutionAtlas.

Ожидаемый результат:

Изображения должны располагаться по всей карте в предопределенных координатах и ​​должны иметь возможность масштабирования.


person Sujay    schedule 03.09.2019    source источник
comment
реагировать или реагировать-нативные?   -  person Gokul Kulkarni    schedule 03.09.2019
comment
Проблема в React Native. Я успешно сделал это в React для Интернета, используя слой KML, но я не могу сделать это в React Native для мобильных устройств.   -  person Sujay    schedule 03.09.2019
comment
Вы используете неправильную библиотеку, вы должны использовать, react-native-maps не react-google-maps github.com/react-native-community/react-native-maps   -  person Gokul Kulkarni    schedule 03.09.2019
comment
Я использую реактивные карты. Пример codeandbox как раз для того, чтобы продемонстрировать, каким должен быть конечный результат.   -  person Sujay    schedule 03.09.2019
comment
обновите свой вопрос, указав правильные ссылки на библиотеки, которые вы используете, например geojson   -  person Gokul Kulkarni    schedule 03.09.2019
comment
Я упомянул библиотеку и версию, которую использую, и удалил ссылку на codeandbox, которая была полезна для понимания того, как должен выглядеть окончательный результат.   -  person Sujay    schedule 03.09.2019


Ответы (3)


Geojson является компонентом модуля «react-native-geojson». Итак, вам нужно импортировать этот модуль, добавить эту строку поверх вашего класса.

import Geojson from 'react-native-geojson';

Также, «если еще этого не было», запустите npm install react-native-geojson внутри папки вашего проекта.

Также, как я заметил (может быть, я ошибаюсь), Geojson не поддерживает изображения напрямую, поэтому вы можете попробовать добавить этот код вместо функции displayLightPollutionLayer:

return (
  <Geojson geojson={features}>
          <Image source="https:\/\/nightskybrightness.s3.eu-west-3.amazonaws.com\/ArtificialSkyBrightness537.JPG" style = {{flex:1}}/>
  </Geojson>
)
person rptwsthi    schedule 03.09.2019

Вот как я решил свою проблему. На сегодняшний день в react-native-maps v0.24.2 Geojson не отображает изображения. Насколько я понимаю, компонент Geojson в react-native-maps отображает только точки, многоугольники и полилинии. Поэтому я переключился на компонент Overlay для размещения изображений в заранее определенных координатах на карте (Apple Maps для iOS). Я еще не тестировал решение для Google Maps на Android, но думаю, что оно должно работать нормально.

Я разделил код на две части: 1. Создание оверлеев. 2. Создание представления карты, включающего вышеуказанные наложения.

class PollutionOverlay extends React.Component {
  constructor(props) {
    super(props)
  }

  render() {

    return(
      <View>

        <Overlay
        image={{ uri: 'valid URI'}}
        bounds={[[50.9375138445,-4.12507035],[42.4041839245,4.2499263]]}
        />

        <Overlay
        image={{ uri: 'valid URI`enter code here`'}}
        bounds={[[50.9375138445,4.2499263],[42.4041839245,12.62492295]]}
        />

      </View>

    )
  }
}

export default PollutionOverlay;

-------------------------------------

import PollutionOverlay from 'valid path';
class LightPollutionAtlas extends React.Component {

  constructor(props) {
    super(props);
  }

render() {


  return(
      <MapView
      style={styles.mapStyle}
      maxZoomLevel={9}
      >

      <PollutionOverlay />

      </MapView>

  )
}
}

const styles = StyleSheet.create({
  mapStyle: {
    flex: 1
  }
});

export default LightPollutionAtlas;
person Sujay    schedule 11.09.2019

Обновите свою функцию displayLightPollutionLayer следующим образом, чтобы нарисовать многоугольник,

displayLightPollutionLayer(markers) {
const features = {
      "type": "FeatureCollection",
      "name": "artificialNightSkyBrightness_example",
      "crs": { "type": "name", "properties": { "name": 
      "urn:ogc:def:crs:OGC:1.3:CRS84" } },
      "features": [
        {
          "type": "Feature",
          "properties": {
            "Name": null,
            "description": null,
            "drawOrder": 15,
            "icon": "https:\/\/nightskybrightness.s3.eu-west- 3.amazonaws.com\/ArtificialSkyBrightness537.JPG"
          },
          "geometry": { 
            "type": "Polygon",
            "coordinates": [
              [
                [ 4.2499263, 50.937513844500003 ],
                [ 4.2499263, 42.404183924500003 ],
                [ -4.12507035, 42.404183924500003 ],
                [ -4.12507035, 50.937513844500003 ],
                [ 4.2499263, 50.937513844500003 ]
              ]
            ]
          } 
        }
      ]
    }
   return (<Polygon
      coordinates={this.getCoordinates(features)}
      title={marker.title}
      description={marker.description}
    />);
}

getCoordinates(features) {
     let updatedFeatures = features.features[0].geometry.coordinates.map((coordinate) => {latitude: coordinate[0], longitude: coordinate[1]});
     return updatedFeatures;
}

render() {
    return (
<MapView
  region={this.state.region}
  onRegionChange={this.onRegionChange}
>
  {this.displayLightPollutionPolygonLayer()}
</MapView>
)
}

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

person Gokul Kulkarni    schedule 03.09.2019
comment
Привет, Гокул. Спасибо, что нашли время ответить на мой вопрос. Если мы используем полигон, мы не сможем визуализировать изображение. Вот почему я использую Geojson. Как я ясно указал в своем вопросе, мне нужно отобразить изображение в предопределенных координатах. Так же, как пример, который я упомянул в вопросе изначально. Спасибо за попытку в любом случае. - person Sujay; 03.09.2019