Re: [OSGeoJapan-discuss] Douglas-Peukerなどを用いた簡素化についてのアルゴリズムを教えてください。
wakasa masao
machio @ mac.com
2010年 6月 27日 (日) 09:24:47 EDT
かやまさん
若狭です。
いろいろありがとうございます。
元は一緒なんですね。JTSの更新がほぼされていないのは少々気にはなりますが・・。
で、少々調子にのってPostGISでやってたものをJavaに移植してました。
ですが、一部差異がでてきてしまいました。
まぁ今までのままPostGISでやっていればいいのですが、なぜだろうと・・。
----
差異が出たもの
---
LINESTRINGの始発点のポイントから0.0015分バッファを取った範囲を削除したLINESTRINGを作る。
=> 要は始発点の付近を適当に削除したい (自宅とかバレちゃうから)
---
---
Java
// ptsにPostGISから抜き出した同じ緯度経度が含まれる配列が入っている
GeometryFactory geof = new GeometryFactory();
LineString ls = geof.createLineString(pts);
Point startP = ls.getStartPoint();
Geometry geo1 = startP.buffer(0.0015).difference(ls);
=> geo1には POLYGON ((139.620246666667 35.4877433333333,.............
---
PostGIS
AsText(Difference(route,Buffer(StartPoint(route),0.0015)))
=> MULTILINESTRING((139.617588531772 35.486801446456,.................
---
試行錯誤のすえの削除方法なのでなんですが、JavaでやるとPOLYGON 、PostGISではMULTILINESTRINGになりました。
ちなみにですが、途中で始点のバッファ取った所の形状も微妙に異なってはいましたが、ほぼ同じでした。
何か削除方法が間違ってる気でいっぱにはなってきてますが、ご報告までに。
------------
wakasa masao
2010年6月27日19:56 Yoichi Kayama <yoichi.kayama @ gmail.com>:
> 若狭さん
>
> PostGISやQGISはC++で組まれているからGEOSライブラリを利用しています。
> GEOSライブラリはJTSをC++で実装したものであるとWEBに書いてあるのでJTSのほうが元祖
> のようです。
> ですからJTSとPostGISのライブラリは名前ぶつかるわけです。
>
>
> 2010年6月27日17:28 wakasa masao <machio @ mac.com>:
>> ラガワン先生、かやまさん
>>
>> 若狭です。
>>
>> ありがとうございます!
>> ご紹介いただいたJavaのライブラリいれてやってみました。
>> 数値上でしか見ていないのですが、かけたあとのポイント数的は一緒になりました!
>> ソース見る限りそれほど面倒そうな事もやっていないのでなぜこうなる!と疑問に思いましたがぐっと飲み込みます。
>>
>> あと、少々ライブラリサイズがでかいので悩ましいのと、PostGISのライブラリと名前がぶつかりまくってプログラムが少々難解になりかけますが、これでいけそうです。
>> 必要な部分だけ切り取るという事も考えられなくもないですが少々面倒なオーラが・・。
>> ありがとうございました。
>>
>> よろしくお願いします。
>>
>> ------------
>> wakasa masao
>>
>>
>>
>> 2010年6月27日14:56 Yoichi Kayama <yoichi.kayama @ gmail.com>:
>>> かやまです
>>>
>>> 元メールにJavaかJavaScript と書いてあったのを見落としていました
>>>
>>> Javaだとここです
>>>
>>> http://www.vividsolutions.com/jts/javadoc/com/vividsolutions/jts/simplify/package-summary.html
>>>
>>>
>>> JTS Topology Suite というやつが FOSS4Gの世界では Javaで空間情報を
>>> あつかう場合の定番です。
>>>
>>> 2010年6月27日14:27 Yoichi Kayama <yoichi.kayama @ gmail.com>:
>>>> かやまです
>>>>
>>>> ラガワン先生紹介のページみてみると
>>>>
>>>>>Performed by the GEOS module.
>>>>
>>>> とあります
>>>>
>>>> QGISのftoolプラグインにも同様の機能があるのでソース追ってみました
>>>>
>>>>
>>>> doGeometry.py というpythonのモジュールですが
>>>>
>>>> def simplify_geometry( self ): こういう関数がありまして
>>>>
>>>>
>>>> while vprovider.nextFeature( inFeat ):
>>>> nElement += 1
>>>> self.emit( SIGNAL( "runStatus(PyQt_PyObject)" ), nElement )
>>>> inGeom = inFeat.geometry()
>>>> atMap = inFeat.attributeMap()
>>>> outGeom = QgsGeometry(inGeom.simplify(tolerance))
>>>> if outGeom is None:
>>>> return "math_error"
>>>> outFeat.setAttributeMap( atMap )
>>>> outFeat.setGeometry( outGeom )
>>>> writer.addFeature( outFeat )
>>>>
>>>> こんなかんじです
>>>>
>>>> 実際の処理はここなんですが
>>>> outGeom = QgsGeometry(inGeom.simplify(tolerance))
>>>>
>>>> 多分ここも GEOS のライブラリを参照しているので GEOSのライブラリを
>>>> 使うといいのかもしれません
>>>>
>>>> http://trac.osgeo.org/geos/
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> 2010年6月27日13:58 Venkatesh Raghavan <raghavan @ media.osaka-cu.ac.jp>:
>>>>> On 2010/06/27 13:48, wakasa masao wrote:
>>>>>
>>>>>> ではPostGISのST_Simplifyは何をやっているんだろう・・。
>>>>>
>>>>> ST_Simplify also use the same Douglas-Peuker algorithm
>>>>> for line generalization
>>>>> Details at:
>>>>> http://postgis.refractions.net/docs/ST_Simplify.html
>>>>>
>>>>> Best
>>>>>
>>>>> Venka
>>>>>
>>>>
>>>
>>> _______________________________________________
>>> OSGeoJapan-discuss mailing list
>>> OSGeoJapan-discuss @ lists.osgeo.org
>>> http://lists.osgeo.org/mailman/listinfo/osgeojapan-discuss
>>>
>>>
>>
>> _______________________________________________
>> OSGeoJapan-discuss mailing list
>> OSGeoJapan-discuss @ lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/osgeojapan-discuss
>>
>>
>
OSGeoJapan-discuss メーリングリストの案内