|
Lines 94-101
Link Here
|
| 94 |
|
94 |
|
| 95 |
geometry_builder::maybe_wkt_t geometry_builder::get_wkt_simple(const osmNode *nodes, int count, int polygon) const |
95 |
geometry_builder::maybe_wkt_t geometry_builder::get_wkt_simple(const osmNode *nodes, int count, int polygon) const |
| 96 |
{ |
96 |
{ |
| 97 |
GeometryFactory gf; |
97 |
GeometryFactory::unique_ptr gf = GeometryFactory::create(); |
| 98 |
std::auto_ptr<CoordinateSequence> coords(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
98 |
std::auto_ptr<CoordinateSequence> coords(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
| 99 |
|
99 |
|
| 100 |
try |
100 |
try |
| 101 |
{ |
101 |
{ |
|
Lines 109-116
Link Here
|
| 109 |
maybe_wkt_t wkt(new geometry_builder::wkt_t()); |
109 |
maybe_wkt_t wkt(new geometry_builder::wkt_t()); |
| 110 |
geom_ptr geom; |
110 |
geom_ptr geom; |
| 111 |
if (polygon && (coords->getSize() >= 4) && (coords->getAt(coords->getSize() - 1).equals2D(coords->getAt(0)))) { |
111 |
if (polygon && (coords->getSize() >= 4) && (coords->getAt(coords->getSize() - 1).equals2D(coords->getAt(0)))) { |
| 112 |
std::auto_ptr<LinearRing> shell(gf.createLinearRing(coords.release())); |
112 |
std::auto_ptr<LinearRing> shell(gf->createLinearRing(coords.release())); |
| 113 |
geom = geom_ptr(gf.createPolygon(shell.release(), new std::vector<Geometry *>)); |
113 |
geom = geom_ptr(gf->createPolygon(shell.release(), new std::vector<Geometry *>)); |
| 114 |
if (!geom->isValid()) { |
114 |
if (!geom->isValid()) { |
| 115 |
if (excludepoly) { |
115 |
if (excludepoly) { |
| 116 |
throw std::runtime_error("Excluding broken polygon."); |
116 |
throw std::runtime_error("Excluding broken polygon."); |
|
Lines 123-129
Link Here
|
| 123 |
} else { |
123 |
} else { |
| 124 |
if (coords->getSize() < 2) |
124 |
if (coords->getSize() < 2) |
| 125 |
throw std::runtime_error("Excluding degenerate line."); |
125 |
throw std::runtime_error("Excluding degenerate line."); |
| 126 |
geom = geom_ptr(gf.createLineString(coords.release())); |
126 |
geom = geom_ptr(gf->createLineString(coords.release())); |
| 127 |
wkt->area = 0; |
127 |
wkt->area = 0; |
| 128 |
} |
128 |
} |
| 129 |
|
129 |
|
|
Lines 149-156
Link Here
|
| 149 |
|
149 |
|
| 150 |
geometry_builder::maybe_wkts_t geometry_builder::get_wkt_split(const osmNode *nodes, int count, int polygon, double split_at) const |
150 |
geometry_builder::maybe_wkts_t geometry_builder::get_wkt_split(const osmNode *nodes, int count, int polygon, double split_at) const |
| 151 |
{ |
151 |
{ |
| 152 |
GeometryFactory gf; |
152 |
GeometryFactory::unique_ptr gf = GeometryFactory::create(); |
| 153 |
std::auto_ptr<CoordinateSequence> coords(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
153 |
std::auto_ptr<CoordinateSequence> coords(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
| 154 |
WKTWriter writer; |
154 |
WKTWriter writer; |
| 155 |
//TODO: use count to get some kind of hint of how much we should reserve? |
155 |
//TODO: use count to get some kind of hint of how much we should reserve? |
| 156 |
maybe_wkts_t wkts(new std::vector<geometry_builder::wkt_t>); |
156 |
maybe_wkts_t wkts(new std::vector<geometry_builder::wkt_t>); |
|
Lines 166-173
Link Here
|
| 166 |
|
166 |
|
| 167 |
geom_ptr geom; |
167 |
geom_ptr geom; |
| 168 |
if (polygon && (coords->getSize() >= 4) && (coords->getAt(coords->getSize() - 1).equals2D(coords->getAt(0)))) { |
168 |
if (polygon && (coords->getSize() >= 4) && (coords->getAt(coords->getSize() - 1).equals2D(coords->getAt(0)))) { |
| 169 |
std::auto_ptr<LinearRing> shell(gf.createLinearRing(coords.release())); |
169 |
std::auto_ptr<LinearRing> shell(gf->createLinearRing(coords.release())); |
| 170 |
geom = geom_ptr(gf.createPolygon(shell.release(), new std::vector<Geometry *>)); |
170 |
geom = geom_ptr(gf->createPolygon(shell.release(), new std::vector<Geometry *>)); |
| 171 |
if (!geom->isValid()) { |
171 |
if (!geom->isValid()) { |
| 172 |
if (excludepoly) { |
172 |
if (excludepoly) { |
| 173 |
throw std::runtime_error("Excluding broken polygon."); |
173 |
throw std::runtime_error("Excluding broken polygon."); |
|
Lines 189-195
Link Here
|
| 189 |
|
189 |
|
| 190 |
double distance = 0; |
190 |
double distance = 0; |
| 191 |
std::auto_ptr<CoordinateSequence> segment; |
191 |
std::auto_ptr<CoordinateSequence> segment; |
| 192 |
segment = std::auto_ptr<CoordinateSequence>(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
192 |
segment = std::auto_ptr<CoordinateSequence>(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
| 193 |
segment->add(coords->getAt(0)); |
193 |
segment->add(coords->getAt(0)); |
| 194 |
for(unsigned i=1; i<coords->getSize(); i++) { |
194 |
for(unsigned i=1; i<coords->getSize(); i++) { |
| 195 |
const Coordinate this_pt = coords->getAt(i); |
195 |
const Coordinate this_pt = coords->getAt(i); |
|
Lines 208-214
Link Here
|
| 208 |
const Coordinate interpolated(frac * (this_pt.x - prev_pt.x) + prev_pt.x, |
208 |
const Coordinate interpolated(frac * (this_pt.x - prev_pt.x) + prev_pt.x, |
| 209 |
frac * (this_pt.y - prev_pt.y) + prev_pt.y); |
209 |
frac * (this_pt.y - prev_pt.y) + prev_pt.y); |
| 210 |
segment->add(interpolated); |
210 |
segment->add(interpolated); |
| 211 |
geom_ptr geom = geom_ptr(gf.createLineString(segment.release())); |
211 |
geom_ptr geom = geom_ptr(gf->createLineString(segment.release())); |
| 212 |
|
212 |
|
| 213 |
//copy of an empty one should be cheapest |
213 |
//copy of an empty one should be cheapest |
| 214 |
wkts->push_back(geometry_builder::wkt_t()); |
214 |
wkts->push_back(geometry_builder::wkt_t()); |
|
Lines 216-222
Link Here
|
| 216 |
wkts->back().geom = writer.write(geom.get()); |
216 |
wkts->back().geom = writer.write(geom.get()); |
| 217 |
wkts->back().area = 0; |
217 |
wkts->back().area = 0; |
| 218 |
|
218 |
|
| 219 |
segment.reset(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
219 |
segment.reset(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
| 220 |
segment->add(interpolated); |
220 |
segment->add(interpolated); |
| 221 |
} |
221 |
} |
| 222 |
// reset the distance based on the final splitting point for |
222 |
// reset the distance based on the final splitting point for |
|
Lines 234-240
Link Here
|
| 234 |
|
234 |
|
| 235 |
// on the last iteration, close out the line. |
235 |
// on the last iteration, close out the line. |
| 236 |
if (i == coords->getSize()-1) { |
236 |
if (i == coords->getSize()-1) { |
| 237 |
geom_ptr geom = geom_ptr(gf.createLineString(segment.release())); |
237 |
geom_ptr geom = geom_ptr(gf->createLineString(segment.release())); |
| 238 |
|
238 |
|
| 239 |
//copy of an empty one should be cheapest |
239 |
//copy of an empty one should be cheapest |
| 240 |
wkts->push_back(geometry_builder::wkt_t()); |
240 |
wkts->push_back(geometry_builder::wkt_t()); |
|
Lines 242-248
Link Here
|
| 242 |
wkts->back().geom = writer.write(geom.get()); |
242 |
wkts->back().geom = writer.write(geom.get()); |
| 243 |
wkts->back().area = 0; |
243 |
wkts->back().area = 0; |
| 244 |
|
244 |
|
| 245 |
segment.reset(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
245 |
segment.reset(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
| 246 |
} |
246 |
} |
| 247 |
} |
247 |
} |
| 248 |
} |
248 |
} |
|
Lines 264-271
Link Here
|
| 264 |
} |
264 |
} |
| 265 |
|
265 |
|
| 266 |
int geometry_builder::parse_wkt(const char * wkt, struct osmNode *** xnodes, int ** xcount, int * polygon) { |
266 |
int geometry_builder::parse_wkt(const char * wkt, struct osmNode *** xnodes, int ** xcount, int * polygon) { |
| 267 |
GeometryFactory gf; |
267 |
GeometryFactory::unique_ptr gf = GeometryFactory::create(); |
| 268 |
WKTReader reader(&gf); |
268 |
WKTReader reader(gf.get()); |
| 269 |
std::string wkt_string(wkt); |
269 |
std::string wkt_string(wkt); |
| 270 |
Geometry * geometry; |
270 |
Geometry * geometry; |
| 271 |
const Geometry * subgeometry; |
271 |
const Geometry * subgeometry; |
|
Lines 329-335
Link Here
|
| 329 |
geometry_builder::maybe_wkts_t geometry_builder::build_polygons(const osmNode * const * xnodes, const int *xcount, bool enable_multi, osmid_t osm_id) const |
329 |
geometry_builder::maybe_wkts_t geometry_builder::build_polygons(const osmNode * const * xnodes, const int *xcount, bool enable_multi, osmid_t osm_id) const |
| 330 |
{ |
330 |
{ |
| 331 |
std::auto_ptr<std::vector<Geometry*> > lines(new std::vector<Geometry*>); |
331 |
std::auto_ptr<std::vector<Geometry*> > lines(new std::vector<Geometry*>); |
| 332 |
GeometryFactory gf; |
332 |
GeometryFactory::unique_ptr gf = GeometryFactory::create(); |
| 333 |
geom_ptr geom; |
333 |
geom_ptr geom; |
| 334 |
geos::geom::prep::PreparedGeometryFactory pgf; |
334 |
geos::geom::prep::PreparedGeometryFactory pgf; |
| 335 |
|
335 |
|
|
Lines 339-345
Link Here
|
| 339 |
try |
339 |
try |
| 340 |
{ |
340 |
{ |
| 341 |
for (int c=0; xnodes[c]; c++) { |
341 |
for (int c=0; xnodes[c]; c++) { |
| 342 |
std::auto_ptr<CoordinateSequence> coords(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
342 |
std::auto_ptr<CoordinateSequence> coords(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
| 343 |
for (int i = 0; i < xcount[c]; i++) { |
343 |
for (int i = 0; i < xcount[c]; i++) { |
| 344 |
const osmNode *nodes = xnodes[c]; |
344 |
const osmNode *nodes = xnodes[c]; |
| 345 |
Coordinate c; |
345 |
Coordinate c; |
|
Lines 348-360
Link Here
|
| 348 |
coords->add(c, 0); |
348 |
coords->add(c, 0); |
| 349 |
} |
349 |
} |
| 350 |
if (coords->getSize() > 1) { |
350 |
if (coords->getSize() > 1) { |
| 351 |
geom = geom_ptr(gf.createLineString(coords.release())); |
351 |
geom = geom_ptr(gf->createLineString(coords.release())); |
| 352 |
lines->push_back(geom.release()); |
352 |
lines->push_back(geom.release()); |
| 353 |
} |
353 |
} |
| 354 |
} |
354 |
} |
| 355 |
|
355 |
|
| 356 |
//geom_ptr segment(0); |
356 |
//geom_ptr segment(0); |
| 357 |
geom_ptr mline (gf.createMultiLineString(lines.release())); |
357 |
geom_ptr mline (gf->createMultiLineString(lines.release())); |
| 358 |
//geom_ptr noded (segment->Union(mline.get())); |
358 |
//geom_ptr noded (segment->Union(mline.get())); |
| 359 |
LineMerger merger; |
359 |
LineMerger merger; |
| 360 |
//merger.add(noded.get()); |
360 |
//merger.add(noded.get()); |
|
Lines 371-378
Link Here
|
| 371 |
std::auto_ptr<LineString> pline ((*merged ) [i]); |
371 |
std::auto_ptr<LineString> pline ((*merged ) [i]); |
| 372 |
if (pline->getNumPoints() > 3 && pline->isClosed()) |
372 |
if (pline->getNumPoints() > 3 && pline->isClosed()) |
| 373 |
{ |
373 |
{ |
| 374 |
polys[totalpolys].polygon = gf.createPolygon(gf.createLinearRing(pline->getCoordinates()),0); |
374 |
polys[totalpolys].polygon = gf->createPolygon(gf->createLinearRing(pline->getCoordinates()),0); |
| 375 |
polys[totalpolys].ring = gf.createLinearRing(pline->getCoordinates()); |
375 |
polys[totalpolys].ring = gf->createLinearRing(pline->getCoordinates()); |
| 376 |
polys[totalpolys].area = polys[totalpolys].polygon->getArea(); |
376 |
polys[totalpolys].area = polys[totalpolys].polygon->getArea(); |
| 377 |
polys[totalpolys].iscontained = 0; |
377 |
polys[totalpolys].iscontained = 0; |
| 378 |
polys[totalpolys].containedbyid = 0; |
378 |
polys[totalpolys].containedbyid = 0; |
|
Lines 460-466
Link Here
|
| 460 |
} |
460 |
} |
| 461 |
} |
461 |
} |
| 462 |
|
462 |
|
| 463 |
Polygon* poly(gf.createPolygon(polys[i].ring, interior.release())); |
463 |
Polygon* poly(gf->createPolygon(polys[i].ring, interior.release())); |
| 464 |
poly->normalize(); |
464 |
poly->normalize(); |
| 465 |
polygons->push_back(poly); |
465 |
polygons->push_back(poly); |
| 466 |
} |
466 |
} |
|
Lines 468-474
Link Here
|
| 468 |
// Make a multipolygon if required |
468 |
// Make a multipolygon if required |
| 469 |
if ((toplevelpolygons > 1) && enable_multi) |
469 |
if ((toplevelpolygons > 1) && enable_multi) |
| 470 |
{ |
470 |
{ |
| 471 |
geom_ptr multipoly(gf.createMultiPolygon(polygons.release())); |
471 |
geom_ptr multipoly(gf->createMultiPolygon(polygons.release())); |
| 472 |
if (!multipoly->isValid() && (excludepoly == 0)) { |
472 |
if (!multipoly->isValid() && (excludepoly == 0)) { |
| 473 |
multipoly = geom_ptr(multipoly->buffer(0)); |
473 |
multipoly = geom_ptr(multipoly->buffer(0)); |
| 474 |
} |
474 |
} |
|
Lines 526-532
Link Here
|
| 526 |
geometry_builder::maybe_wkt_t geometry_builder::build_multilines(const osmNode * const * xnodes, const int *xcount, osmid_t osm_id) const |
526 |
geometry_builder::maybe_wkt_t geometry_builder::build_multilines(const osmNode * const * xnodes, const int *xcount, osmid_t osm_id) const |
| 527 |
{ |
527 |
{ |
| 528 |
std::auto_ptr<std::vector<Geometry*> > lines(new std::vector<Geometry*>); |
528 |
std::auto_ptr<std::vector<Geometry*> > lines(new std::vector<Geometry*>); |
| 529 |
GeometryFactory gf; |
529 |
GeometryFactory::unique_ptr gf = GeometryFactory::create(); |
| 530 |
geom_ptr geom; |
530 |
geom_ptr geom; |
| 531 |
|
531 |
|
| 532 |
maybe_wkt_t wkt(new geometry_builder::wkt_t()); |
532 |
maybe_wkt_t wkt(new geometry_builder::wkt_t()); |
|
Lines 534-540
Link Here
|
| 534 |
try |
534 |
try |
| 535 |
{ |
535 |
{ |
| 536 |
for (int c=0; xnodes[c]; c++) { |
536 |
for (int c=0; xnodes[c]; c++) { |
| 537 |
std::auto_ptr<CoordinateSequence> coords(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
537 |
std::auto_ptr<CoordinateSequence> coords(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
| 538 |
for (int i = 0; i < xcount[c]; i++) { |
538 |
for (int i = 0; i < xcount[c]; i++) { |
| 539 |
const osmNode *nodes = xnodes[c]; |
539 |
const osmNode *nodes = xnodes[c]; |
| 540 |
Coordinate c; |
540 |
Coordinate c; |
|
Lines 543-555
Link Here
|
| 543 |
coords->add(c, 0); |
543 |
coords->add(c, 0); |
| 544 |
} |
544 |
} |
| 545 |
if (coords->getSize() > 1) { |
545 |
if (coords->getSize() > 1) { |
| 546 |
geom = geom_ptr(gf.createLineString(coords.release())); |
546 |
geom = geom_ptr(gf->createLineString(coords.release())); |
| 547 |
lines->push_back(geom.release()); |
547 |
lines->push_back(geom.release()); |
| 548 |
} |
548 |
} |
| 549 |
} |
549 |
} |
| 550 |
|
550 |
|
| 551 |
//geom_ptr segment(0); |
551 |
//geom_ptr segment(0); |
| 552 |
geom_ptr mline (gf.createMultiLineString(lines.release())); |
552 |
geom_ptr mline (gf->createMultiLineString(lines.release())); |
| 553 |
//geom_ptr noded (segment->Union(mline.get())); |
553 |
//geom_ptr noded (segment->Union(mline.get())); |
| 554 |
|
554 |
|
| 555 |
WKTWriter writer; |
555 |
WKTWriter writer; |
|
Lines 571-577
Link Here
|
| 571 |
int enable_multi, double split_at, osmid_t osm_id) const |
571 |
int enable_multi, double split_at, osmid_t osm_id) const |
| 572 |
{ |
572 |
{ |
| 573 |
std::auto_ptr<std::vector<Geometry*> > lines(new std::vector<Geometry*>); |
573 |
std::auto_ptr<std::vector<Geometry*> > lines(new std::vector<Geometry*>); |
| 574 |
GeometryFactory gf; |
574 |
GeometryFactory::unique_ptr gf = GeometryFactory::create(); |
| 575 |
geom_ptr geom; |
575 |
geom_ptr geom; |
| 576 |
geos::geom::prep::PreparedGeometryFactory pgf; |
576 |
geos::geom::prep::PreparedGeometryFactory pgf; |
| 577 |
maybe_wkts_t wkts(new std::vector<geometry_builder::wkt_t>); |
577 |
maybe_wkts_t wkts(new std::vector<geometry_builder::wkt_t>); |
|
Lines 580-586
Link Here
|
| 580 |
try |
580 |
try |
| 581 |
{ |
581 |
{ |
| 582 |
for (int c=0; xnodes[c]; c++) { |
582 |
for (int c=0; xnodes[c]; c++) { |
| 583 |
std::auto_ptr<CoordinateSequence> coords(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
583 |
std::auto_ptr<CoordinateSequence> coords(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
| 584 |
for (int i = 0; i < xcount[c]; i++) { |
584 |
for (int i = 0; i < xcount[c]; i++) { |
| 585 |
const osmNode *nodes = xnodes[c]; |
585 |
const osmNode *nodes = xnodes[c]; |
| 586 |
Coordinate c; |
586 |
Coordinate c; |
|
Lines 589-601
Link Here
|
| 589 |
coords->add(c, 0); |
589 |
coords->add(c, 0); |
| 590 |
} |
590 |
} |
| 591 |
if (coords->getSize() > 1) { |
591 |
if (coords->getSize() > 1) { |
| 592 |
geom = geom_ptr(gf.createLineString(coords.release())); |
592 |
geom = geom_ptr(gf->createLineString(coords.release())); |
| 593 |
lines->push_back(geom.release()); |
593 |
lines->push_back(geom.release()); |
| 594 |
} |
594 |
} |
| 595 |
} |
595 |
} |
| 596 |
|
596 |
|
| 597 |
//geom_ptr segment(0); |
597 |
//geom_ptr segment(0); |
| 598 |
geom_ptr mline (gf.createMultiLineString(lines.release())); |
598 |
geom_ptr mline (gf->createMultiLineString(lines.release())); |
| 599 |
//geom_ptr noded (segment->Union(mline.get())); |
599 |
//geom_ptr noded (segment->Union(mline.get())); |
| 600 |
LineMerger merger; |
600 |
LineMerger merger; |
| 601 |
//merger.add(noded.get()); |
601 |
//merger.add(noded.get()); |
|
Lines 612-619
Link Here
|
| 612 |
std::auto_ptr<LineString> pline ((*merged ) [i]); |
612 |
std::auto_ptr<LineString> pline ((*merged ) [i]); |
| 613 |
if (make_polygon && pline->getNumPoints() > 3 && pline->isClosed()) |
613 |
if (make_polygon && pline->getNumPoints() > 3 && pline->isClosed()) |
| 614 |
{ |
614 |
{ |
| 615 |
polys[totalpolys].polygon = gf.createPolygon(gf.createLinearRing(pline->getCoordinates()),0); |
615 |
polys[totalpolys].polygon = gf->createPolygon(gf->createLinearRing(pline->getCoordinates()),0); |
| 616 |
polys[totalpolys].ring = gf.createLinearRing(pline->getCoordinates()); |
616 |
polys[totalpolys].ring = gf->createLinearRing(pline->getCoordinates()); |
| 617 |
polys[totalpolys].area = polys[totalpolys].polygon->getArea(); |
617 |
polys[totalpolys].area = polys[totalpolys].polygon->getArea(); |
| 618 |
polys[totalpolys].iscontained = 0; |
618 |
polys[totalpolys].iscontained = 0; |
| 619 |
polys[totalpolys].containedbyid = 0; |
619 |
polys[totalpolys].containedbyid = 0; |
|
Lines 629-641
Link Here
|
| 629 |
//std::cerr << "polygon(" << osm_id << ") is no good: points(" << pline->getNumPoints() << "), closed(" << pline->isClosed() << "). " << writer.write(pline.get()) << std::endl; |
629 |
//std::cerr << "polygon(" << osm_id << ") is no good: points(" << pline->getNumPoints() << "), closed(" << pline->isClosed() << "). " << writer.write(pline.get()) << std::endl; |
| 630 |
double distance = 0; |
630 |
double distance = 0; |
| 631 |
std::auto_ptr<CoordinateSequence> segment; |
631 |
std::auto_ptr<CoordinateSequence> segment; |
| 632 |
segment = std::auto_ptr<CoordinateSequence>(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
632 |
segment = std::auto_ptr<CoordinateSequence>(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
| 633 |
segment->add(pline->getCoordinateN(0)); |
633 |
segment->add(pline->getCoordinateN(0)); |
| 634 |
for(unsigned i=1; i<pline->getNumPoints(); i++) { |
634 |
for(unsigned i=1; i<pline->getNumPoints(); i++) { |
| 635 |
segment->add(pline->getCoordinateN(i)); |
635 |
segment->add(pline->getCoordinateN(i)); |
| 636 |
distance += pline->getCoordinateN(i).distance(pline->getCoordinateN(i-1)); |
636 |
distance += pline->getCoordinateN(i).distance(pline->getCoordinateN(i-1)); |
| 637 |
if ((distance >= split_at) || (i == pline->getNumPoints()-1)) { |
637 |
if ((distance >= split_at) || (i == pline->getNumPoints()-1)) { |
| 638 |
geom_ptr geom = geom_ptr(gf.createLineString(segment.release())); |
638 |
geom_ptr geom = geom_ptr(gf->createLineString(segment.release())); |
| 639 |
|
639 |
|
| 640 |
//copy of an empty one should be cheapest |
640 |
//copy of an empty one should be cheapest |
| 641 |
wkts->push_back(geometry_builder::wkt_t()); |
641 |
wkts->push_back(geometry_builder::wkt_t()); |
|
Lines 643-649
Link Here
|
| 643 |
wkts->back().geom = writer.write(geom.get()); |
643 |
wkts->back().geom = writer.write(geom.get()); |
| 644 |
wkts->back().area = 0; |
644 |
wkts->back().area = 0; |
| 645 |
|
645 |
|
| 646 |
segment.reset(gf.getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
646 |
segment.reset(gf->getCoordinateSequenceFactory()->create((size_t)0, (size_t)2)); |
| 647 |
distance=0; |
647 |
distance=0; |
| 648 |
segment->add(pline->getCoordinateN(i)); |
648 |
segment->add(pline->getCoordinateN(i)); |
| 649 |
} |
649 |
} |
|
Lines 730-736
Link Here
|
| 730 |
} |
730 |
} |
| 731 |
} |
731 |
} |
| 732 |
|
732 |
|
| 733 |
Polygon* poly(gf.createPolygon(polys[i].ring, interior.release())); |
733 |
Polygon* poly(gf->createPolygon(polys[i].ring, interior.release())); |
| 734 |
poly->normalize(); |
734 |
poly->normalize(); |
| 735 |
polygons->push_back(poly); |
735 |
polygons->push_back(poly); |
| 736 |
} |
736 |
} |
|
Lines 738-744
Link Here
|
| 738 |
// Make a multipolygon if required |
738 |
// Make a multipolygon if required |
| 739 |
if ((toplevelpolygons > 1) && enable_multi) |
739 |
if ((toplevelpolygons > 1) && enable_multi) |
| 740 |
{ |
740 |
{ |
| 741 |
geom_ptr multipoly(gf.createMultiPolygon(polygons.release())); |
741 |
geom_ptr multipoly(gf->createMultiPolygon(polygons.release())); |
| 742 |
if (!multipoly->isValid() && (excludepoly == 0)) { |
742 |
if (!multipoly->isValid() && (excludepoly == 0)) { |
| 743 |
multipoly = geom_ptr(multipoly->buffer(0)); |
743 |
multipoly = geom_ptr(multipoly->buffer(0)); |
| 744 |
} |
744 |
} |