Шейп-файл, который перепроектирован с использованием многоточия, отличается от исходного - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть шейп-файл с EPSG: 32749, который будет вставлен в базу данных Oracle и отображен в геосервере.Перед этим я хочу перепроецировать свой шейп-файл в ESPG: 4326, используя библиотеку точек, вот мой код

var EXTRACTED_NAME = Server.MapPath("~/upload/shp/example/");
string shapeFilePath = @"\example.shp";
shapeFilePath = EXTRACTED_NAME + shapeFilePath;
Shapefile indexMapFile = Shapefile.OpenFile(shapeFilePath);
indexMapFile.Reproject(KnownCoordinateSystems.Geographic.World.WGS1984);

Но при предварительном просмотре в геосервере мой шейп-файл отображается следующим образом, когда исходный шейп-файл, такой как

enter image description here

enter image description here

И мой вопрос, почему шейп-файл, который воспроизводится в EPSG 4326, отличается от оригиналаодин?

Спасибо

1 Ответ

0 голосов
/ 06 марта 2019

Это немного поздно, но вы должны быть в состоянии получить доступ к внутренним кольцам из геометрии.Возможно, вам понадобится преобразовать IGeometry в IPolygon для конкретной работы с внутренними кольцами, а не просто как getGeometryN.Следующий код еще не был протестирован, но, по крайней мере, он должен указать вам правильное направление.

Shapefile file = Shapefile.OpenFile(@"D:\Data\Counties\Counties.shp");
foreach(Feature f in file.Features){
    if(f.Geometry is IPolygon){
        IPolygon p = (IPolygon)f.Geometry;
        Debug.WriteLine("Feature " + f.Fid + "\n");
        foreach(ILineString innerRing in p.InteriorRings){
            // Do stuff with your innerRing
            Debug.WriteLine("Ring length : " + innerRing.Length);
        }
    }
    if (f.Geometry is IMultiPolygon)
    {
        IMultiPolygon multi = (IMultiPolygon)f.Geometry;
        for (int i = 0; i < multi.NumGeometries; i++)
        {
            IGeometry g = multi.GetGeometryN(i);
            if (g is IPolygon)
            {
                IPolygon p = (IPolygon)g;
                foreach (ILineString innerRing in p.InteriorRings)
                {
                    // Do stuff with your innerRing
                }
            }

        }

    }

}
...