1)ArcGisActivity.java
package arc.gis;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.MotionEvent;
import android.widget.Toast;
import com.esri.android.map.GraphicsLayer;
import com.esri.android.map.MapOnTouchListener;
import com.esri.android.map.MapView;
import com.esri.android.map.ags.ArcGISFeatureLayer;
import com.esri.android.map.ags.ArcGISFeatureLayer.MODE;
import com.esri.android.map.ags.ArcGISFeatureLayer.Options;
import com.esri.android.map.ags.ArcGISFeatureLayer.SELECTION_METHOD;
import com.esri.android.map.event.OnSingleTapListener;
import com.esri.core.geometry.Envelope;
import com.esri.core.geometry.Point;
import com.esri.core.map.CallbackListener;
import com.esri.core.map.FeatureSet;
import com.esri.core.map.Graphic;
import com.esri.core.symbol.SimpleFillSymbol;
import com.esri.core.symbol.SimpleLineSymbol;
import com.esri.core.tasks.SpatialRelationship;
import com.esri.core.tasks.ags.query.Query;
public class ArcGisActivity extends Activity {
MapView mMapView ;
ArcGISFeatureLayer fLayer = null;
GraphicsLayer gLayer = null;
SimpleFillSymbol sfs;
CallbackListener<FeatureSet> callback = new CallbackListener<FeatureSet>() {
public void onCallback(FeatureSet fSet) {
System.out.println("onCallback"+fSet);
}
public void onError(Throwable arg0) {
gLayer.removeAll();
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMapView = (MapView)findViewById(R.id.map);
ESRIShapeLayer graphicsLayer = new ESRIShapeLayer("/mnt/sdcard/sample.shp",mMapView.getExtent());
Options o = new Options();
o.mode = MODE.ONDEMAND;
o.outFields = new String[] { "FIELD_KID", "APPROXACRE", "FIELD_NAME",
"STATUS", "PROD_GAS", "PROD_OIL", "ACTIVEPROD", "CUMM_OIL",
"MAXOILWELL", "LASTOILPRO", "LASTOILWEL", "LASTODATE",
"CUMM_GAS", "MAXGASWELL", "LASTGASPRO", "LASTGASWEL",
"LASTGDATE", "AVGDEPTH", "AVGDEPTHSL", "FIELD_TYPE",
"FIELD_KIDN"
};
gLayer=graphicsLayer.getLayer();
mMapView.addLayer(gLayer);
mMapView.setOnSingleTapListener(new OnSingleTapListener() {
private static final long serialVersionUID = 1L;
public void onSingleTap(float x, float y) {
Toast.makeText(getApplicationContext(), "You have touched at X-Y points::"+x+" "+y, Toast.LENGTH_LONG).show();
}
});
/* mMapView.setExtent(new Envelope(-10868502.895856911, 4470034.144641369,
-10837928.084542884, 4492965.25312689), 0);
ArcGISTiledMapServiceLayer tms = new ArcGISTiledMapServiceLayer(
"http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer");
mMapView.addLayer(tms);*/
fLayer = new ArcGISFeatureLayer(
"http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Petroleum/KSPetro/MapServer/1",
o);
SimpleFillSymbol fiedldsSelectionSymbol = new SimpleFillSymbol(Color.MAGENTA);
fiedldsSelectionSymbol.setOutline(new SimpleLineSymbol(Color.YELLOW, 2));
fLayer.setSelectionSymbol(fiedldsSelectionSymbol);
mMapView.addLayer(fLayer);
// selection box
gLayer = new GraphicsLayer();
sfs = new SimpleFillSymbol(Color.BLACK);
sfs.setOutline(new SimpleLineSymbol(Color.RED, 2));
sfs.setAlpha(100);
mMapView.addLayer(gLayer);
//setContentView(map);
MyTouchListener touchListener = new MyTouchListener(this, mMapView);
mMapView.setOnTouchListener(touchListener);
Toast.makeText(this, "Press down to start let go the stop",Toast.LENGTH_SHORT).show();
}
class MyTouchListener extends MapOnTouchListener {
Graphic g;
// first point clicked on the map
Point p0 = null;
int uid = -1;
public MyTouchListener(Context arg0, MapView arg1) {
super(arg0, arg1);
}
public boolean onDragPointerMove(MotionEvent from, MotionEvent to) {
if (uid == -1) { // first time
g = new Graphic(null, sfs);
p0 = mMapView.toMapPoint(from.getX(), from.getY());
uid = gLayer.addGraphic(g);
} else {
Point p2 = mMapView.toMapPoint(new Point(to.getX(), to.getY()));
Envelope envelope = new Envelope();
envelope.merge(p0);
envelope.merge(p2);
gLayer.updateGraphic(uid, envelope);
}
return true;
}
public boolean onDragPointerUp(MotionEvent from, MotionEvent to) {
if (uid != -1) {
g = gLayer.getGraphic(uid);
if (g!= null && g.getGeometry() != null) {
fLayer.clearSelection();
Query q = new Query();
// optional
q.setWhere("PROD_GAS='Yes'");
q.setReturnGeometry(true);
q.setInSpatialReference(mMapView.getSpatialReference());
q.setGeometry(g.getGeometry());
q.setSpatialRelationship(SpatialRelationship.INTERSECTS);
fLayer.selectFeatures(q, SELECTION_METHOD.NEW, callback);
}
gLayer.removeAll();
}
p0 = null;
// Resets it
uid = -1;
return true;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
mMapView.pause();
}
@Override
protected void onResume() {
super.onResume();
mMapView.unpause();
}
@Override
public Object onRetainNonConfigurationInstance() {
return mMapView.retainState();
}
}
2) ESRIShapeLayer.java
package arc.gis;
import java.io.File;
import java.io.IOException;
import android.graphics.Color;
import com.bbn.openmap.layer.shape.ESRIPointRecord;
import com.bbn.openmap.layer.shape.ESRIPoly;
import com.bbn.openmap.layer.shape.ESRIPolygonRecord;
import com.bbn.openmap.layer.shape.ShapeFile;
import com.esri.android.map.GraphicsLayer;
import com.esri.core.geometry.Envelope;
import com.esri.core.geometry.Point;
import com.esri.core.geometry.Polygon;
import com.esri.core.geometry.SpatialReference;
import com.esri.core.map.Graphic;
import com.esri.core.symbol.SimpleFillSymbol;
import com.esri.core.symbol.SimpleMarkerSymbol;
import com.esri.core.symbol.SimpleMarkerSymbol.STYLE;
public class ESRIShapeLayer {
private GraphicsLayer graphicsLayer = null;// = new GraphicsLayer();
private String shapeFileName = null;
private Polygon polygon = null;// = new Polygon();
private Point polygonVertex = null;// = new Point();
@SuppressWarnings("unused")
private int polygonCount = 0;
/**
* Save applications's state
*/
//ApplicationState applicationState = null; //, ApplicationState applicationState
public ESRIShapeLayer(String shapeFileName, Polygon pol) {
this.shapeFileName = shapeFileName;
SpatialReference lSR = SpatialReference.create(2093); //26192 2093
Envelope lEnvolope = getSHPEnvelope(shapeFileName);
graphicsLayer = new GraphicsLayer(lSR,lEnvolope);
polygon = new Polygon();
polygonVertex = new Point();
//this.applicationState = applicationState;
readShapeFile();
}
public GraphicsLayer getLayer() {
return graphicsLayer;
}
public GraphicsLayer readShapeFile() {
try {
File file = new File(shapeFileName);
ShapeFile esriShapeFile = new ShapeFile(file);
ESRIPoly[] polygons;
System.out.println("Shape Type: " + esriShapeFile.getShapeType());
if (esriShapeFile.getShapeType() == ShapeFile.SHAPE_TYPE_POINT) {
ESRIPointRecord esriPointRecord = (ESRIPointRecord) esriShapeFile.getNextRecord();
SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(Color.BLUE, 10, STYLE.CIRCLE);
while (esriPointRecord != null) {
graphicsLayer.addGraphic(new Graphic(
new Point(esriPointRecord.getX(), esriPointRecord.getY()), simpleMarkerSymbol));
esriPointRecord = (ESRIPointRecord) esriShapeFile.getNextRecord();
}
//esriShapeFile.close();
}
if (esriShapeFile.getShapeType() == ShapeFile.SHAPE_TYPE_POLYLINE) {
/**
* Have not figured this out yet.
*/
}
if (esriShapeFile.getShapeType() == ShapeFile.SHAPE_TYPE_POLYGON) {
ESRIPolygonRecord esriPolygonRecord = (ESRIPolygonRecord) esriShapeFile.getNextRecord();
SimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol(Color.BLUE);
while (esriPolygonRecord != null) {
polygons = esriPolygonRecord.polygons;
System.out.println("Number of Polygons Per Record[" + polygons.length + "]: "+ esriPolygonRecord.getRecordNumber());
for (int i = 0; i < polygons.length; i++) {
polygonCount++;
ESRIPoly.ESRIFloatPoly poly = (ESRIPoly.ESRIFloatPoly) polygons[i];
//System.out.println("Polygon Point Count[: " + esriPolygonRecord.getRecordNumber() + "]: " + poly.nPoints);
polygonVertex = new Point(poly.getX(0), poly.getY(0));
polygon = new Polygon();
polygon.startPath(polygonVertex);
for (int j = 1; j < poly.nPoints; j++) {
// System.out.println("poly.getX(j):"+poly.getX(j)+" poly.getY(j):"+poly.getY(j));
polygonVertex = new Point(poly.getX(j), poly.getY(j));
polygon.lineTo(polygonVertex);
}
}
/**
* Move inside loop above otherwise it is only displaying one of the polygons per record.
*/
//polygon.calculateArea2D();
graphicsLayer.addGraphic(new Graphic(polygon, simpleFillSymbol));
esriPolygonRecord = (ESRIPolygonRecord) esriShapeFile.getNextRecord();
}
//esriShapeFile.close();
// System.out.println("Polygon Count: " + polygonCount);
}
esriShapeFile.close();
} catch (IOException e1) {
e1.printStackTrace();
}
return graphicsLayer;
}
private Envelope getSHPEnvelope(String shapName) {
double xMin = 120.0; // 220.0
double xMax = 150.0; //250.0
double yMin = 150.0; //250.0
double yMax = -150.0; //-250.0
/*double xMin = -130.0;
double xMax = -114.0;
double yMin = 31.0;
double yMax = 41.5;*/
/*try {
File file = new File(shapName);
ShapeFile esriShapeFile = new ShapeFile(file);
ShapefileWorkspaceFactory shapefileWorkspaceFactory = new ShapefileWorkspaceFactory();
}catch (Exception e) {
e.printStackTrace();
}*/
Envelope envelop = new Envelope();
envelop.setCoords(xMin, xMax, yMin, yMax);
/*Envelope env = new Envelope();
Envelope NewEnv = new Envelope();
for (int i:graphicsLayerLines.getGraphicIDs()){
Polyline p = (Polyline)graphicsLayerLines.getGraphic(i).getGeometry();
p.queryEnvelope(env);
NewEnv.merge(env);
}
for (int i:graphicsLayerPoints.getGraphicIDs()){
Point p = (Point)graphicsLayerPoints.getGraphic(i).getGeometry();
p.queryEnvelope(env);
NewEnv.merge(env);
}*/
return envelop;
}
}
3) main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
tools:context=".ArcGisActivity" >
<com.esri.android.map.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
initExtent = "-1.3296373526814876E7 3930962.41823043 -1.2807176545789773E7 4201243.7502468005">
</com.esri.android.map.MapView>
</LinearLayout>
4)<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="arc.gis"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="10" android:maxSdkVersion="17"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".ArcGisActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Download the library from the website arcggismappming.........
No comments:
Post a Comment