2016-12-21 1 views
0

Я создаю приложение Android для Android с Codename. Я использую 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 слой на Картах Google. Это возможно? Я не могу найти в codenameone команду addLayer. Если да, есть ли у вас фрагмент кода, как это сделать? Если это не возможно, могу ли я использовать openlayers в моем кодовом имени для одного приложения? Можете ли вы дать мне фрагмент кода, чтобы сделать это?

Редактировать Я начал создавать собственный файл, чтобы «поймать» addtileoverlay из google maps api. Слой, который я хочу использовать, является слоем xyz, поэтому я думаю, что могу использовать urltileprovider из googlemap api

Я сделал собственный код для 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(); 
} 

Update я создал новый googlemaps.CN1lib. Но слой xyz не отображается на googlemaps. Я использовал собственный код tot, используя функцию Tileoverlay, и попытался добавить tileoverlay так же, как Markers. В файле 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 (новый Runnable() { общественных ничтожным 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 файл я добавлен тэ метод

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 на Google Map. Или это неправильно. http://t1.openseamap.org/seamark/z/x/y.png правильный.

ответ

0

В настоящее время мы не показываем слои на родных картах, вы можете fork the project и просто добавить API, чтобы поддерживать его в собственных реализациях.

+0

Спасибо, я посмотрел файлы googlemap, но я не могу понять, как я могу использовать wms-слой для проекта. В проекте googlemap нет ссылки на слой wms. Или я не обратил на это внимания – user3025401

+0

Нет, нет. Вам нужно сделать это в собственной реализации и добавить для этого API. Посмотрите, как мы добавляем маркеры, а затем делаем что-то похожее, чтобы отобразить собственную функциональность WMS вверх. –

+0

Хорошо, я попробую. Я использую в своем приложении addLongpresslistner, но в файлах googlemaps нет кода для него. В googlemaptest есть функция, скомпилированная, я полагаю. Как я могу добавить это в код googlemaps. – user3025401

Смежные вопросы