如何确定一个点是否在形状文件中的形状内

本文关键字:文件 是否 何确定 一个 | 更新日期: 2023-09-27 18:16:13

我有一个shapefile来定义覆盖城市的形状。我还有一组由纬度和经度定义的坐标。

我需要能够确定这些点是否在shapefile中的任何形状内。

目前我正试图使用easygis.net来解决这个问题,但它似乎不工作。

我相信shapefile中的坐标是在UTM中,但有一个偏移量,我不知道如何纠正它,将其转换为lat/long,或转换为lat/long对以匹配。

我一直在寻找其他库,如dotspatial和sharpmap,但我没有看到直观的答案来解决这个问题。

同时,我确信这个问题已经解决了。有什么库可以很容易地做到这一点吗?或者我如何将映射的偏移UTM转换为lat/long,或者我的lat/long点转换为这个偏移UTM?

如何确定一个点是否在形状文件中的形状内

下面是一些示例代码,说明如何使用DotSpatial首先处理重投影,然后使用Contains方法测试点是否在多边形中。

    public bool PointInShape() {
        // Load a shapefile.  If the shapefile is already using your custom projection, we don't need to change it.
        Shapefile wierdShapefile = Shapefile.OpenFile("C:''MyShapefile.shp");
        // Note, if your shapefile with custom projection has a .prj file, then we don't need to mess with defining the projection.
        // If not, we can define the projection as follows:
        // First get a ProjectionInfo class for the normal UTM projection
        ProjectionInfo pInfo = DotSpatial.Projections.KnownCoordinateSystems.Projected.UtmNad1983.NAD1983UTMZone10N;
        // Next modify the pINfo with your custom False Northing
        pInfo.FalseNorthing = 400000;
        wierdShapefile.Projection = pInfo;
        // Reproject the strange shapefile so that it is in latitude/longitude coordinates
        wierdShapefile.Reproject(DotSpatial.Projections.KnownCoordinateSystems.Geographic.World.WGS1984);
        // Define the WGS84 Lat Lon point to test
        Coordinate test = new Coordinate(-120, 40);
        foreach (Feature f in wierdShapefile.Features) {
            Polygon pg = f.BasicGeometry as Polygon;
            if (pg != null)
            {
                if (pg.Contains(new Point(test)))
                {
                    // If the point is inside one of the polygon features
                    return true;
                }
            }
            else {
                // If you have a multi-part polygon then this should also handle holes I think
                MultiPolygon polygons = f.BasicGeometry as MultiPolygon;
                if (polygons.Contains(new Point(test))) {
                    return true;
                }
            }
        }
        return false;
    }

或者我如何将映射的偏移UTM转换为lat/long,或者我的lat/long点到这个偏移UTM?

这需要重新投影点(或shapefile的数据)。这可以通过Proj4Net来完成(除非你的GIS已经支持它)。

一旦完成,那么它就是多边形测试中的一个点。有很多选择,虽然我经常使用圈数方法。

如果您只需要将投影文件转换为地理坐标,那么在我看来,Qgis是最容易使用的工具,它是一个轻量级的基于GRASS的GIS软件,免费开放。用直接的投影工具。http://www.qgis.org/