当前位置: 首页 > 知识库问答 >
问题:

将自定义wms图层添加到代号为one的Mapcontainer

严言
2023-03-14

我正在构建一个代号为one的android GPS应用程序。我使用com。代号1。谷歌地图。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();
}

我想在谷歌地图中添加一个wms图层。这可能吗?我在codenameone中找不到命令addLayer。如果是,您是否有代码片段如何执行此操作?如果不可能,我可以在我的代号为one的应用程序中使用openlayers吗?你能给我一个代码片段来做这个吗?

编辑我开始创建一个本地文件,从谷歌地图api“捕获”addtileoverlay。我想使用的层是xyz层,所以我想我可以使用GoogleMapAPI中的urltileprovider

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

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;}

}

我的航海标记。java文件具有与本机接口绑定的代码

import com.codename1.system.NativeInterface;

/**
 *
 * @author Hongerige Wolf
 */


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

在mainActivityJava文件中,我有以下语句

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

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

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

更新我创建了一个新的谷歌地图。CN1lib。但是谷歌地图上没有显示xyz图层。我使用本机代码来使用Tileoverlay特性,并尝试以与标记相同的方式添加Tileoverlay。在InternalNativeMapSiml文件中,我更改了

 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(新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);

在Map容器文件中我添加了

 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));

把拼贴画放到googlemap上。还是tileurl错了。http://t1.openseamap.org/seamark/z/x/y.png是正确的。

共有1个答案

斜成济
2023-03-14

我们现在不公开本机映射中的层,您可以分叉项目,只需添加一个API来支持本机实现。

 类似资料:
  • 我正在使用GraphStream库。目前,当我运行我的程序时,它会为我的图形打开新窗口并为我的图形打开单独的窗口。我尝试创建一个并将添加到中,之后我尝试将图形添加到我的中,但它说图形对象不是组件。 这是我的代码: 此程序为和图形打开单独的窗口。我想将我的图形显示在我的或。你知道怎么做吗?我看过这个链接,但它不能很好地解释我。

  • 问题内容: 我已经构建了自己的自定义react-bootstrap Popover组件: 该组件的呈现方式如下: 现在,我想向组件中添加自定义道具,例如:我的文字,并使用新道具在弹出框中设置一些内容,例如- 但随后我在浏览器中收到此警告: 警告:标签上的未知道具。从元素中删除这些道具。 现在,我想我可以删除零件并逐个插入所有原始道具,而无需自定义道具,但是这样我就失去了“淡入淡出”效果,这也是处理

  • 我有一个从sqlite数据库接收阵列的基本适配器: 并在异步中填充它: 但我不知道如何为每个条目添加图像,请注意,图像位于文件夹中,图像的名称属于每个条目,例如对于条目管理,在/storage/sdcard/pictures/admin_image1中有一个图像。jpg。因此,当我有条目的名称时,我可以将图像绑定到特定条目。 我需要的是如何将图像添加到此适配器,这里我发布了主要活动和适配器代码,抱

  • 问题内容: 我正在研究启用AJAX的asp.net应用程序。我刚刚向Array.prototype添加了一些方法,例如 该解决方案对我有用,可以以“漂亮”的方式重用代码。 但是,当我测试了它与整个页面一起使用时,我遇到了问题。我们有了一些自定义的Ajax扩展程序,它们开始表现出意想不到的效果:某些控件在其内容或值上显示为“未定义”。 这可能是什么原因?我是否缺少修改标准对象原型的东西? 注意:我很

  • 如果我创建一个继承JComponent的新类,我重写了JComponent的绘图Component(Graphics g)方法,通过使用g绘制一个圆圈,我应该修改什么才能使MouseListener仅在我单击组件的边界内时触发? 因为我在组件的构造函数中添加了setBounds(…)然后添加了一个MouseListener,但它会在我每次单击自定义组件所在容器中的任何位置时触发,而不仅仅是在我单击

  • 我一直在尝试向<code>PYTHONPATH</code>添加一个自定义目录。我在Mac上使用bash,如果相关的话。这就是我所做的: < li> < li> 并保存 < li> 有两个问题: < li >当我在Python IDE中运行< code>sys.path时,目标目录仍然没有出现。 < li >当我在终端中启动Python并在那里运行< code>sys.path时,确实显示了目录,