Проблема Firebase Cloud Functions с использованием пространства имен @ type / googlemaps: «ReferenceError: Google не определен» - PullRequest
0 голосов
/ 02 ноября 2018

Мне нужно использовать библиотеки API Карт Google в моих облачных функциях. Я установил пространство имен с помощью npm install --save @types/google-maps, поэтому vsCode не дает мне никакой ошибки компиляции, но когда запускается облачная функция, я получаю эту ошибку:

ReferenceError: google is not defined at exports.onZoneCreate.functions.database.ref.onCreate(/user_code/lib/index.js:93:20)

Сработала функция

 export const onZoneCreate = functions.database
.ref('/Zones/Areas/{CAP}/{IDzona}')
.onCreate((snapshot, context) => {


    const cap: string = context.params.CAP
    const IDZona: string = context.params.IDzona
    console.log('new zone (id Zona:' + IDZona + ') from CAP ' + cap)

    const feature = snapshot.val();
    const vettoreCoordinatePoligono = feature.geometry.coordinates

    console.log(vettoreCoordinatePoligono);

    var ref = snapshot.ref
    var root = ref.root
    var poly = new google.maps.Polyline(vettoreCoordinatePoligono)

    var risultato = getSquareDivision(poly);

    console.log(risultato)

    return root.child('prova/' + cap + IDZona).set(risultato);


})

где функции, которые я использую внутри этого:

1

function getSquareDivision(polygon: google.maps.Polyline) {

var bound = getBoundsRectangle(polygon);

var lowx,
    highx,
    lowy,
    highy,
    lats = [],
    lngs = [],
    vertices = polygon.getPath(),
    verticeslength: number = vertices.getLength()


for (var i = 0; i < verticeslength; i++) {
    lngs.push(vertices.getAt(i).lng());
    lats.push(vertices.getAt(i).lat());
}

lats.sort();
lngs.sort();

//VALORI VARIABILI
lowx = lats[0];
highx = lowx + 0.01;
lowy = lngs[0];
highy = lowy + 0.01;

var startHighX = highx;
var startLowX = lowx;

var sw = new google.maps.LatLng(lowx, lowy);
var ne = new google.maps.LatLng(highx, highy);
var llb = new google.maps.LatLngBounds(sw, ne);

var x = 0;
var y = 0;

var elements = [];

while (bound.contains(llb.getCenter())) {
    var i = 0;
    while (bound.contains(llb.getCenter())) {

        sw = new google.maps.LatLng(lowx, lowy);
        ne = new google.maps.LatLng(highx, highy);
        llb = new google.maps.LatLngBounds(sw, ne);
        var name = x + "" + y;

        elements[i] = [{ name: name, geometry: llb.toJSON() }];

        highx = highx + 0.01;
        lowx = lowx + 0.01;
        i++;
        x++;

    }

    highx = startHighX;
    lowx = startLowX;
    highy = highy + 0.01;
    lowy = lowy + 0.01;
    sw = new google.maps.LatLng(lowx, lowy);
    ne = new google.maps.LatLng(highx, highy);
    llb = new google.maps.LatLngBounds(sw, ne);
    y++;
    x = 0;
}

return elements;

}

2

function polygonCenter(poly) {


var lowx,
    highx,
    lowy,
    highy,
    lats = [],
    lngs = [],
    vertices = poly.getPath();

for (var i = 0; i < vertices.length; i++) {
    lngs.push(vertices.getAt(i).lng());
    lats.push(vertices.getAt(i).lat());
}

lats.sort();
lngs.sort();
lowx = lats[0];
highx = lats[vertices.length - 1];
lowy = lngs[0];
highy = lngs[vertices.length - 1];
var center_x = lowx + ((highx - lowx) / 2);
var center_y = lowy + ((highy - lowy) / 2);
return (new google.maps.LatLng(center_x, center_y));
}

3

function getBoundsRectangle(poly) {



var lowx,
    highx,
    lowy,
    highy,
    lats = [],
    lngs = [],
    vertices = poly.getPath();

for (var i = 0; i < vertices.length; i++) {
    lngs.push(vertices.getAt(i).lng());
    lats.push(vertices.getAt(i).lat());
}

lats.sort();
lngs.sort();
lowx = lats[0];
highx = lats[vertices.length - 1];
lowy = lngs[0];
highy = lngs[vertices.length - 1];

var sw = new google.maps.LatLng(lowx, lowy);
var ne = new google.maps.LatLng(highx, highy);
var llb = new google.maps.LatLngBounds(sw, ne);

return llb;
}

это мой пакет. Json

{
  "name": "functions",
  "scripts": {
  "lint": "tslint --project tsconfig.json",
  "build": "tsc",
  "serve": "npm run build && firebase serve --only functions",
  "shell": "npm run build && firebase functions:shell",
  "start": "npm run shell",
  "deploy": "firebase deploy --only functions",
  "logs": "firebase functions:log"
},
  "main": "lib/index.js",
  "dependencies": {
  "@types/google-maps": "^3.2.0",
  "firebase-admin": "~6.0.0",
  "firebase-functions": "^2.1.0",
  "request":"2.88.0"
},
  "devDependencies": {
  "tslint": "~5.8.0",
  "typescript": "~2.8.3"
},
  "private": true
}

это мой tsconfig.json

{
   "compilerOptions": {
   "lib": ["es6"],
   "module": "commonjs",
   "noImplicitReturns": true,
   "outDir": "lib",
   "sourceMap": true,
   "target": "es6"
   },
  "compileOnSave": true,
  "include": [
   "src"
   ],
  "files":[
  "node_modules/typescript/lib/lib.es6.d.ts"
   ],
  "exclude": [
  "node_modules"
   ]
}

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Я решил эту проблему с помощью другой библиотеки: http://turfjs.org/

Эта библиотека содержит все реализации, аналогичные google-maps-api.

Я бы очень хотел изменить код, но он работает прямо сейчас.

0 голосов
/ 03 ноября 2018

Похоже, вы загрузили объявления типов для API Карт Google, но не загрузили фактическую реализацию API. В любом случае обычный API Карт Google предназначен только для работы в браузерах. Быстрый веб-поиск нашел меня на этой странице , который указывает, что в облачных функциях Google вы хотите вместо @google/maps пакета , который имеет свой собственный объявления типов .

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