2016-12-21 41 views
0

我正在构建一个带有代号名称的android GPS应用程序。我使用com.codename1.googlemaps.MapContainer来创建Google地图; 在我的应用程序中使用标签来创建不同的“页面”。将自定义wms图层添加到代号名称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。如果是的话,你有一个代码片段如何做到这一点? 如果不是正确的,我可以在我的代号名称中使用openlayers吗?你能给我一个代码片段来做到这一点?

编辑 我开始创建一个本地文件来“抓住”谷歌地图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图层并未显示在Google地图上。我使用本地代码使用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); 
     } 
    }); 

} 

其次i的相同的方式addMarkers

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

AndroidNativeUtil.getActivity()。runOnUiThread(新的Runnable(){ 公共无效加入addTilexyz方法还运行(){

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文件I加入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; 
    } 

我puzzeled什么是错的代码。我想知道是否命令

Long key = internalNative.addTilexyz(Turl); 

and 

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

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

回答

0

我们现在不在本地地图中公开图层,您只需添加一个API以支持本地实现。

+0

谢谢,我看了googlemap文件,但我无法弄清楚我可以如何在项目上附加一个wms图层。在googlemap项目中没有对wms图层的引用。或者我忽略了它 – user3025401

+0

不,没有。您需要在本机实现中执行此操作并为其添加API。看看我们如何添加标记,然后执行类似的操作来向上映射原生WMS功能。 –

+0

好吧,我会尝试。我在我的应用程序addLongpresslistner中使用,但在Google地图文件中没有代码。在googlemaptest中是我编译的函数。我如何将这添加到谷歌地图代码。 – user3025401