如何在java上创建正六边形以放在地图上?

Ant*_*nte 4 java gis coordinates hexagonal-tiles geotools

我正在尝试创建规则的六边形多边形,但是当在地图上可视化时,它们会垂直拉伸。

我就是这样做的:

List<Geometry> hexagons = new ArrayList<>();
        CoordinateReferenceSystem sourceCRS = DefaultGeographicCRS.WGS84;
        ReferencedEnvelope gridBounds = new ReferencedEnvelope(box[0], box[2], box[1], box[3], sourceCRS);
        double sideLen = 0.1;
        GridFeatureBuilder builder = new DefaultGridFeatureBuilder();
        SimpleFeatureSource grid = Hexagons.createGrid(gridBounds, sideLen, HexagonOrientation.FLAT, builder);
        try{
            SimpleFeatureCollection collection = grid.getFeatures();
            FeatureIterator iterator = collection.features();
            while (iterator.hasNext()){
                Feature feature = iterator.next();
                SimpleFeature sFeature = (SimpleFeature) feature;
                
                Geometry geometry = (Geometry) sFeature.getAttribute(0);
                hexagons.add(geometry);
            }

        } catch(Exception e){
            e.printStackTrace();
        }
        return hexagons;
Run Code Online (Sandbox Code Playgroud)

这

就是它在地图上的样子。我尝试将方向从“平面”更改为“角度”,但这并没有解决问题。

Ian*_*ton 7

你已经被地球是圆的而不是平的所吸引了。

您要求六边形以纬度/经度或 EPSG:4326 为单位,如果您在该投影中显示它们,那么它们看起来会很好:

在此输入图像描述

但是,当您将地图重新​​投影到伪墨卡托 (EPSG:3857) 时,它们(以及地图的其余部分)会被拉伸,越往北走,情况就越糟糕。

在此输入图像描述

如果您想要在拉伸地图上未拉伸的六边形,那么您需要在该投影中生成它们,如下所示:

    List<Geometry> hexagons = new ArrayList<>();
    CoordinateReferenceSystem sourceCRS = DefaultGeographicCRS.WGS84;
    ReferencedEnvelope
            gridBounds = new ReferencedEnvelope(-5,5,50,60, sourceCRS);
    ReferencedEnvelope nGridBounds = gridBounds.transform(CRS.decode("EPSG:3857"),true);
    double sideLen = 100000.0;
    GridFeatureBuilder builder = new DefaultGridFeatureBuilder();
    SimpleFeatureSource
            grid = Hexagons.createGrid(nGridBounds, sideLen, HexagonOrientation.FLAT, builder);
Run Code Online (Sandbox Code Playgroud)

我将边界框更改为 EPSG:3857,并将边长更改为 100Km。

在此输入图像描述

一般来说,EPSG:3857 是一个不好的投影,无法进行任何分析(或除网络地图之外的任何内容),因此您可能需要为您的研究领域选择更好的投影。