首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在GeometricShapeFactory中使用geoTools创建地图上的圆圈

如何在GeometricShapeFactory中使用geoTools创建地图上的圆圈
EN

Stack Overflow用户
提问于 2017-05-29 20:30:23
回答 2查看 6.6K关注 0票数 1

我目前正在使用下面的代码来创建一个GeoJson多边形。这给了我一个糟糕的循环,这是无效的.

在这种情况下,RADIUS = 1609.34,这是1英里米。

代码语言:javascript
运行
复制
        public  GeoJsonPolygon createRadiusPolygon(  Point point,double RADIUS) {       

              GeometricShapeFactory shapeFactory = new GeometricShapeFactory();
              shapeFactory.setNumPoints(32);
              shapeFactory.setCentre(new com.vividsolutions.jts.geom.Coordinate(point.getX(), point.getY()));
              shapeFactory.setSize(RADIUS * 2);
              com.vividsolutions.jts.geom.Geometry circle = shapeFactory.createCircle();
              List<Point> points = new ArrayList<Point>();
                for (com.vividsolutions.jts.geom.Coordinate coordinate : circle.getCoordinates()) {
                    Point lngLatAtl = new Point(coordinate.x, coordinate.y);
                    points.add(lngLatAtl);
                }
                Collections.reverse(points);
                return new GeoJsonPolygon(points);
            }

参考:http://docs.geotools.org/stable/userguide/library/jts/geometry.html

目前,如果我使用点(-73.87,40.84)半径= 1609.34,我得到以下链接。https://gist.githubusercontent.com/VanitySoft/56c4ce0f5c1c7e7fe0461ed46fd5ed11/raw/94544750a140d81780ebe9206395a21ab88bb1f7/circle

来自@Ian的===SOLVED==:在他的答案中使用方法。半径是以英里为单位的,用来创建GeoJson的圆圈。

代码语言:javascript
运行
复制
...
  com.vividsolutions.jts.geom.Point jtsPoint =  new GeometryFactory().createPoint(new com.vividsolutions.jts.geom.Coordinate(point.getY(), point.getX()));
                  javax.measure.Measure measure = Measure.valueOf(RADIUS, NonSI.MILE);
                  com.vividsolutions.jts.geom.Geometry circle = createCircleRadis(measure,CRS.decode("epsg:4326"),jtsPoint );
...

..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-30 07:58:16

你的输出圆是有效的,它刚好超过地球表面的直径,所以你的地理信息系统可能有绘制它的问题!问题是,你不分青红皂白地混合了度和米,而GeoTools不知道你想要它做什么。

您需要将有关点的坐标参考系统的一些信息添加到程序中,如果该投影是地理的(即度数),则将问题转换为以米为单位的投影。

代码语言:javascript
运行
复制
public Geometry bufferPoint(Measure<Double, Length> distance, CoordinateReferenceSystem origCRS, Geometry geom) {
    Geometry pGeom = geom;
    MathTransform toTransform, fromTransform = null;
    // reproject the geometry to a local projection
    Unit<Length> unit = distance.getUnit();
    if (!(origCRS instanceof ProjectedCRS)) {

      double x = geom.getCoordinate().x;
      double y = geom.getCoordinate().y;

      String code = "AUTO:42001," + x + "," + y;
      // System.out.println(code);
      CoordinateReferenceSystem auto;
      try {
        auto = CRS.decode(code);
        toTransform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, auto);
        fromTransform = CRS.findMathTransform(auto, DefaultGeographicCRS.WGS84);
        pGeom = JTS.transform(geom, toTransform);
        unit = SI.METER;
      } catch (MismatchedDimensionException | TransformException | FactoryException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }

    } else {
      unit = (Unit<Length>) origCRS.getCoordinateSystem().getAxis(0).getUnit();

    }


    // buffer
    Geometry out = pGeom.buffer(distance.doubleValue(unit));
    Geometry retGeom = out;
    // reproject the geometry to the original projection
    if (!(origCRS instanceof ProjectedCRS)) {
      try {
        retGeom = JTS.transform(out, fromTransform);

      } catch (MismatchedDimensionException | TransformException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
    return retGeom;
  }

AUTO:42001,x,y是一个特殊的投影,集中在以米为单位的点x,y上,它允许我们使用JTS buffer方法,这比您使用的圆操作更容易。

对于你的输入,这给了我一个椭圆在纽约,注意,这是预期的,是由于扭曲的影响,使用非投影的Lat/Lon坐标在一个弯曲的地球。

您可以使用以下方法将其称为:

代码语言:javascript
运行
复制
//Measure<Double, Length> dist = Measure.valueOf(50.0, SI.KILOMETER);
Measure<Double, Length> dist = Measure.valueOf(1.0, NonSI.MILE);
GeometryFactory gf = new GeometryFactory();
Point p = gf.createPoint(new Coordinate(-73.87,40.84));
buf.bufferPoint(dist, DefaultGeographicCRS.WGS84, p);

票数 4
EN

Stack Overflow用户

发布于 2018-10-17 14:19:13

代码语言:javascript
运行
复制
    double latitude = 40.689234d;
    double longitude = -74.044598d;
    double diameterInMeters = 2000d; //2km

    GeometricShapeFactory shapeFactory = new GeometricShapeFactory();
    shapeFactory.setNumPoints(64); // adjustable
    shapeFactory.setCentre(new Coordinate(latitude, longitude));
    // Length in meters of 1° of latitude = always 111.32 km
    shapeFactory.setWidth(diameterInMeters/111320d);
    // Length in meters of 1° of longitude = 40075 km * cos( latitude ) / 360
    shapeFactory.setHeight(diameterInMeters / (40075000 * Math.cos(Math.toRadians(latitude)) / 360));

    Polygon circle = shapeFactory.createEllipse();

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44249945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档