2016-04-07 31 views
3

今私が持っている:GeoToolsで緯度、経度、および半径の円を作成するにはどうすればよいですか?

Polygon circle = geometryBuilder.circle(
myLong, 
myLat, 
radiusInMeters, 10); 

をそして、それは以下のような、(緯度= 28.456306、長い= -16.292034と半径= 500で)巨大な緯度と経度とナンセンスポリゴンを作成します。

POLYGON ((483.678055 28.482505000000003, 388.1865521874737 -265.4101211462366, 138.1865521874737 -447.04575314757676, -170.8304421874737 -447.0457531475768, -420.8304421874737 -265.41012114623663, -516.321945 28.482504999999943, -420.83044218747375 322.3751311462365, -170.8304421874738 504.01076314757677, 138.18655218747358 504.0107631475768, 388.18655218747364 322.3751311462367, 483.678055 28.482505000000003)) 

私は、私が提供した中心点の近くに緯度と経度の近くに10組の座標を持つことを期待しました。

助けてくれると助かります。前もって感謝します!

EDIT

の答えを@iantに加えて、ここにiantの骨子で説明したように、私はFeature

//build the type 
SimpleFeatureType TYPE = null; 
try { 
    TYPE = DataUtilities.createType("", "Location", "locations:Point:srid=4326," + "id:Integer" // a 
      // number 
      // attribute 
      ); 
} catch (Exception e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
} 

SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE); 
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(); 
com.vividsolutions.jts.geom.Point point = geometryFactory.createPoint(
     new Coordinate(
       currentDevicePosition.getLongitude(), 
       currentDevicePosition.getLatitude() 
       ) 
     ); 
featureBuilder.add(point); 
SimpleFeature feature = featureBuilder.buildFeature("fid.1"); // build the 1st feature 

としてPointを作成する必要がありました:https://gitlab.com/snippets/17558と、ここ:http://docs.geotools.org/、オハイオ州また、私はここで説明されているように依存関係を見逃していたSchemaException in java

答えて

8

これには2つの解決策があります:

  1. 度メートルに半径を変換および/または、メートル緯度/経度点を変換し、局所的に平面投影の円を算出し、LATに戻し再投影平面問題として

  2. の問題を扱いますlon。 1については

あなたは赤道近くの小さな半径の罰金になりますどのような何か行うことができます:それはより一般的であるように私が第二のためにいくつかのコードを紹介します

GeodeticCalculator calc = new GeodeticCalculator(DefaultGeographicCRS.WGS84); 
    calc.setStartingGeographicPoint(point.getX(), point.getY()); 
    calc.setDirection(0.0, 10000); 
    Point2D p2 = calc.getDestinationGeographicPoint(); 
    calc.setDirection(90.0, 10000); 
    Point2D p3 = calc.getDestinationGeographicPoint(); 

    double dy = p2.getY() - point.getY(); 
    double dx = p3.getX() - point.getX(); 
    double distance = (dy + dx)/2.0; 
    Polygon p1 = (Polygon) point.buffer(distance); 

を(すなわち、それは動作しますより良い半径の範囲で)。

あなたは地元の投影を見つける必要があるまず、GeoToolsはX、Yを中心としたUTM投影である「擬似」投影をAUTO42001,x,y提供:

public SimpleFeature bufferFeature(SimpleFeature feature, Measure<Double, Length> distance) { 
    // extract the geometry 
    GeometryAttribute gProp = feature.getDefaultGeometryProperty(); 
    CoordinateReferenceSystem origCRS = gProp.getDescriptor().getCoordinateReferenceSystem(); 

    Geometry geom = (Geometry) feature.getDefaultGeometry(); 
    Geometry pGeom = geom; 
    MathTransform toTransform, fromTransform = null; 
    // reproject the geometry to a local projection 
    if (!(origCRS instanceof ProjectedCRS)) { 

     double x = geom.getCoordinate().x; 
     double y = geom.getCoordinate().y; 

     String code = "AUTO:42001," + x + "," + y; 
     // System.out.println(code); 
     CoordinateReferenceSystem auto; 
     try { 
     auto = CRS.decode(code); 
     toTransform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, auto); 
     fromTransform = CRS.findMathTransform(auto, DefaultGeographicCRS.WGS84); 
     pGeom = JTS.transform(geom, toTransform); 

     } catch (MismatchedDimensionException | TransformException | FactoryException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 

    } 

だから今pGeomはメートルで私たちのポイントです。

retGeom = JTS.transform(out, fromTransform); 

機能を変更することがいじり少しはそこです:我々は我々が以前に見上げた逆変換を使用してWGS84(緯度/経度)に戻って投影し、今

Geometry out = bufferFeature(pGeom, distance.doubleValue(SI.METER)); 

簡単ですバッファリングポイントの代わりにポリゴンを返すという事実を反映するためにタイプします。完全なコードはこのgistにあります。

私はそれを実行すると、私は次のような出力が得られます。

POINT (10.840378413128576 3.4152050343701745) 
POLYGON ((10.84937634426605 3.4151876838951822, 10.849200076653755 3.413423962919184, 10.84868480171117 3.4117286878605766, 10.847850322146979 3.4101670058279794, 10.846728706726902 3.4087989300555464, 10.845363057862208 3.407677033830687, 10.843805855306746 3.406844430298736, 10.84211693959797 3.406333115754347, 10.840361212705258 3.4061627400701946, 10.838606144204721 3.4063398515107184, 10.836919178768184 3.4068576449605277, 10.835365144548726 3.4076962232621035, 10.834003762019957 3.408823361646906, 10.832887348980522 3.410195745914279, 10.832058809914859 3.411760636805914, 10.831549986992338 3.4134578966399034, 10.831380436105858 3.4152223003379722, 10.831556675029052 3.416986042039048, 10.832071932633442 3.4186813409639054, 10.832906408849936 3.4202430463705085, 10.834028035422469 3.4216111414662183, 10.835393708241908 3.422733050021835, 10.836950943907517 3.4235656570147763, 10.838639896841123 3.424076965623486, 10.840395659406198 3.4242473268789406, 10.842150756595839 3.4240701947133396, 10.843837739370569 3.4235523773972796, 10.845391776937724 3.4227137757216988, 10.846753148314034 3.4215866180136185, 10.847869537398722 3.4202142214154887, 10.848698043354238 3.4186493270628633, 10.849206829051935 3.4169520731645546, 10.84937634426605 3.4151876838951822)) 
+0

は、私はそれが多角形(またはにGeoJSON定義のhttpを持つ呼ぶのですか、全体の機能およびあなたの主旨からAUXILIARバッファをコピーした:// geojson.org/geojson-spec。html#ポリゴン)の代わりに? – jonayreyes

+0

私は思っていますが、射影に変更してからもう一度戻ると、異なる経度でのメートル/緯度の違いを考慮に入れたいと思っていますか? – Nick

+0

また、#1の方がパフォーマンスが良いですか?これを1M回行う必要があった場合はどうなりますか? – Nick

関連する問題