2013-03-26 4 views
3

Я использую библиотеку Java GeoTools для некоторых геометрических вычислений. В моем случае я использую файл формы, который содержит все соседние мультиполигоны определенного города. Я хотел бы знать все возможные координаты в этом городе, в каком районе это соответствует. Таким образом, мой подход просто петляет по всем мультиполигонам окрестности и проверяет, находится ли данная точка внутри них или нет. Вот часть указанного кода:Geotools - Создать точку

public String getNeighborhoodId(Coordinates c){ 
    for(Feature f : neighborhoods){ 
     MultiPolygon m = (MultiPolygon) f.getProperty("geometry").getValue(); 

     GeometryBuilder builder = new GeometryBuilder(DefaultGeographicCRS.WGS84); 
     Point p = builder.createPoint(c.getLat(),c.getLng()); 

     if(m.contains((Geometry) point)){ 
      return f.getProperty("neighborhoodId").getValue().toString(); 
     } 
    } 
    return ""; 
} 

Где микрорайоны все функции ранее прочитанных из файла формы. Проблема заключается в том, что на этой линии:

Point p = builder.createPoint(c.getLat(),c.getLng()); 

Я получаю org.geotools.factory.FactoryNotFoundException: No factory of kind "PrimitiveFactory" found.

Я просто следовал документы без особого успеха (This подход не работает ни). Обратите внимание, что я использую 9-SNAPSHOT версию GeoTools.

Любые предложения о том, как избавиться от этой проблемы?

ответ

2

Ну, я, наконец, узнал, возможное решение. Прежде всего, я должен сказать, что допустил ошибку, так как мои точки мультиполигона были в UTM, а не в формате WGS84, поэтому потребовалось предыдущее преобразование. С другой стороны, я думаю, что я использовал неправильную версию GeometryFactory класса, как и раньше мой процесс рефакторинга на моем коде, я не был в состоянии создать его экземпляр следующим образом:

public String getNeighborhoodId(Coordinates c){ 
    GeometryFactory geometryFactory = new GeometryFactory(); 
    String utm = converter.latLon2UTM(c.getLat(), c.getLng()); 
    Coordinate coords = new Coordinate(Double.valueOf(utm.split(" ")[2]),Double.valueOf(utm.split(" ")[3])); 
    Geometry point = geometryFactory.createPoint(coords); 
    for(Feature f : neighborhoods){ 
     MultiPolygon m = (MultiPolygon) f.getProperty("geometry").getValue(); 
     if(m.contains(point)){ 
      return f.getProperty("neighborhoodId").getValue().toString(); 
     } 
    } 
    return ""; 
} 
0

Создание точки

Очки являются строительными блоками для большинства других геометрий. В следующих разделах объясняется, как манипулировать Точками:

Есть несколько способов создания точки. GeometryBuilder имеет множество полезных методов для создания геометрий, поэтому вам не нужно беспокоиться о фабриках. Но вы также можете напрямую использовать фабрики, или вы также можете использовать парсер WKT для создания точек.

Существует несколько методов createPoint, предоставляемых как часть GeometryBuilder. Вот пример, используя один из них:

GeometryBuilder builder = new GeometryBuilder(DefaultGeographicCRS.WGS84); 
Point point = builder.createPoint(48.44, -123.37); 

Использование Фабрики В некоторых средах вы ограничены только с помощью формального GT-OpenGIS интерфейсов, вот пример использования PositionFactory и PrimitiveFactory как:

Hints hints = new Hints(Hints.CRS, DefaultGeographicCRS.WGS84); 
PositionFactory positionFactory = GeometryFactoryFinder.getPositionFactory(hints); 
PrimitiveFactory primitiveFactory = GeometryFactoryFinder.getPrimitiveFactory(hints); 

DirectPosition here = positionFactory.createDirectPosition(new double[]{48.44, -123.37}); 

Point point1 = primitiveFactory.createPoint(here); 

PositionFactory has a helper method allowing you to save one step: 

Hints hints = new Hints(Hints.CRS, DefaultGeographicCRS.WGS84); 
PrimitiveFactory primitiveFactory = GeometryFactoryFinder.getPrimitiveFactory(hints); 

Point point2 = primitiveFactory.createPoint( new double[]{48.44, -123.37}); 

System.out.println(point2); 

Использование WKT Вы можете использовать WKTParser создать точку из хорошо известного текста:

WKTParser parser = new WKTParser(DefaultGeographicCRS.WGS84); 
Point point = (Point) parser.parse("POINT(48.44 -123.37)"); 

Вы также можете создать WKTParser использовать определенный набор заводов:

Hints hints = new Hints(Hints.CRS, DefaultGeographicCRS.WGS84); 

PositionFactory positionFactory = GeometryFactoryFinder.getPositionFactory(hints); 
GeometryFactory geometryFactory = GeometryFactoryFinder.getGeometryFactory(hints); 
PrimitiveFactory primitiveFactory = GeometryFactoryFinder.getPrimitiveFactory(hints); 
AggregateFactory aggregateFactory = GeometryFactoryFinder.getAggregateFactory(hints); 

WKTParser parser = new WKTParser(geometryFactory, primitiveFactory, positionFactory, aggregateFactory); 

Point point = (Point) parser.parse("POINT(48.44 -123.37)"); 
+1

Я могу читать документы, а также, спасибо. И, как сказано, я фактически преследую их без особого успеха. Я пытаюсь найти более обоснованное объяснение моей проблемы. – jarandaf

+0

Прямая копия http://docs.geotools.org/latest/userguide/unsupported/geometry/build.html – jonayreyes

2

У меня был аналогичный проблема. Проследив через стек, я обнаружил, что для GeometryBuilder() не найдено геометрийных заводов. Если нет фабрик, GeometryBuilder выбрасывает фабрику «< ваш заводской тип здесь >» исключение. Решение находится на уровне http://docs.geotools.org/latest/userguide/unsupported/geometry/index.html. Этот плагин включает в себя фабрики, необходимые для использования классов org.geotools.geometry.

Я работаю с GeoTools 11,0 на Затмении

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