我有一个定义形状的shapefile来覆盖城市。我还有一组由纬度和经度定义的坐标。
我需要能够确定这些点是否在shapefile中的任何形状内。
目前我正在尝试使用easygis.net来解决这个问题,但它似乎没有用。
我相信shapefile中的坐标是UTM,但偏移为北,我不知道如何纠正它,将其转换为纬度/经度,或转换我的纬度/经度对匹配。
我一直在寻找像dotpatial和sharpmap这样的其他库,但我没有看到问题的直观答案。
与此同时,我确信这是一个已经解决的问题。是否有任何库可以轻松完成此操作?或者我如何将地图的偏移UTM转换为纬度/经度,或者我的纬度/经度点转换为此偏移量UTM?
答案 0 :(得分:7)
以下是一些示例代码,介绍如何使用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;
}
答案 1 :(得分:3)
或者如何将地图的偏移UTM转换为纬度/经度,或者将我的纬度/经度转换为此偏移量UTM?
这需要重新投影你的点(或shapefile的数据)。这可以通过Proj4Net完成(除非您的GIS已经支持它)。
一旦完成,那么它就是多边形测试中的一个点。有many options for this,但我经常使用winding number method。
答案 2 :(得分:0)
如果您只需要将投影文件转换为地理坐标,那么Qgis是我认为最简单的工具,它是一款轻量级的基于GRASS的免费开放GIS软件。使用直接投影工具。 http://www.qgis.org/