【问题标题】:Add custom wms layer to codename one Mapcontainer将自定义 wms 图层添加到代号为一个 Mapcontainer
【发布时间】:2017-01-17 01:23:42
【问题描述】:

我正在构建一个代号为 one 的 android GPS 应用程序。我使用com.codename1.googlemaps.MapContainer 创建谷歌地图; 在我的应用中,使用标签来创建不同的“页面”。

代码:

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 图层。这可能吗?我在代号中找不到命令addLayer。如果是,你有代码 sn -p 怎么做? 如果不可能,我可以在我的代号一个应用程序中使用 openlayers 吗?你能给我一个代码 sn-p 来做这个吗?

编辑 我开始创建一个本机文件来“捕捉”来自 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。但是 googlemaps 上没有显示 xyz 图层。我使用本机代码来使用 Tileoverlay 功能,并尝试以与标记相同的方式添加 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() { 公共无效运行(){

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 上。或者是 tileurl 错误。 http://t1.openseamap.org/seamark/z/x/y.png 是正确的。

【问题讨论】:

    标签: google-maps openlayers codenameone wms


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我查看了 googlemap 文件,但不知道如何在项目中添加 wms 层。在 googlemap 项目中没有对 wms 层的引用。还是我忽略了它
    • 不,没有。您需要在本机实现中执行此操作并为此添加 API。看看我们如何添加标记,然后做一些类似的事情来向上映射原生 WMS 功能。
    • 好的,我试试。我在我的应用程序中使用 addLongpresslistner,但在 googlemaps 文件中没有代码。在 googlemaptest 中是我想编译的函数。如何将其添加到 googlemaps 代码中。
    • 请注意,Google 地图代码已经包含指针处理代码,因为指针处理发生在本机层中。所以你可以跟着那个监听器调用
    • 我为 tileoverlay 制作了本机代码,但 tileoverlay 没有出现在地图上。是不是因为我没有得到与 mapcontainer 的链接。我有点卡住了。我尝试使用 googmaps 示例从头开始构建,但不再使用 mapcompnent。
    猜你喜欢
    • 1970-01-01
    • 2022-09-29
    • 2018-12-27
    • 1970-01-01
    • 2016-09-17
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    相关资源
    最近更新 更多