Hi folks,

here is my working solution,adapted to my requirements:

   private String jtsSplit(Polygon p, LineString l) {
       /*
        * Use MCIndexNoder to node
       the polygon and linestring together, Polygonizer to polygonize the
noded edges, and then PointLocater to determine which of the resultant
       polygons correspond to the input polygon. */
       StringBuffer _buffer = new StringBuffer();
IntersectionAdder _intersector=new IntersectionAdder(new RobustLineIntersector());
       MCIndexNoder _mci = new MCIndexNoder();
       _mci.setSegmentIntersector(_intersector);
NodedSegmentString _pseg = new NodedSegmentString(p.getCoordinates(), null); NodedSegmentString _lseg = new NodedSegmentString(l.getCoordinates(), null);
       Vector<NodedSegmentString> _v = new Vector<NodedSegmentString>();
       _v.add(_pseg);
       _v.add(_lseg);
       _mci.computeNodes(_v);
       GeometryFactory _fac = new GeometryFactory();
       Polygonizer _polygonizer = new Polygonizer();
       Vector<LineString> _ls = new Vector<LineString>();
       for (Object o : _mci.getMonotoneChains()) {
           MonotoneChain _mtc = (MonotoneChain) o;
           LineString _line = _fac.createLineString(_mtc.getCoordinates());
           _ls.add(_line);
       }
       Geometry nodedLineStrings =  _ls.get(0);
       for (int i = 1; i < _ls.size(); i++) {
           nodedLineStrings = nodedLineStrings.union(_ls.get(i));
       }
       _polygonizer.add(nodedLineStrings);
       Collection<Polygon> _polygons = _polygonizer.getPolygons();
       PointLocator _pl=new PointLocator();
       for (Polygon _p : _polygons) {
if (_pl.locate(_p.getInteriorPoint().getCoordinate(),p)==Location.INTERIOR)
           {
               _buffer.append("<polygon>");
               _buffer.append(_p);
               _buffer.append("</polygon>");
           }
       }
       return (_buffer.toString());
   }


Michael Michaud schrieb:
Sorry, I used some jump code,

pure jts could be :

import com.vividsolutions.jts.noding.*;
import com.vividsolutions.jts.algorithm.RobustLineIntersector;

gf = new GeometryFactory();

// add the linestrings to a list of NodedSegmentString;
List list = new ArrayList();
list.add(new NodedSegmentString(geometry1.getCoordinates(), null));
list.add(new NodedSegmentString(geometry2.getCoordinates(), null));

// create a noder and computes the nodes
Noder noder = new MCIndexNoder();
noder.setSegmentIntersector(new IntersectionAdder(new RobustLineIntersector()));
noder.computeNodes(list);

// get noded substrings and create LINESTRING geometries from them

list = noder.getNodedSubstrings();
for (Object substring : list) print(gf.createLineString(((NodedSegmentString)substring).getCoordinates()));

// you still have to polygonize your noded linestrings

Hope that helps

Michaël

Dipl. Inf. Carsten Eider a écrit :
Hi list,

i am getting sick while trying to resolve my problem of splitting a polygon(assumd to have no wholes within),
it is driving me crazy! martin gave the hint:

"Use MCIndexNoder to node the polygon and linestring together, Polygonizer to polygonize the noded edges, and then PointLocater to determine which of the resultant polygons correspond to the input polygon. "

Here is my non working attempt

Polygon p, LineString l;

//Use MCIndexNoder
//Setup intersector any classes implementing SegmentIntersector (InteriorIntersectionFinder <mailbox:///G%7C/Documents%20and%20Settings/Travail/Application%20Data/Thunderbird/Profiles/nwn2wsnb.default/Mail/Local%20Folders/Inbox?number=171338383&header=quotebody&part=1.1.1.2&filename=InteriorIntersectionFinder.html>, IntersectionAdder <mailbox:///G%7C/Documents%20and%20Settings/Travail/Application%20Data/Thunderbird/Profiles/nwn2wsnb.default/Mail/Local%20Folders/Inbox?number=171338383&header=quotebody&part=1.1.1.3&filename=IntersectionAdder.html>, IntersectionFinderAdder <mailbox:///G%7C/Documents%20and%20Settings/Travail/Application%20Data/Thunderbird/Profiles/nwn2wsnb.default/Mail/Local%20Folders/Inbox?number=171338383&header=quotebody&part=1.1.1.4&filename=IntersectionFinderAdder.html>, LineIntersectionAdder <mailbox:///G%7C/Documents%20and%20Settings/Travail/Application%20Data/Thunderbird/Profiles/nwn2wsnb.default/Mail/Local%20Folders/Inbox?number=171338383&header=quotebody&part=1.1.1.5&filename=LineIntersectionAdder.html>, SegmentIntersectionDetector <mailbox:///G%7C/Documents%20and%20Settings/Travail/Application%20Data/Thunderbird/Profiles/nwn2wsnb.default/Mail/Local%20Folders/Inbox?number=171338383&header=quotebody&part=1.1.1.6&filename=SegmentIntersectionDetector.html>) have been tested! SegmentIntersectionDetector _intersector = new SegmentIntersectionDetector(new RobustLineIntersector());
_intersector.setFindProper(true);
_intersector.setFindAllIntersectionTypes(true);

//Wouldn't it be better to setup intersector within the constructor?
MCIndexNoder _mci = new MCIndexNoder();
_mci.setSegmentIntersector(_intersector);
// Add my polygon and my LineString
NodedSegmentString _pseg = new NodedSegmentString(p.getCoordinates(), null); NodedSegmentString _lseg = new NodedSegmentString(l.getCoordinates(), null);
Vector<NodedSegmentString> _v = new Vector<NodedSegmentString>();
//order of adding doesn't alter result
_v.add(_pseg);
_v.add(_lseg);
//lets compute the nodes, whatever this does mean!
_mci.computeNodes(_v);
//here is my polygonizer
Polygonizer _polygonizer = new Polygonizer();
//let's add thsi monotonechains, whatever they mean!
for (Object o : _mci.getMonotoneChains()) {
            MonotoneChain _mtc = (MonotoneChain) o;
             //Convert chain to a linestring, is thsi correct?
LineString _line = _fac.createLineString(_mtc.getCoordinates());
            System.out.println(_line);
            _polygonizer.add(_line);
}
//Here are my hopefully correct poylgons!
Collection<Polygon> _polygons = _polygonizer.getPolygons();
for (Polygon _p : _polygons) {
           /System.out.println(_p);
}

Example 1:
l=LINESTRING (0 0,4 5, 5 4,10 10);
p=POLYGON(0 0,10 0,10 10 ,0 10, 3 8,0 0)
pgsql:<polygon>POLYGON ((10 10, 10 0, 0 0, 4 5, 5 4, 10 10))</polygon><polygon>POLYGON ((0 0, 3 8, 0 10, 10 10, 5 4, 4 5, 0 0))</polygon> jts:<polygon>POLYGON ((5 4, 4 5, 0 0, 3 8, 0 10, 10 10, 5 4))</polygon><polygon>POLYGON ((0 0, 4 5, 5 4, 10 10, 10 0, 0 0))</polygon>

jts==pgsql==>Correct GREAT

Example 2:
l=LINESTRING (-1 -1,4 5, 5 4,11 11);
p=POLYGON(0 0,10 0,10 10 ,0 10, 3 8,0 0)
pgsql:<polygon>POLYGON ((10 9.83333333333333, 10 0, 0 0, 0.136363636363636 0.363636363636364, 4 5, 5 4, 10 9.83333333333333))</polygon><polygon>POLYGON ((0.136363636363636 0.363636363636364, 3 8, 0 10, 10 10, 10 9.83333333333333, 5 4, 4 5, 0.136363636363636 0.363636363636364))</polygon>
jts:<polygon>POLYGON ((0 0, 3 8, 0 10, 10 10, 10 0, 0 0))</polygon>

jts!=pgsql, damn where is my second polygon as expected? why do i get just my original polygon?


Example 3
l=LINESTRING (0 0,4 5, 5 4,10 10,10 6,0 6)
p=POLYGON(0 0,10 0,10 10 ,0 10, 3 8,0 0)
pgsql:<polygon>POLYGON ((10 6, 10 0, 0 0, 4 5, 5 4, 6.66666666666667 6, 10 6))</polygon><polygon>POLYGON ((10 10, 10 6, 6.66666666666667 6, 10 10))</polygon><polygon>POLYGON ((2.25 6, 3 8, 0 10, 10 10, 6.66666666666667 6, 2.25 6))</polygon><polygon>POLYGON ((0 0, 2.25 6, 6.66666666666667 6, 5 4, 4 5, 0 0))</polygon> jts:<polygon>POLYGON ((5 4, 4 5, 0 0, 3 8, 0 10, 10 10, 5 4))</polygon><polygon>POLYGON ((0 0, 4 5, 5 4, 10 10, 10 0, 0 0))</polygon>

jts!=pgsql, why the hell are there only two polygons left? where are the other two as expected?


Any suggestions are very appreciated!
Maybe i should offer a reward of a box of good german beer !

TIA Carsten
--
Mit freundlichen Grüßen / Yours faithfully
Carsten Eider

Dipl. Inf. (FH)

Kompetenzzentrum für Innovative Informationssysteme

c/o Fachhochschhule Bingen / University of applied sciences Bingen

Berlinstraße 109
55411 Bingen

Tel: +49 (0) 6721 / 409-179
Fax: +49 (0) 6721 / 409-158
email: [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
Internet: iis.fh-bingen.de _______________________________________________
jts-devel mailing list
[email protected]
http://lists.refractions.net/mailman/listinfo/jts-devel

_______________________________________________
jts-devel mailing list
[email protected]
http://lists.refractions.net/mailman/listinfo/jts-devel



_______________________________________________
jts-devel mailing list
[email protected]
http://lists.refractions.net/mailman/listinfo/jts-devel


--
Mit freundlichen Grüßen / Yours faithfully
Carsten Eider

Dipl. Inf. (FH)

Kompetenzzentrum für Innovative Informationssysteme

c/o Fachhochschhule Bingen / University of applied sciences Bingen

Berlinstraße 109
55411 Bingen

Tel: +49 (0) 6721 / 409-179
Fax: +49 (0) 6721 / 409-158
email: [EMAIL PROTECTED]
Internet: iis.fh-bingen.de
begin:vcard
fn:Carsten Eider
n:Eider;Carsten
org:Fachhochschule Bingen;Kompetenzzentrum innovative Informationssysteme
adr;quoted-printable:;;berlinstra=C3=9Fe 109;Bingen;RLP;55411;Deutschland
email;internet:[EMAIL PROTECTED]
title:Dipl.-Inf.
tel;work:067214090179
x-mozilla-html:TRUE
url:iis.fh-bingen.de
version:2.1
end:vcard

_______________________________________________
jts-devel mailing list
[email protected]
http://lists.refractions.net/mailman/listinfo/jts-devel

Reply via email to