2017-11-09 2 views
2

Ich verwende das Android Mapbox SDK, um eine VectorSource zu einer MapboxMap hinzuzufügen, und dann versuche ich, der Map auch einen LineLayer hinzuzufügen.MapBox setProperties on LineLayer kann nicht aufgelöst werden

zur Zeit als die Version 5.1.3

Dieser Code in Typoskript sein wird, weil es die NativeScript Framework verwendet, die den Verbrauch von nativen Bibliotheken und direkten Zugriff auf native Android/iOS-APIs ermöglicht.

// these constants are just simple ways to reference a class in the mapbox package 

const PropertyFactory = com.mapbox.mapboxsdk.style.layers.PropertyFactory; 
const Property = com.mapbox.mapboxsdk.style.layers.Property; 
const LineLayer = com.mapbox.mapboxsdk.style.layers.LineLayer; 
const VectorSource = com.mapbox.mapboxsdk.style.sources.VectorSource; 
const lineCap = com.mapbox.mapboxsdk.style.layers.PropertyFactory.lineCap; 
const lineColor = com.mapbox.mapboxsdk.style.layers.PropertyFactory.lineColor; 
const lineJoin = com.mapbox.mapboxsdk.style.layers.PropertyFactory.lineJoin; 
const lineWidth = com.mapbox.mapboxsdk.style.layers.PropertyFactory.lineWidth; 
const LatLngBounds = com.mapbox.mapboxsdk.geometry.LatLngBounds; 
const FillLayer = com.mapbox.mapboxsdk.style.layers.FillLayer; 
const SymbolLayer = com.mapbox.mapboxsdk.style.layers.SymbolLayer; 
const CircleLayer = com.mapbox.mapboxsdk.style.layers.CircleLayer; 


// set the map GLSource (vector) to the mapbox map 
    const vectorSource = new VectorSource(
     layer.ID.toString(), 
     `http://themaptiles.cloudapp.net/data/${layer.GLSource}.json` 
    ); 
    this._mapboxMap.addSource(vectorSource); 

    let newLayer; 
    if (layer.Type == "line") { 
     console.log(`*** creating new LineLayer ***`); 
     newLayer = new LineLayer("line-layer", layer.ID.toString()); 

     // get the line color for this style 
     const lColor = style["line"]["line-color"]; 
     const androidColor = new Color(lColor).android; // ends up valid and something like -1293839 for android to use 

     newLayer.setSourceLayer(layer.ID.toString()); 

     // will throw here with `Failed resolving method setProperties on class com.mapbox.mapboxsdk.style.layers.Layer` 
     newLayer.setProperties(
     PropertyFactory.lineJoin(Property.LINE_JOIN_ROUND), 
     PropertyFactory.lineCap(Property.LINE_CAP_ROUND), 
     PropertyFactory.lineColor(androidColor), 
     PropertyFactory.lineWidth(new java.lang.Float(2)) 
    ); 
    } 


this._mapboxMap.addLayer(newLayer); 

Wenn ich nicht versuchen, setProperties Methode zu verwenden, dann der Code ausführt, in Ordnung, aber es gibt keine sichtbare Linie auf der Karte, nachdem die Schicht hinzugefügt wird.

+0

Hey @Brad Martin, könnten Sie versuchen, ein Array der Eigenschaften an die 'setProperties' variadic Methode zu übergeben? – pkanev

+0

danke @pkanev - Übergabe der Einstellungen als ein Array in der Tat verhindert die allgemeine Ausnahme von werfen –

Antwort

3

Eine der vielen Java < -> JavaScript Inkompatibilitäten und Herausforderungen in NativeScript - die Variadic Funktionen.

bei MapBox offiziellen API Suche ref die Layer.setProperties Methode eine Liste von Argumenten nimmt: https://www.mapbox.com/android-docs/api/map-sdk/5.2.0-beta.3/com/mapbox/mapboxsdk/style/layers/Layer.html#setProperties-com.mapbox.mapboxsdk.style.layers.PropertyValue...-

jedoch Argumente für die JNI gemeint -> Java Aufruf Layer.setProperties nicht einfach von einem Funktionsaufruf in JavaScript extrahiert werden, Stattdessen sollten Sie die Argumente in ein Array einschließen.

newLayer.setProperties([ 
    PropertyFactory.lineJoin(Property.LINE_JOIN_ROUND), 
    PropertyFactory.lineCap(Property.LINE_CAP_ROUND), 
    PropertyFactory.lineColor(androidColor), 
    PropertyFactory.lineWidth(new java.lang.Float(2)) 
    ]); 
Verwandte Themen