0

グーグルアース上に格子を作る公式を作りました。緯度と経度の交点を取得したい。交差点を取得する方法を教えてください.KMLの生成にSharpKML libを使用しています

for (int x = 90; x >= 0; x = x - 15)
                {
                    Placemark placemark = new Placemark();
                    LineString line = new LineString();
                    CoordinateCollection co = new CoordinateCollection();
                    for (int i = 0; i <= 180; i = i + 15)
                    {
                        Vector cords = new Vector()
                            {
                                Latitude = x,
                                Longitude = i,
                                Altitude = 1000
                            };

                        co.Add(cords);
                    }
                    for (int i = -180; i <= 0; i = i + 15)
                    {
                        Vector cords = new Vector()
                        {
                            Latitude = x,
                            Longitude = i,
                            Altitude = 1000
                        };

                        co.Add(cords);
                    }
                    line.Coordinates = co;
                    placemark.Geometry = line;
                    document.AddFeature(placemark);
                }
            for (int x = -90; x <= 0; x = x + 15)
            {
                Placemark placemark = new Placemark();
                LineString line = new LineString();
                CoordinateCollection co = new CoordinateCollection();
                for (int i = 0; i <= 180; i = i + 15)
                {
                    Vector cords = new Vector()
                    {
                        Latitude = x,
                        Longitude = i,
                        Altitude = 1000
                    };

                    co.Add(cords);
                }
                for (int i = -180; i <= 0; i = i + 15)
                {
                    Vector cords = new Vector()
                    {
                        Latitude = x,
                        Longitude = i,
                        Altitude = 1000
                    };

                    co.Add(cords);
                }
                line.Coordinates = co;
                placemark.Geometry = line;
                document.AddFeature(placemark);
            }

            for (int i = 0; i <= 180; i = i + 15)
            {
                Placemark placemark = new Placemark();
                LineString line = new LineString();
                CoordinateCollection co = new CoordinateCollection();
                for (int x = 0; x <= 90; x = x + 15)
                {
                    Vector cords = new Vector()
                    {
                        Latitude = x,
                        Longitude = i,
                        Altitude = 1000
                    };

                    co.Add(cords);
                }
                for (int x = -90; x <= 0; x = x + 15)
                {
                    Vector cords = new Vector()
                    {
                        Latitude = x,
                        Longitude = i,
                        Altitude = 1000
                    };

                    co.Add(cords);
                }
                line.Coordinates = co;
                placemark.Geometry = line;
                document.AddFeature(placemark);
            }
            for (int i = -180; i <= 0; i = i + 15)
            {
                Placemark placemark = new Placemark();
                LineString line = new LineString();
                CoordinateCollection co = new CoordinateCollection();
                for (int x = 0; x <= 90; x = x + 15)
                {
                    Vector cords = new Vector()
                    {
                        Latitude = x,
                        Longitude = i,
                        Altitude = 1000
                    };

                    co.Add(cords);
                }
                for (int x = -90; x <= 0; x = x + 15)

                {
                    Vector cords = new Vector()
                    {
                        Latitude = x,
                        Longitude = i,
                        Altitude = 1000
                    };

                    co.Add(cords);
                }
                line.Coordinates = co;
                placemark.Geometry = line;
                document.AddFeature(placemark);
            }
4

2 に答える 2

1

C# を使用して、任意の LineString オブジェクトとグリッドとの交点を見つける方法を質問する場合、マシューは正しいです。C++ では GEOS http://trac.osgeo.org/geos/を Java で使用できます。これは JTS http://www.vividsolutions.com/jts/JTSHome.htmになります。

ただし、自分でグリッドを作成していて、作成したばかりのグリッドの水平線と垂直線の間の交点をどのように見つけるかというはるかに単純な質問への答えが必要な場合、答えは同じ正確なものを使用することですネストされたループで LineStrings に使用した緯度、経度の値:

Document document = new Document();
for(y = -90; y < 0; y += 15){
  for(x = -180; x < 0; x+= 15){
     Point point = new Point();
     point.Coordinate = new Vector(x, y);
     Placemark placemark = new Placemark();
     placemark.Geometry = point;
     document.AddFeature(placemark);
  }
}

    .. repeat for the other 4 quadrants

// It's conventional for the root element to be Kml,
// but you could use document instead.
Kml root = new Kml();
root.Feature = document;
XmlFile kml = KmlFile.Create(root, false);

たとえば、DotSpatial を使用してグリッドとシェープファイルの交点を見つけたい場合のソース コードを次に示します。この場合、シェープファイルには川の線があり、交点は 1 つだけ生成されます。トポロジ インターセクションのコードは少し遅いので、範囲チェックを使用して高速化することをお勧めします。あなたの場合、シェープファイルを開くのではなく、KMLSharp を使用して kml ソース ファイルのラインストリング座標を読み取ることにより、新しい機能を構築することをお勧めしますが、交差コードは似ています。

余談ですが、一見簡単に使用できる FeatureSet.Intersection メソッドは、線の交点がポイント フィーチャを交点として生成するケースを処理するほどスマートではないと思います。出力が入力と同じフィーチャ タイプである可能性が高いポイントまたはポリゴンに対してのみ機能します。

    using DotSpatial.Controls;
    using DotSpatial.Data;
    using DotSpatial.Topology;
    using DotSpatial.Symbology;


    private FeatureSet gridLines;

    private void buttonAddGrid_Click(object sender, EventArgs e)
    {
        gridLines = new FeatureSet(FeatureType.Line);
        for (int x = -180; x < 0; x += 15)
        {
            List<Coordinate> coords = new List<Coordinate>();
            coords.Add(new Coordinate(x, -90));
            coords.Add(new Coordinate(x, 90));
            LineString ls = new LineString(coords);
            gridLines.AddFeature(ls);
        }
        for (int y = -90; y < 0; y += 15)
        {
            List<Coordinate> coords = new List<Coordinate>();
            coords.Add(new Coordinate(-180, y));
            coords.Add(new Coordinate(180, y));
            LineString ls = new LineString(coords);
            gridLines.AddFeature(ls);
        }

        map1.Layers.Add(new MapLineLayer(gridLines));
    }

    private void buttonIntersect_Click(object sender, EventArgs e)
    {
        if (gridLines == null)
        {
            MessageBox.Show("First add the grid.");
        }

        IFeatureSet river = FeatureSet.Open(@"C:\Data\Rivers\River.shp");
        MapLineLayer riverLayer = new MapLineLayer(river);
        map1.Layers.Add(river);




        List<DotSpatial.Topology.Point> allResultPoints = new List<DotSpatial.Topology.Point>();
        foreach (Feature polygon in river.Features)
        {
            Geometry lineString = polygon.BasicGeometry as Geometry;
            foreach (Feature lineFeature in gridLines.Features)
            {
                // Speed up calculation with extent testing.
                if(!lineFeature.Envelope.Intersects(lineString.Envelope)){
                    continue;
                }
                IFeature intersectFeature = lineFeature.Intersection(lineString);
                if (intersectFeature == null)
                {
                    continue;
                }


                MultiPoint multi = intersectFeature.BasicGeometry as MultiPoint;
                if (multi != null)
                {
                    for(int i = 0; i < multi.NumGeometries; i++)
                    {
                        allResultPoints.Add(intersectFeature.GetBasicGeometryN(i) as DotSpatial.Topology.Point);
                    }
                }
                DotSpatial.Topology.Point single = intersectFeature.BasicGeometry as DotSpatial.Topology.Point;
                {
                    allResultPoints.Add(single);
                }
            }
        }

        FeatureSet finalPoints = new FeatureSet(FeatureType.Point);
        foreach(DotSpatial.Topology.Point pt in allResultPoints){
            finalPoints.AddFeature(pt);
        }
        map1.Layers.Add(new MapPointLayer(finalPoints));
    }
于 2014-02-11T16:42:44.810 に答える
0

私は DotSpatial ライブラリがあなたのニーズを満たすべきだと思います.私は過去にこのライブラリを使用しましたが、交差点関数を利用していません:

http://dotspatial.codeplex.com/wikipage?title=DotSpatial.Data.FeatureSetExt.Intersection

独自の線交点分析を試みる場合は、単純化されたデカルト平面アプローチではエラーが発生することを知っておいてください (これは、極に近づくにつれてより明白になると思います)。

ここを参照してください: http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html

そしてここ: 2 つの地理的境界線の交点

于 2014-02-10T21:51:59.177 に答える