android - ArcGIS 在 android 中使用 GeometryServer 创建缓冲区

标签 android buffer point arcgis arcgis-server

我正在尝试使用此 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 对象,我会将其添加到 map 中。

我需要知道的是(有重点)如何调用服务,传递所需的参数并获取多边形。

谢谢

最佳答案

我正在使用 MapBox 并且我必须在 map 上的一个多边形 之上创建一个缓冲区域。我没有使用 ArcGis,而是使用了 vividsolutions 的库
Git repo 链接: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
    }

下面是在 map 上创建多边形和缓冲多边形的函数

/**
 * 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()]);
}

完成。
按照您想要的方式进行重构,仅此而已。

关于android - ArcGIS 在 android 中使用 GeometryServer 创建缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19620847/

相关文章:

node.js - 为什么 isBuffer 对于不编码的 fs.readFileSync 调用返回 false

c++ - 排序具有特定结构的数据包缓冲区

c# - 有Point3D吗?

android - Opengl Es 线宽

java - 错误 :Execution failed for task ':lib:compileReleaseAidl' . > Executor Singleton 未启动

c - scanf 什么时候开始和停止扫描?

sql-server - SQL Server - 来自点几何的线串

c++ - 为什么存储整数的内存块的值会反复变化?

android - 未能安装以下 Android SDK 包,因为某些许可证未被接受。- 20.1.5948944 NDK(并排)20.1.5948944

java - 如何禁用 Intent 的后按操作?