添加自定义wms图层以代理一个Mapcontainer

时间:2016-12-21 10:14:01

标签: google-maps openlayers codenameone wms

我正在使用Codename构建一个Android GPS应用程序。我使用com.codename1.googlemaps.MapContainer创建Google地图; 在我的应用程序中使用选项卡来创建不同的“页面”。

代码:

cnt = new MapContainer();
t.addTab("Tab3", cnt);

对于我目前的位置,我使用:

try {
  Coord position = new Coord(lat,lng);
  cnt.clearMapLayers();
  cnt.setCameraPosition(position);
  cnt.addMarker(EncodedImage.create("/maps-pin.png"), position, "Hi marker", "Optional long description", new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
      // stuff todo...
    }
  });
} catch(IOException err) {
  // since the image is iin the jar this is unlikely
  err.printStackTrace();
}

我想在Google地图中添加wms图层。这可能吗?我在codenameone中找不到命令addLayer。如果是的话,你有一个代码片段如何做到这一点? 如果它不可能,我可以在我的代号一个应用程序中使用openlayers吗?你能给我一个代码片段吗?

修改 我开始创建一个本地文件来“捕获”来自google maps api的addtileoverlay。我想要使​​用的图层是xyz图层,所以我想我可以使用googlemap api中的urltileprovider

我为tileoverlay创建了本机代码,但是没有出现tileoverlay。是因为我没有得到mapcontainer的链接。 我有点卡住了。我尝试使用googmaps示例从头开始构建,但不再使用mapcompnent。

package com.Bellproductions.TalkingGps;

import com.google.android.gms.maps.model.UrlTileProvider;

import java.io.UnsupportedEncodingException;
import java.net.URL;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.TileOverlayOptions;
import com.google.android.gms.maps.model.TileProvider;
import com.google.android.gms.maps.model.TileOverlay;
import com.codename1.impl.android.AndroidNativeUtil;
import java.util.Locale;
import java.net.MalformedURLException;

public class SeamarksImpl  { 

private GoogleMap mapInstance;
private TileOverlay m;
  TileProvider provider;
public boolean isSupported() {
    return true;
}

public long addTilelayer (){

 final String URL_FORMAT = "http://t1.openseamap.org/seamark/{z}/{x}/{y}.png";



    AndroidNativeUtil.getActivity().runOnUiThread(new Runnable() {

public void run() {


provider = new UrlTileProvider(256, 256) {

@Override
    public  synchronized URL getTileUrl(int x, int y, int zoom) {

try {
            y = (1 << zoom) - y - 1;
            return new URL(String.format(Locale.US, URL_FORMAT, zoom, x, y ));
        } catch (MalformedURLException e) {
            throw new RuntimeException();
        }

}

TileOverlayOptions tileopt = new TileOverlayOptions().tileProvider(provider);


public void addlayer() {
m = mapInstance.addTileOverlay(tileopt);
}

};

}

});

long p = 1;

return p;}

}

我的seamarks.java文件具有与本机接口绑定的代码

import com.codename1.system.NativeInterface;

/**
 *
 * @author Hongerige Wolf
 */


public interface Seamarks extends NativeInterface {
  public void addTilelayer ();
}

在mainactivity java文件中,我有语句

public Seamarks seamark;
public void init(Object context) {

  seamark = (Seamarks)NativeLookup.create(Seamarks.class);
}

public void start() { 
      seamark.addTilelayer();
}

更新 我创建了一个新的googlemaps.CN1lib。但是xyz图层没有在googlemaps上显示。我使用本机代码使用Tileoverlay功能并尝试以与Markers相同的方式添加tileoverlay。 在InternalNativeMapsImpl文件中,我改变了

 private void installListeners() {
    /*
    if (mapInstance == null) {
        view = null;
        System.out.println("Failed to get map instance, it seems google play services are not installed");
        return;
    }*/
    view.getMapAsync(new OnMapReadyCallback() {
        @Override
        public void onMapReady(GoogleMap googleMap) {
            mapInstance = googleMap;

TileProvider tileProvider;
    tileProvider = new UrlTileProvider(256, 256) {
    String tileLayer= "http://t1.openseamap.org/seamark/";
        @Override
        public synchronized URL getTileUrl(int x, int y, int zoom) {
            // The moon tile coordinate system is reversed.  This is not normal.
            int reversedY = (1 << zoom) - y - 1;
            //String s = String.format(Locale.US, tileLayer , zoom, x, y);
            String s = tileLayer + "/" + zoom + "/" + x + "/" + reversedY + ".png";
            URL url = null;
            try {
                url = new URL(s);
            } catch (MalformedURLException e) {
                throw new AssertionError(e);
            }
            return url;
        }
    };

    mMoonTiles =  mapInstance.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider));




            mapInstance.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                public boolean onMarkerClick(Marker marker) {
                    Long val = listeners.get(marker);
                    if (val != null) {
                        MapContainer.fireMarkerEvent(InternalNativeMapsImpl.this.mapId, val.longValue());
                        return true;
                    }
                    return false;
                }
            });
            mapInstance.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
                public void onCameraChange(CameraPosition position) {
                    MapContainer.fireMapChangeEvent(InternalNativeMapsImpl.this.mapId, (int) position.zoom, position.target.latitude, position.target.longitude);
                }
            });
            mapInstance.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
                public void onMapClick(LatLng point) {
                    Point p = mapInstance.getProjection().toScreenLocation(point);
                    MapContainer.fireTapEventStatic(InternalNativeMapsImpl.this.mapId, p.x, p.y);
                }
            });


            mapInstance.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {

                public void onMapLongClick(LatLng point) {
                    Point p = mapInstance.getProjection().toScreenLocation(point);
                    MapContainer.fireLongPressEventStatic(InternalNativeMapsImpl.this.mapId, p.x, p.y);
                }
            });
            mapInstance.setMyLocationEnabled(showMyLocation);
            mapInstance.getUiSettings().setRotateGesturesEnabled(rotateGestureEnabled);
        }
    });

}

其次我添加addTilexyz方法也与addMarkers

相同
 public long addTilexyz(final String Turl) {
    uniqueIdCounter++;
    final long key = uniqueIdCounter;

AndroidNativeUtil.getActivity()。runOnUiThread(new Runnable(){             public void run(){

TileProvider tileProvider;
    tileProvider = new UrlTileProvider(256, 256) {
    // Tileurl = "http://t1.openseamap.org/seamark/";
        @Override
        public synchronized URL getTileUrl(int x, int y, int zoom) {
            // The moon tile coordinate system is reversed.  This is not normal.
            int reversedY = (1 << zoom) - y - 1;
            String s = String.format(Locale.US, Turl , zoom, x, reversedY);

            URL url = null;
            try {
                url = new URL(s);
            } catch (MalformedURLException e) {
                throw new AssertionError(e);
            }
            return url;
        }
    };

    mMoonTiles =  mapInstance.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider));      

        }
        });

    return key;
}

在InternalNativeMaps文件中,我添加了te方法

    public long addTilexyz(String Turl);

在Mapcontainer文件中我添加了

 public MapObject addTilexyz(String Turl) {
    if(internalNative != null) {
         MapObject o = new MapObject();
         Long key = internalNative.addTilexyz(Turl);
         o.mapKey = key;
         markers.add(o);
        return o;
    } else {

        }

        MapObject o = new MapObject();
        return o;
    }

我感到困惑的是代码有什么问题。我想知道命令是否

Long key = internalNative.addTilexyz(Turl);

and 

mMoonTiles =  mapInstance.addTileOverlay(new TileOverlayOptions().tileProvider(tileProvider));

将tileoverlay放在googlemap上。或者是错误的。 http://t1.openseamap.org/seamark/z/x/y.png是正确的。

1 个答案:

答案 0 :(得分:0)

我们目前不会在原生地图中公开图层,您可以fork the project添加一个API来支持本机实现。