Я создаю приложение 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 правильный.
Спасибо, я посмотрел файлы googlemap, но я не могу понять, как я могу использовать wms-слой для проекта. В проекте googlemap нет ссылки на слой wms. Или я не обратил на это внимания – user3025401
Нет, нет. Вам нужно сделать это в собственной реализации и добавить для этого API. Посмотрите, как мы добавляем маркеры, а затем делаем что-то похожее, чтобы отобразить собственную функциональность WMS вверх. –
Хорошо, я попробую. Я использую в своем приложении addLongpresslistner, но в файлах googlemaps нет кода для него. В googlemaptest есть функция, скомпилированная, я полагаю. Как я могу добавить это в код googlemaps. – user3025401