在开发应用的过程中,常常需要在地图上需绘制一点自定义的兴趣点或是自定义的几何图形。引路蜂地图包中RasterMap最终提供的基实就是一张图片
protected void paint(Graphics g) { map.paint(mapGraphics); g.drawImage((Image) mapImage.getNativeImage(), 0, 0, 0); //start drawing your own sharps or images. ... … }
所以一个简单的方法是绘制完地图后,你可以使用任何绘图方法在地图绘制任何自定义的图形或是图象。
这里需要注意的是坐标变换,RasterMap采用的是经纬度坐标,而屏幕显示采用的屏幕坐标,RasterMap提供了坐标转换的方法:fromScreenPixelToLatLng 坐屏幕坐标转换成地图经纬度坐标。fromLatLngToScreenPixel 从经纬度坐标转换成屏幕坐标。
下面给出的例子是采用派生MapLayer子类的方法,RasterMap是 MapLayerContainer的子类,可以用来管理多个地图层。这些图层从下到上相当于透明纸一层一层叠加形成最终显示的地图。
例子中显示几个自定义兴趣点,和一个三角形.
package com.pstreets.gisengine.demo.lwuit; //--------------------------------- IMPORTS ------------------------------------ import com.mapdigit.gis.MapLayer; import com.mapdigit.gis.drawing.IGraphics; import com.mapdigit.gis.geometry.GeoLatLng; import com.mapdigit.gis.geometry.GeoPoint; import com.mapdigit.gis.raster.MapType; import com.pstreets.gisengine.demo.MapDemoLWUIT; public class MapOverlayLWUIT extends MapDemoLWUIT { OverLayMapLayer mapLayer; public void startApp() { init(); canvas.setTitle("Map Overlay"); GeoLatLng center = new GeoLatLng(32.0616667, 118.7777778); map.setCenter(center, 9, MapType.MICROSOFTCHINA); mapLayer = new OverLayMapLayer(canvas.getWidth(), canvas.getHeight()); map.addMapLayer(mapLayer); canvas.show(); } class OverLayMapLayer extends MapLayer { GeoLatLng pt1 = new GeoLatLng(32.345281, 118.84261); GeoLatLng pt2 = new GeoLatLng(32.05899, 118.62789); GeoLatLng pt3 = new GeoLatLng(32.011811, 118.798656); public OverLayMapLayer(int width, int height) { super(width, height); } public void paint(IGraphics graphics, int offsetX, int offsetY) { drawTriangle(graphics); drawPoint(graphics, pt1); drawPoint(graphics, pt2); drawPoint(graphics, pt3); } public void drawTriangle(IGraphics g) { GeoPoint ptOnScreen1 = map.fromLatLngToScreenPixel(pt1); GeoPoint ptOnScreen2 = map.fromLatLngToScreenPixel(pt2); GeoPoint ptOnScreen3 = map.fromLatLngToScreenPixel(pt3); g.setColor(0x0000FF); g.drawLine((int) ptOnScreen1.x, (int) ptOnScreen1.y, (int) ptOnScreen2.x, (int) ptOnScreen2.y); g.drawLine((int) ptOnScreen2.x, (int) ptOnScreen2.y, (int) ptOnScreen3.x, (int) ptOnScreen3.y); g.drawLine((int) ptOnScreen1.x, (int) ptOnScreen1.y, (int) ptOnScreen3.x, (int) ptOnScreen3.y); } public void drawPoint(IGraphics g, GeoLatLng pt) { GeoPoint ptOnScreen = map.fromLatLngToScreenPixel(pt); int x = (int) ptOnScreen.x; int y = (int) ptOnScreen.y; g.setColor(0x00FF00); g.fillRect(x - 4, y - 4, 8, 8); } } }
LWUIT 引路蜂地图开发包Ver2.1下载
引路蜂地图服务缺省使用Google地图服务,但你也可以选择其它地图服务,比方说当Google服务离线时,您可以选择MapAbc的地图服务,另外要注意的是中国地图是有偏移的。如果想使用无偏移的中国地图,一是采用地图偏移校正算法,另外一个是使用CloudMade地图服务。
所前所述,引路蜂地图开发包在设计时将地图图片显示和地图服务两部分设计成相对独立的两部分,Google中国地图图片,Bing中国地图图片,MapAbc中国地图图片是有偏移的地图图片,CloudMade(OpenStreet)中国地图图片是无偏移的。而Google中国地图服务,MapAbc中国地图服务是有偏移,CloudMade地图服务是无偏移的。所以在选择地图类型和地图服务类型时,要么都选择有偏移,要么都选择无偏移。否则地图在显示路径时或地址时就不匹配。
下面列表是合法的组合:
地图类型 (MapType) 地图服务类型 (DigitalMapService) GOOGLECHINA GOOGLE_MAP_SERVICE MICROSOFTCHINA GOOGLE_MAP_SERVICE MAPABCCHINA GOOGLE_MAP_SERVICE OPENSTREETMAP CLOUDMADE_MAP_SERVICE GOOGLECHINA MAPABC_MAP_SERVICE MICROSOFTCHINA MAPABC_MAP_SERVICE MAPABCCHINA MAPABC_MAP_SERVICE下述示列地图类型使用MICROSOFTCHINA,而使用不同的地图服务时路径查询的情况。(南京到天津的路径)
//--------------------------------- PACKAGE ------------------------------------ package com.pstreets.gisengine.demo.lwuit; //--------------------------------- IMPORTS ------------------------------------ import com.mapdigit.gis.MapDirection; import com.mapdigit.gis.geometry.GeoLatLng; import com.mapdigit.gis.raster.MapType; import com.mapdigit.gis.service.DigitalMapService; import com.mapdigit.gis.service.IRoutingListener; import com.pstreets.gisengine.demo.MapDemoLWUIT; import com.sun.lwuit.Command; import com.sun.lwuit.events.ActionEvent; public class MapServiceTypeLWUIT extends MapDemoLWUIT implements IRoutingListener{ private Command mapGetDirectionCommand; public void startApp() { init(); canvas.setTitle("Map Service Type"); map.setCurrentMapService(DigitalMapService.GOOGLE_MAP_SERVICE); //map.setCurrentMapService(DigitalMapService.MAPABC_MAP_SERVICE); //map.setCurrentMapService(DigitalMapService.CLOUDMADE_MAP_SERVICE); mapGetDirectionCommand=new Command("Get Direction"){ public void actionPerformed(ActionEvent evt) { GeoLatLng latLng1=new GeoLatLng(32.0418381,118.7788905); GeoLatLng latLng2=new GeoLatLng(39.11643,117.180908); map.getDirections(new GeoLatLng[]{latLng1,latLng2}); } }; canvas.addCommand(mapGetDirectionCommand); GeoLatLng center = new GeoLatLng(32.0616667, 118.7777778); map.setCenter(center, 13, MapType.MICROSOFTCHINA); map.setRoutingListener(this); canvas.show(); } public void done(String query, MapDirection result) { if(result!=null){ map.setMapDirection(result); map.resize(result.getBound()); map.setZoom(3); } } }
上图分别为三种地图服务返回的路径,Google 地图服务和MapAbc地图服务返回的结果基本相同,实际上Google 地图服务在中国的地图是来自于MapAbc。而CloudMade地图返回的结果似乎偏移了道路。这是因为Bing 中国地图是被偏移过的,而CloudMade返回的无偏移的结果。Google 地图服务和MapAbc地图服务返回的结果也是偏移过的,所以和偏移过的地图很“匹配”。
LWUIT 引路蜂地图开发包Ver2.1下载
地址反编码是通过经纬度查询对应的地名,下面示例是查询经纬度为118.777802, 32.061699对应的地名,结果为”中国江苏省南京市鼓楼区渊声巷41号”。
package com.pstreets.gisengine.demo.lwuit; //--------------------------------- IMPORTS ------------------------------------ import com.mapdigit.gis.MapPoint; import com.mapdigit.gis.geometry.GeoLatLng; import com.mapdigit.gis.raster.MapType; import com.mapdigit.gis.service.IReverseGeocodingListener; import com.pstreets.gisengine.demo.MapDemoLWUIT; import com.sun.lwuit.Command; import com.sun.lwuit.events.ActionEvent; public class MapReverseGeocodingLWUIT extends MapDemoLWUIT implements IReverseGeocodingListener{ private Command mapFindAddressCommand; public void startApp() { init(); canvas.setTitle("Map Reverse Geocoding"); mapFindAddressCommand=new Command("Find Address"){ public void actionPerformed(ActionEvent evt) { map.getReverseLocations("32.061699,118.777802"); } }; canvas.addCommand(mapFindAddressCommand); GeoLatLng center = new GeoLatLng(32.0616667, 118.7777778); map.setCenter(center, 13, MapType.MICROSOFTCHINA); map.setReverseGeocodingListener(this); canvas.show(); } public void done(String arg0, MapPoint[] result) { if (result != null) { map.panTo(result[0].getPoint()); } } }
注意使用字符串经纬度格式时,纬度在前,经度在后,如果反了,则返回的地名或能为空或都跑到外国去了。结果也是一个数组,一般到第一个结果,后面结果是更大的区域或是距离相对较远的地名。
LWUIT 引路蜂地图开发包Ver2.1下载