ArcGIS создать буфер с помощью GeometryServer в Android
Я пытаюсь создать буфер вокруг точки, используя этот сервис ArcGIS в Android:
http://tasks.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer
и я хотел бы создать буфер программно, используя это:
http://tasks.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer/buffer
Это для школьной работы, поэтому это должен быть сервис, а API должен быть ArcGIS SDK 10.1.1
К сожалению, документации по этому поводу немного. Все, что я знаю, это то, что в определенный момент я должен получить объект Polygon, который я добавлю на карту.
Что мне нужно знать, так это (иметь смысл), как позвонить в службу, передать необходимые параметры и получить полигон.
Спасибо
2 ответа
На вашем месте я бы пропустил GeometryServer и использовал бы GeometryEngine.buffer (Geometry, SpatialReference, double, Unit). Вам не нужно вызывать услугу таким образом. Это правильный способ сделать это.
Однако, если для вашего школьного задания вам необходимо позвонить в службу, перейдите в службу и нажмите на ссылку с надписью API Reference, чтобы открыть документацию для GeometryServer. Вам придется использовать f=json и работать с JSON. GeometryEngine предлагает вам методы geometryToJson и jsonToGeometry, но вы также можете использовать библиотеку JSON, если хотите. Если вы не знаете, как открыть URL-соединение в коде Android/Java, воспользуйтесь Google.
Я использую MapBox, и мне пришлось создать буферную область поверх многоугольника на карте. Я не использовал ArcGis, а использовал библиотеку от vividsolutions
Ссылка на репозиторий Git: https://github.com/RanaRanvijaySingh/MapBoxDemo
Добавление в файл build.gradle
dependencies {
...
compile 'com.vividsolutions:jts:1.13'
}
В MainActivity я взял многоугольник со следующими точками:
final List<LatLng> latLngPolygon = new ArrayList<>();
{
latLngPolygon.add(new LatLng(28.6139, 77.2090));//delhi
latLngPolygon.add(new LatLng(22.2587, 71.1924));//gujarat
latLngPolygon.add(new LatLng(18.5204, 73.8567));//pune
latLngPolygon.add(new LatLng(12.9716, 77.5946));//banglore
latLngPolygon.add(new LatLng(25.5941, 85.1376));//patna
//this is needed to completed a covered area, without this it would not work
latLngPolygon.add(new LatLng(28.6139, 77.2090));//delhi
}
ниже представлена функция создания полигона и буферизованного полигона на вашей карте
/**
* Function is called on click of Buffer Example button
*
* @param view View
*/
public void onClickBufferExample(View view) {
//Initialize geometry factory object to get Geometry object.
geometryFactory = new GeometryFactory();
//Create geometry object using your own lat lang points
//TODO : latLngPolygon - Used in this example is to show a bigger picture. Replace it
//TODO : with your requirement.
Geometry geometryOriginal = getGeometryForPolygon(latLngPolygon);
//Draw polygon on map
createPolygon(geometryOriginal);
/**
* Create geometry object with given buffer distance
* Now buffer distance will vary on your requirement
* Range could be anything
* Hit and try
*/
Geometry geometryBuffered = geometryOriginal.buffer(1);
//Draw buffer polygon
createPolygon(geometryBuffered);
}
/**
* Function to get Geometry object (Class from vividsolutions)
* from given list of latlng
*
* @param bounds List
* @return Geometry (Class from vividsolutions)
*/
public Geometry getGeometryForPolygon(List<LatLng> bounds) {
List<Coordinate> coordinates = getCoordinatesList(bounds);
if (!coordinates.isEmpty()) {
return geometryFactory.createPolygon(getLinearRing(coordinates), null);
}
return null;
}
/**
* Function to create a list of coordinates from a list of lat lng
*
* @param listLatLng list<LatLng>
* @return List<Coordinate> (Class from vividsolutions)
*/
private List<Coordinate> getCoordinatesList(List<LatLng> listLatLng) {
List<Coordinate> coordinates = new ArrayList<>();
for (int i = 0; i < listLatLng.size(); i++) {
coordinates.add(new Coordinate(
listLatLng.get(i).getLatitude(), listLatLng.get(i).getLongitude()));
}
return coordinates;
}
/**
* Function to create a polygon on the map
*
* @param geometry Geometry Class from vividsolutions
*/
private void createPolygon(Geometry geometry) {
LatLng[] points = getPoints(geometry.getCoordinates());
mapboxMap.addPolyline(new PolylineOptions()
.add(points)
.width(4)
.color(Color.parseColor("#FF0000")));
}
/**
* Function to convert array of Coordinates (Class from vividsolutions)
* to Android LatLng array
*
* @param coordinates Coordinates (Class from vividsolutions)
* @return LatLng[]
*/
@NonNull
private LatLng[] getPoints(Coordinate[] coordinates) {
List<LatLng> listPoints = new ArrayList<>();
for (Coordinate coordinate : coordinates) {
listPoints.add(new LatLng(coordinate.x, coordinate.y));
}
return listPoints.toArray(new LatLng[listPoints.size()]);
}
/**
* Function to create LinearRing (Class from vividsolutions) from a list of
* Coordinate (Class from vividsolutions)
*
* @param coordinates List
* @return LinearRing
*/
@NonNull
private LinearRing getLinearRing(List<Coordinate> coordinates) {
return new LinearRing(getPoints(coordinates), geometryFactory);
}
/**
* Function to get points of CoordinateArraySequence (Class from vividsolutions)
*
* @param coordinates List (Class from vividsolutions)
* @return CoordinateArraySequence (Class from vividsolutions)
*/
@NonNull
private CoordinateArraySequence getPoints(List<Coordinate> coordinates) {
return new CoordinateArraySequence(getCoordinates(coordinates));
}
/**
* Function to get coordinates array from a list of coordinates
*
* @param coordinates List<Coordinate> (Class from vividsolutions)
* @return Coordinate [] (Class from vividsolutions)
*/
@NonNull
private Coordinate[] getCoordinates(List<Coordinate> coordinates) {
return coordinates.toArray(new Coordinate[coordinates.size()]);
}
СДЕЛАННЫЙ.
идти вперед рефакторинг, как вы хотите, но это все.