Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 地理工具-创建点_Java_Geotools_Jts - Fatal编程技术网

Java 地理工具-创建点

Java 地理工具-创建点,java,geotools,jts,Java,Geotools,Jts,我正在使用GeoTools Java库进行一些几何计算。在我的例子中,我使用的是一个形状文件,其中包含某个城市的所有邻域多多边形。我想知道那个城市的每一个可能的坐标,它对应于哪个街区。因此,我的方法就是简单地在邻近的多个多边形上循环,并检查给定的点是否在这些多边形内。下面是一段提到的代码: public String getNeighborhoodId(Coordinates c){ for(Feature f : neighborhoods){ MultiPolygon

我正在使用GeoTools Java库进行一些几何计算。在我的例子中,我使用的是一个形状文件,其中包含某个城市的所有邻域多多边形。我想知道那个城市的每一个可能的坐标,它对应于哪个街区。因此,我的方法就是简单地在邻近的多个多边形上循环,并检查给定的点是否在这些多边形内。下面是一段提到的代码:

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:找不到“PrimitiveFactory”类型的工厂。

我只是简单地按照文档进行操作,但没有取得多大成功(这种方法也不起作用)。请注意,我使用的是GeoTools的9-SNAPSHOT版本

关于如何解决这个问题有什么建议吗?

创建一个点

点是大多数其他几何图形的构造块。以下各节介绍了如何操纵点:

有几种方法可以用来创建点。GeometryBuilder有许多创建几何图形的实用方法,因此您不必担心工厂。但您也可以直接使用工厂,也可以使用WKT解析器创建点

GeometryBuilder提供了几种createPoint方法。下面是使用其中一个的示例:

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)");

嗯,我终于找到了一个可能的解决办法。首先,我必须说我犯了一个错误,因为我的多多边形点是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 "";
}

我也有类似的问题。通过跟踪堆栈,我发现GeometryBuilder()找不到几何体工厂。如果没有工厂,GeometryBuilder将抛出一个类似“无工厂”的异常。解决之道在于。该插件包括使用org.geotools.geometry类所需的工厂


我正在Eclipse上使用GeoTools 11.0

我也可以阅读文档,谢谢。如前所述,我实际上在跟踪他们,但没有取得多大成功。我正试图为我的问题找到一个更有效的解释。直接从