作者:dgh | 来源:互联网 | 2023-05-19 06:24
1.我们的需求是在地图上面添加一个点进行标记,并且点击的时候可以选中它
布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加一个要素" />
LinearLayout>
<com.esri.android.map.MapView
android:id="@+id/map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
com.esri.android.map.MapView>
LinearLayout>
代码:
package demo.GraphicsLayerLib;
import java.util.HashMap;
import java.util.Map;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import com.esri.android.map.GraphicsLayer;
import com.esri.android.map.InfoTemplate;
import com.esri.android.map.Layer;
import com.esri.android.map.MapView;
import com.esri.android.map.event.OnSingleTapListener;
import com.esri.core.geometry.Envelope;
import com.esri.core.geometry.Geometry;
import com.esri.core.geometry.Point;
import com.esri.core.map.Graphic;
import com.esri.core.renderer.SimpleRenderer;
import com.esri.core.symbol.PictureMarkerSymbol;
import com.esri.core.symbol.Symbol;
public class GraphicsLayerDemoActivity extends Activity {
Button btn1;
MapView mMapView;
final String URL_STREET_COLD = "http://cache1.arcgisonline.cn/ArcGIS/rest/services/ChinaOnlineStreetCold/MapServer";
GraphicsLayer mGraphicsLayer;
final int STATE_ADD_GRAPHIC = 1;
final int STATE_SHOW = 2;
int m_State;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
m_State = STATE_SHOW;
btn1 = (Button) findViewById(R.id.btn1);
btn1.setText("准备添加要素");
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
m_State = m_State == STATE_ADD_GRAPHIC ? STATE_SHOW
: STATE_ADD_GRAPHIC;
if (m_State == STATE_ADD_GRAPHIC) {
btn1.setText("单击地图将添加要素,单击本按钮结束");
} else {
btn1.setText("准备添加要素");
}
}
});
mMapView = (MapView) findViewById(R.id.map);
mMapView.addLayer(new com.esri.android.map.ags.ArcGISTiledMapServiceLayer(
URL_STREET_COLD));
Envelope initextext = new Envelope(12899459.4956466, 4815363.65520802,
13004178.2243971, 4882704.67712717);
mMapView.setExtent(initextext);
mMapView.setOnSingleTapListener(m_OnSingleTapListener);
}
OnSingleTapListener m_OnSingleTapListener= new OnSingleTapListener() {
int m_Char = 65;
public void onSingleTap(float x, float y) {
if (!mMapView.isLoaded()) {
return;
}
if (m_State == STATE_ADD_GRAPHIC) {
AddNewGraphic(x, y);
} else {
SelectOneGraphic(x, y);
}
}
private void SelectOneGraphic(float x, float y) {
GraphicsLayer layer = GetGraphicLayer();
if (layer != null && layer.isInitialized() && layer.isVisible()) {
Graphic result = null;
result = GetGraphicsFromLayer(x, y, layer);
if (result != null) {
String msgTag = (String) result
.getAttributeValue("tag");
AlertMsg(msgTag);
}
}
}
private void AddNewGraphic(float x, float y) {
GraphicsLayer layer = GetGraphicLayer();
if (layer != null && layer.isInitialized() && layer.isVisible()) {
Point pt = mMapView.toMapPoint(new Point(x, y));
Map map = new HashMap();
map.put("tag", "" + (char) (m_Char++));
Graphic gp1 = CreateGraphic(pt, map);
layer.addGraphic(gp1);
}
}
};
/**
* 从一个图层里里 查找获得 Graphics对象. x,y是屏幕坐标,layer
* 是GraphicsLayer目标图层(要查找的)。相差的距离是50像素。
* @param xScreen
* @param yScreen
* @param layer
* @return
*/
private Graphic GetGraphicsFromLayer(double xScreen, double yScreen) {
Graphic result = null;
try {
int[] idsArr = layer.getGraphicIDs();
Log.d("TestNet","一共:"+idsArr.length);
double x = xScreen;
double y = yScreen;
for (int i = 0; i Graphic gpVar = layer.getGraphic(idsArr[i]);
if (gpVar != null) {
Log.d("TestNet","<<>>"+gpVar.getGeometry());
if(gpVar.getGeometry().toString().contains("Point")){
Point pointVar = (Point) gpVar.getGeometry();
pointVar = mArcgisMapView.toScreenPoint(pointVar);
double x1 = pointVar.getX();
double y1 = pointVar.getY();
if (Math.sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1)) <50) {
result = gpVar;
break;
}else{
}
}
}
}
} catch (Exception e) {
return null;
}
return result;
}
private Graphic CreateGraphic(Point geometry, Map map) {
GraphicsLayer layer = GetGraphicLayer();
Drawable image = GraphicsLayerDemoActivity.this.getBaseContext()
.getResources().getDrawable(R.drawable.pop);
PictureMarkerSymbol symbol = new PictureMarkerSymbol(image);
Graphic g = new Graphic(geometry, symbol, map, null);
return g;
}
private GraphicsLayer GetGraphicLayer() {
if (mGraphicsLayer == null) {
mGraphicsLayer = new GraphicsLayer();
mMapView.addLayer(mGraphicsLayer);
}
return mGraphicsLayer;
}
void AlertMsg(String str, Object... arg) {
String msg = String.format(str, arg);
Toast.makeText(this, msg, 2).show();
Log.i("AlertMsg", msg);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
mMapView.pause();
}
@Override
protected void onResume() {
super.onResume();
mMapView.unpause();
}
}
资源链接地址
http://download.csdn.net/detail/xzytl60937234/9728384