2013-05-31 2 views
5

У меня есть shapefile, определяющий формы для покрытия города. У меня также есть набор координат, определяемый широтой и долготой.Как определить, находится ли точка в форме в шейп-файле?

Мне нужно определить, находятся ли эти точки в пределах любой формы в шейп-файле.

В настоящее время я пытаюсь использовать easygis.net, чтобы понять это, но он, похоже, не работает.

Я считаю, что координаты в шейп-файле находятся в UTM, но имеют смещение на север, и я не знаю, как исправить это, перевести его на lat/long или преобразовать мои пары lat/long для соответствия.

Я смотрел на другие библиотеки, такие как dotspatial и sharpmap, но я не вижу интуитивного ответа на проблему.

В то же время, я уверен, что это проблема, которая была решена. Есть ли библиотеки, которые делают это легко? Или как мне преобразовать сдвиг UTM карты в lat/long, или мой lat/long указывает на это смещение UTM?

+0

Вы данные для северного полушария или юга? –

+0

Северное полушарие. На восток кажется правильным, но на севере расположено место на расстоянии 1 градуса, что неверно. – Chris

ответ

2

Или как преобразовать смещение UTM карты в lat/long, или мои lat/long указывает на это смещение UTM?

Для этого требуется перепрофилирование ваших точек (или данных шейп-файла). Это можно сделать через Proj4Net (если ваша ГИС уже не поддерживает его).

Как только это будет сделано, это точка в полигоне. Есть many options for this, хотя я часто использую winding number method.

+0

Я довольно уверен, что это сработает, но у меня проблемы с преобразованием. Я прочитал в WKT из файла проекции, а затем создаю трансформатор из WGS84 для чтения в проецировании. Поп мой lat/long coords в трансформатор, и он должен работать. Правильно? Вместо этого я получаю уговоры, которые уходят. – Chris

0

Если вам нужно только преобразовать проецируемый файл в географическую координату, то Qgis - это самый простой инструмент, который, на мой взгляд, будет бесплатным и открытым. С прямыми проекционными инструментами. http://www.qgis.org/

+0

Спасибо. Я посмотрел, но я не уверен, что он соответствует моим требованиям. Я не вижу API на сайте, и я не вижу того, с чем я мог бы взаимодействовать с C#. Мне удалось получить эту работу с DotSpatial и Proj.Net. – Chris

6

Вот пример кода, как вы можете использовать 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; 
    } 
+0

Это довольно близко к тому, что я закончил. – Chris

+2

Cool =). Я хотел, чтобы другие люди наткнулись на это, чтобы иметь пример кода. Если скорость дает вам проблемы (например, медленная загрузка функций), я думаю, что вы можете выполнять тестирование Intersect с помощью самих фигур. Формы загружают только векторы и не требуют, чтобы шейп-файл считывал все атрибуты. – Ted

Смежные вопросы