Giter Club home page Giter Club logo

geos's Introduction

GEOS -- Geometry Engine, Open Source

GEOS is a C++ library for performing operations on two-dimensional vector geometries. It is primarily a port of the JTS Topology Suite Java library. It provides many of the algorithms used by PostGIS, the Shapely package for Python, the sf package for R, and others.

More information is available the project homepage.

The official Git repository is at GitHub.

Build Status

CI Status CI Status CI Status
GitHub github Bessie bessie Debbie debbie
GitLab CI gitlab-ci Bessie32 bessie32 Winnie winnie
Berrie berrie Dronie dronie
Berrie64 berrie64

Community Resources

Build/Install

See the INSTALL file.

Reference Docs

See also the C API tutorial and the C++ API tutorial. There are code examples in the code repository.

Client Applications

Using the C interface

GEOS promises long-term stability of the C API. In general, successive releases of the C API may add new functions but will not remove or change existing types or function signatures. The C library uses the C++ interface, but the C library follows normal ABI-change-sensitive versioning, so programs that link only against the C library should work without relinking when GEOS is upgraded. For this reason, it is recommended to use the C API for software that is intended to be dynamically linked to a system install of GEOS.

The geos-config program can be used to determine appropriate compiler and linker flags for building against the C library:

CFLAGS += `geos-config --cflags`
LDFLAGS += `geos-config --ldflags` -lgeos_c

All functionality of the C API is available through the geos_c.h header file.

Documentation for the C API is provided via comments in the geos_c.h header file. C API usage examples can be found in the GEOS unit tests and in the source code of software that uses GEOS, such as PostGIS and the sf package for R.

Using the C++ interface

The C++ interface to GEOS provides a more natural API for C++ programs, as well as additional functionality that has not been exposed in the C API. However, developers who decide to use the C++ interface should be aware that GEOS does not promise API or ABI stability of the C++ API between releases. Breaking changes in the C++ API/ABI are not typically announced or included in the NEWS file.

The C++ library name will change on every minor release.

The geos-config program can be used to determine appropriate compiler and linker flags for building against the C++ library:

CFLAGS += `geos-config --cflags`
LDFLAGS += `geos-config --ldflags` -lgeos

A compiler warning may be issued when building against the C++ library. To remove the compiler warning, define USE_UNSTABLE_GEOS_CPP_API somewhere in the program.

Commonly-used functionality of GEOS is available in the geos.h header file. Less-common functionality can be accessed by including headers for individual classes, e.g. #include <geos/algorithm/distance/DiscreteHausdorffDistance.h>.

#include <geos.h>

C++ usage examples can be found in examples.

Using other languages

GEOS has bindings in many languages, see the bindings page.

Documentation

API documentation can be generated using Doxygen. Documentation is not included in the default build. To build the documentation, run:

cmake -DBUILD_DOCUMENTATION=YES
cmake --build . --target docs

Style

To format your code into the desired style, use the astyle version included in source tree:

tools/astyle.sh <yourfile.cpp>

Testing

See documentation in tests/README.md.

Tools

geos's People

Contributors

brendan-ward avatar buonomo avatar caspervdw avatar cfis avatar cvvergara avatar dbaston avatar doskabouter avatar dr-jts avatar eyal0 avatar gergondet avatar hobu avatar jericks avatar jorisvandenbossche avatar manisandro avatar mdsumner avatar mloskot avatar mngr777 avatar mwtoews avatar nilason avatar pramsey avatar robe2 avatar rouault avatar schwehr avatar sir-sigurd avatar strk avatar swongu avatar szekerest avatar vadimcn avatar warmerdam avatar whuaegeanse avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

geos's Issues

MultiLineString/Polygon difference runs abnormally slow in some circumstances

@LoicGoulefert and I ran into a test case where the difference between a MultiLineString and a simple Polygon would yield unusually large processing times (at least many minutes). The MLS contains ~100 lines, including some that are seriously degenerate. However, the polygon intersects only 2 lines, both of which being "normal".

Here is what the data looks like:
image

Here are the WKT for the data:

Unfortunately, I'm not a C++ user so I'm unable to prepare a demonstration example. The pygeos issue I originally filled (pygeos/pygeos#195) has some additional information and demo python scripts (both pygeos and shapely). While workaround were easily identified for our usage, we think this issue might still be worth investigating.

How to convert between CRSes (using Proj)?

I want to read in WKT serialized shapes in one CRS and return the WKT serialization of their corresponding shapes in a different CRS.

I was assuming this was a common operation, but I have not yet been able to get this functionality to work. I know that there are command-line tools that can do this (ogr2ogr from the GDAL project comes to mind, but I need a low-level function, and could not find this low-level function within the somewhat large and complex GDAL code base).

After some research I have come to the following understanding:

  • Library GEOS is able to read and write WKT serializations of shapes, but is not able to do CRS transformations.
  • Library Proj is able to do CRS transformations, but is not able to read and write WKT serializations for shapes (only WKT serializations for CRSes).

Given that my seemingly simple task is split across two libraries, what is the simplest way to convert datatype GEOSGeometry (GEOS) into datatype PJ_COORD (Proj), and back again? Preferably without too much loss of performance.

(I also have the feeling that I am overlooking something: is translating geometries between CRSes really this difficult with modern libraries? I'm hoping there is a straightforward solution somewhere that I have simply missed in my web searches ;-) )

makeValid generates unexpected output

std::string wkt = "FROM TXT FILE";
geos::operation::valid::MakeValid makeValid;
geos::io::WKTReader wktReader;
std::shared_ptr geometry(wktReader.read(wkt));
std::cout << "preMkValid: " << geometry->getArea() << endl;
geometry = makeValid.build(geometry.get());
std::cout << "postMkValid: " << geometry->getArea() << endl;

Output is:
preMkValid: 1.11382
postMkValid: 4205.05

Attached is the wkt. After calling make valid, the difference in area becomes massive. This is a bathymetry geometry. The original geometry is just the border (first image with ice sheet unfilled), but after calling makeValid.build(geom), the new geometry becomes the entire ice sheet (second image with ice sheet filled). Desirably, it should still resemble the original geometry with just its borders.
Screen Shot 2020-07-15 at 2 35 15 PM
Screen Shot 2020-07-15 at 1 52 13 PM

GoesBathymetryBug.txt

CMake build does not install symlinks for libgeos.so.<version>

Using 3.8.0 release tar ball from github and using cmake:

mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release ..
make install

Symlink to libgeos_c.so.1.13.1 are installed but not for libgeos.so.3.8.0, note that symlink is present in the build/lib folder but doesn't get copied into /usr/lib/ by make install

Install the project...
-- Install configuration: "Release"
-- Installing: /usr/local/lib/libgeos.so.3.8.0
-- Installing: /usr/local/lib/libgeos_c.so.1.13.1
-- Installing: /usr/local/lib/libgeos_c.so.1
-- Set runtime path of "/usr/local/lib/libgeos_c.so.1.13.1" to ""
-- Installing: /usr/local/lib/libgeos_c.so
...

I'm using cmake 3.16.0 on Ubuntu 18.04

cmake --version
cmake version 3.16.0

CMake suite maintained and supported by Kitware (kitware.com/cmake).

makevalid failure

std::vector v;
v.push_back(Coordinate(2.22, 2.28));
v.push_back(Coordinate(7.67, 2.06));
v.push_back(Coordinate(10.98, 7.70));
v.push_back(Coordinate(9.39, 5.00));
v.push_back(Coordinate(7.96, 7.12));
v.push_back(Coordinate(6.77, 5.16));
v.push_back(Coordinate(7.43, 6.24));
v.push_back(Coordinate(3.70, 7.22));
v.push_back(Coordinate(5.72, 5.77));
v.push_back(Coordinate(4.18, 10.74));
v.push_back(Coordinate(2.20, 6.83));
v.push_back(Coordinate(2.22, 2.28));

geos::geom::Polygon* errplyg = MakePolygon(v);
wkt_print_geom(errplyg);
MakeValid mkvalid;
try {
auto validGeom = mkvalid.build(errplyg);
wkt_print_geom(validGeom.get());
} catch (const GEOSException& exc) {
cerr << "GEOS Exception: " << exc.what() << "\n";
exit(1);
} catch (const exception& e) {
cerr << "Standard exception thrown: " << e.what() << endl;
exit(1);
}
// and this is a catch-all non standard ;)
catch (...) {
cerr << "unknown exception trown!\n";
exit(1);
}
/////////////
raise debug assertion failed in mkvalid.build(errplyg), error :
...\include\vector Line: 1742
Expression: vector subscript out of range

Length of the Geometry.

Hi,

I am creating a LineString object using GeometryFactory and specifying a PrecisionModel. I do that as follows:
PrecisionModel* pm = new PrecisionModel(10000);
auto global_factory = GeometryFactory::create(pm, 3857)

The CoordinateArraySequence contains geographical coordinates in decimal degrees, the longitude and latitude. The LineString is created as follows:
const Geometry* ls = global_factory->createLineString(cl);, where
cl is the CoordinateArraySequence*.

When I do ls->getLength(), the length I see is wrong. It gives me some garbage values. Where am I going wrong?

Any help will be greatly appreciated. Thanks.

Ring Self-intersection

I was getting an error about a self-intersecting ring when I tried to take the CascadedUnion of the following two shapes:

MULTIPOLYGON(((2.0625 0.957,2.06274 0.959439,2.06345 0.961784,2.06461 0.963945,2.06616 0.965839,2.06806 0.967393,2.07022 0.968548,2.07256 0.96926,2.075 0.9695,2.07744 0.96926,2.07978 0.968548,2.08194 0.967393,2.08384 0.965839,2.08539 0.963945,2.08655 0.961784,2.08726 0.959439,2.0875 0.957,2.0875 0.882,2.08726 0.879561,2.08655 0.877216,2.08539 0.875055,2.08384 0.873161,2.08194 0.871607,2.07978 0.870452,2.07744 0.86974,2.075 0.8695,2.07256 0.86974,2.07022 0.870452,2.06806 0.871607,2.06616 0.873161,2.06461 0.875055,2.06345 0.877216,2.06274 0.879561,2.0625 0.882,2.0625 0.957)))

MULTIPOLYGON(((2.175 0.9695,2.17744 0.96926,2.17978 0.968548,2.18194 0.967393,2.18384 0.965839,2.18539 0.963945,2.18655 0.961784,2.18726 0.959439,2.1875 0.957,2.18726 0.954561,2.18655 0.952216,2.18539 0.950055,2.18384 0.948161,2.18194 0.946607,2.17978 0.945452,2.17744 0.94474,2.175 0.9445,2.1 0.9445,2.09756 0.94474,2.09522 0.945452,2.09306 0.946607,2.09116 0.948161,2.08961 0.950055,2.08845 0.952216,2.08774 0.954561,2.0875 0.957,2.08774 0.959439,2.08845 0.961784,2.08961 0.963945,2.09116 0.965839,2.09306 0.967393,2.09522 0.968548,2.09756 0.96926,2.1 0.9695,2.175 0.9695)))

The error seems to have been fixed by commit be81a1e , which enables OverlayNG by default.

Build errors on a Mac ARM64 system

Hello,
I am trying to build libgeos on my Mac ARM64 system (MBP 2020). When I build the library, there are errors as below:

isong@Insangs-MacBook-Pro geos-3.8.1 % sudo make
/Applications/Xcode-beta.app/Contents/Developer/usr/bin/make  all-recursive
Making all in include
/Applications/Xcode-beta.app/Contents/Developer/usr/bin/make  all-recursive
Making all in geos
Making all in algorithm
Making all in locate

[truncated]

duplicate symbol 'vtable for geos::noding::BasicSegmentString' in:
    .libs/inlines.o
    noding/.libs/libnoding.a(BasicSegmentString.o)
duplicate symbol 'typeinfo name for geos::noding::BasicSegmentString' in:
    .libs/inlines.o
    noding/.libs/libnoding.a(BasicSegmentString.o)
duplicate symbol 'typeinfo for geos::noding::BasicSegmentString' in:
    .libs/inlines.o
    noding/.libs/libnoding.a(BasicSegmentString.o)
ld: 3 duplicate symbols for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [libgeos.la] Error 1
make[2]: *** [all-recursive] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

Does anyone have any idea for this problem?
Thank you.

Update swig

  1. need to update swig/geos.i file in order to include the latest functions of capi/geos_c.h
  2. need to support java in swig

GEOSLargestEmptyCircle returns circles which partially fall outside the boundary

Using the GEOSLargestEmptyCircle_r method with a polygon boundary I frequently see results where the returned linestring center sits right on the boundary line, e.g. in the example below (grey is the boundary, red is the geometry, and blue is the result)

image

This seems counter-intuitive to me. If the boundary is specfied then I would expect the returned circle to sit completely within this boundary, instead of the current behaviour which seems to be that the circle center has to be inside the boundary.

Possibly this is the intended behaviour, in which case this is a documentation issue.

CMake config exports path causing compilation problems on MSVC

The cmake target include directories for geos and geos_c add the geos subdirectory to the install interface:

target_include_directories(geos_c
PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
    $<INSTALL_INTERFACE:include/geos>)

This directory contains the very generic io.h which clashes on windows with io.h header from the windows sdk.

I think the $<INSTALL_INTERFACE:include/geos> entry should be removed as includes of the c++ api are done with geos/ prefix anyway.

same for the geos target.

geos-config reports wrong libs for mingw/msys2 on Windows

After compiling and installing geos on Windows under mingw and msys2, -geos-config --libs prints this:

-L/home/eyal0/.local/lib -lgeos-3.8.1

However, those flags do not work. I tried every combination of one of these:

  • -L/home/eyal0/.local/lib
  • -L/home/eyal0/.local/bin

with one of these:

  • -lgeos
  • -llibgeos
  • -lgeos-3.8.1
  • -llibgeos-3.8.1

The only two combinations that work on Windows are:

  • -L/home/eyal0/.local/lib -lgeos
  • -L/home/eyal0/.local/lib -llibgeos

On Unix, these two work:

  • -L/home/eyal0/.local/lib -lgeos
  • -L/home/eyal0/.local/lib -lgeos-3.8.1

That first one is in common on both so I suggest that geos-config return the former in all cases.

Unit of distance.

Hi,

I am finding hard to understand the unit of double distance, the width of the buffer around a geometry. When I am trying to form a buffer around a linestring or any geometry, what units should the width of the buffer be? Please let me know.

Thanks.

Docker image for geosop

Hello!

I read @dr-jts' post on geosop and thought it looked handy. I was wondering if there would be support for maintaining a Docker image that would make it easier for people to make use of it.

Something like the Dockerfile below should do the trick (the default VERSON of 47f145e was just to get something going):

FROM docker.osgeo.org/geos/build-test:alpine AS base
ARG VERSION=47f145e

WORKDIR /source
RUN wget --quiet https://github.com/libgeos/geos/archive/${VERSION}.tar.gz --output-document - \
  | tar xz --directory=. --strip-components=1

WORKDIR /build
RUN cmake -D CMAKE_BUILD_TYPE=Release -D BUILD_BENCHMARKS=OFF -D BUILD_TESTING=OFF /source \
  && make install \
  && cp bin/geosop /usr/local/bin/geosop

WORKDIR /install/bin
RUN cp --no-dereference /usr/local/bin/geos* . \
  && for i in ./*; do strip -s $i 2>/dev/null || /bin/true; done

WORKDIR /install/lib
RUN cp --no-dereference /usr/local/lib64/libgeos*.so.* . \ 
  && for i in ./*; do strip -s $i 2>/dev/null || /bin/true; done


FROM alpine
RUN apk add --no-cache libstdc++
COPY --from=base /install/bin/geos* /usr/local/bin/
COPY --from=base /install/lib/libgeos* /usr/local/lib/

ENTRYPOINT ["geosop"]

If this were tagged & published as docker.osgeo.org/geos/geosop:alpine, then people could do this to try out geosop:

docker run --rm docker.osgeo.org/geos/geosop:alpine -a 'POINT(1 2)' --format=wkt buffer 3

The resulting image is just under 11 MB - so not great, but also not too bad.

I guess this would be something that might live in https://git.osgeo.org/gitea/geos/geos-docker. It seems like the same image (without the geosop entrypoint) could also be useful for people wanting to start with a geos install (though I'm uncertain if the install above is sufficient for all purposes). Let me know if this is a better question for that issue tracker or someplace else.

Geometry->difference() crashes

I originally opened this issue in gdal repository, but it turns out to be a geos error.
So open it here.

With the following code I expect to get the difference between two geometries

Instead I get the following error:

/usr/include/c++/7/debug/vector:424:
Error: attempt to subscript container with out-of-bounds index 2, but 
container only holds 2 elements.

Objects involved in the operation:
    sequence "this" @ 0x0x555555772548 {
      type = std::__debug::vector<geos::geom::Coordinate, std::allocator<geos::geom::Coordinate> >;
    }

which happens in this vector access

Steps to reproduce the problem.

Compile the following code with geos 3.8.0.

#include <iostream>
#include <memory>

#include <geos/geom/GeometryFactory.h>
#include <geos/geom/Geometry.h>
#include <geos/io/WKTWriter.h>
#include <geos/io/WKTReader.h>

struct Rectangle {
  double west = -180.0;
  double east = 180.0;
  double south = -90.0;
  double north = 90.0;
};
std::unique_ptr< geos::geom::Geometry >  CreateRectangleGeometry(const Rectangle& rect) {
  auto wkt_reader = geos::io::WKTReader();
  std::string wkt = "POLYGON((" + 
                    std::to_string(rect.west) + " " + 
                    std::to_string(rect.north) + ", " + 
                    std::to_string(rect.east) + " " + 
                    std::to_string(rect.north) + ", "+ 
                    std::to_string(rect.east) + " " + 
                    std::to_string(rect.south) + ", " + 
                    std::to_string(rect.west) + " " + 
                    std::to_string(rect.south) +", " + 
                    std::to_string(rect.west) + " " + 
                    std::to_string(rect.north) +
                    "))";
  auto geom = wkt_reader.read(wkt);
  return geom;

}

int main(int argc, char* argv[]){
  Rectangle rect;
  rect.west = 0.0;
  rect.east = 2.0;
  rect.south = 0.0;
  rect.north = 2.0;

  Rectangle rect2;
  rect2.west = 0.1;
  rect2.east = 4.0;
  rect2.south = 0.1;
  rect2.north = 1.9;
  
  auto geom1 = CreateRectangleGeometry(rect);
  auto geom2 = CreateRectangleGeometry(rect2);
  auto geom3 = geom2->difference(geom1.get());

  geos::io::WKTWriter writer;
  std::cout << writer.write(geom3.get());
  return 0;
}

Operating system

Ubuntu 18.04.2 LTS 64 bit

GEOS version

Self compiled GEOS 3.8.0.

geos-config from cmake does not match that from autotools

The geos-config file generated under cmake does not match that for autotools, which later impacts on GDAL builds under FreeBSD (via Cirrus CI) using a perl alien ecosystem (overall CI system at https://github.com/shawnlaffan/geo-gdal-ffi-canary/).

Differences noted are from the 3.9.0 release tarball.

The main difference seems to be due to these lines (autotools, then cmake):

echo -L${libdir} -lgeos-@VERSION_RELEASE@

echo -L${libdir} -lgeos-@GEOS_VERSION_MAJOR@

In autotools this results in

      echo -L${libdir} -lgeos-3.9.0

under cmake this results in

      echo -L${libdir} -lgeos-3

Should the cmake file use -lgeos-@GEOS_VERSION@ instead of -lgeos-@GEOS_VERSION_MAJOR@?

As an additional data point, libgeos-3.9.0.so is generated under autotools, but not under cmake. Instead, libgeos.so.3.9.0 is created. Similarly, autotools has libgeos_c.so.17 while cmake has libgeos_c.so.1. Perhaps that should be a separate issue, though.

Thanks,
Shawn.

C++ unstable warning can't be depressed.

#define USE_UNSTABLE_GEOS_CPP_API can't stop the compiler warning. ""
And the warning is only stoppable in current version by define both _MSC_VER and USE_UNSTABLE_GEOS_CPP_API.
But define _MSC_VER may potentially cause other issues.

In geos/include/geos/geom/Geometry.h

#ifndef USE_UNSTABLE_GEOS_CPP_API
#ifndef _MSC_VER
# warning "The GEOS C++ API is unstable, please use the C API instead"
# warning "HINT: #include geos_c.h"
#else
#pragma message("The GEOS C++ API is unstable, please use the C API instead")
#pragma message("HINT: #include geos_c.h")
#endif
#endif

New algorithm for planar `st_make_valid`

GEOS 3.10 will include a new method for making invalid geometries valid. Should this method become the default in sf ? Is there interest in exposing parameters for the "MakeValid" algortithm in sf ? Currently the parameters would be:

  • choice of algorithm
  • whether "collapsed geometries" should be retained (e.g., an invalid polygon that is turned into a line)

The major difference between the two algorithms is the handling of invalid polygons with self-intersections and overlaps Here's some examples of how the new algorithm handles invalid polygonal geometry:

Polygon with self-overlap

image

Old result:

image

Polygon with overlapping holes

image

Old result:
image

MultiPolygon with overlapping elements

image

Old result:
image

Originally posted by @dr-jts in #433 (comment)

Inconsistent intersection between (Multi)Polygons

Hi,

Thanks for the great lib, since I'm now a maintainer of https://github.com/rgeo/rgeo, hence I use it a lot 🙂

Context

We recently encountered a weird intersection issue. I'll try to give you some context here, you can skip to reproduction if you want. We have a geometry subtraction tool in my company, so when we sub a geometry a from a geometry b, we get c (= b - a). The issue is that due to border simplification we sometimes have tiny polygons left here and there. So we added a tool to remove those if area is small enough. So now we get d (= filter(c, area > 1e-4). The issue is that it changes the intersection between the result (d or c) and a. Meaning inter(c, a) is a MultiLineString, which is expected. However inter(d, a) is a GeometryCollection containing a small polygon. And this really is not expected.

Reproduction

WKT files

The result of b - a (save it under c.wkt):

MULTIPOLYGON (((-2.621863 47.411589, -2.621022 47.4132, -2.617341 47.411687, -2.622267 47.409085, -2.626996 47.411454, -2.621863 47.411589)), ((-2.396067 46.725287, -2.394785 46.726343, -2.386636 46.727524, -2.386744 46.729856, -2.383932 46.730746, -2.381656 46.733492, -2.376994 46.732368, -2.374453 46.733779, -2.370908 46.731882, -2.362734 46.730762, -2.360788 46.72923, -2.358503 46.729831, -2.354402 46.727892, -2.347617 46.72901, -2.344215 46.727768, -2.342028 46.725752, -2.343392 46.723519, -2.340689 46.72024, -2.338244 46.719071, -2.333706 46.718947, -2.328172 46.720731, -2.31797 46.719928, -2.318151 46.718269, -2.311047 46.712271, -2.306086 46.711201, -2.30527 46.709631, -2.297268 46.705275, -2.292895 46.700497, -2.285616 46.695338, -2.282817 46.691852, -2.286244 46.691103, -2.28997 46.692848, -2.295227 46.693234, -2.300247 46.692511, -2.311692 46.696084, -2.31451 46.695542, -2.315733 46.693043, -2.318217 46.691689, -2.324073 46.690871, -2.324723 46.689178, -2.327817 46.687013, -2.332564 46.686222, -2.333504 46.689464, -2.336554 46.689557, -2.342811 46.693797, -2.347235 46.69353, -2.350967 46.69182, -2.356478 46.695914, -2.361526 46.694648, -2.36539 46.695159, -2.365526 46.697322, -2.368261 46.698259, -2.369496 46.701991, -2.376188 46.703097, -2.377411 46.700235, -2.379784 46.698845, -2.382168 46.700143, -2.378908 46.704513, -2.383849 46.70793, -2.392515 46.710773, -2.39837 46.716808, -2.397708 46.720376, -2.399906 46.725596, -2.396067 46.725287)), ((-2.230369 46.973081, -2.226064 46.976241, -2.184047 46.960024, -2.176818 46.958555, -2.168322 46.95545, -2.156752 46.950159, -2.147171 46.934004, -2.152435 46.932254, -2.151672 46.928426, -2.150321 46.927034, -2.146808 46.926405, -2.146666 46.924664, -2.150446 46.920275, -2.150522 46.915725, -2.148591 46.914739, -2.149738 46.909734, -2.153081 46.907127, -2.148727 46.899156, -2.147928 46.894474, -2.151193 46.894367, -2.157461 46.895924, -2.163171 46.900671, -2.165832 46.904018, -2.175606 46.927564, -2.179988 46.934777, -2.1881 46.943042, -2.207178 46.957153, -2.220177 46.964161, -2.225005 46.965292, -2.241049 46.964841, -2.247205 46.963075, -2.253015 46.958805, -2.259067 46.958242, -2.262704 46.959556, -2.26771 46.963712, -2.269633 46.966718, -2.28464 46.982306, -2.290176 46.984842, -2.293423 46.984225, -2.30153 46.989056, -2.302969 46.990916, -2.303162 46.99365, -2.301153 46.99849, -2.296175 47.00378, -2.293682 47.007307, -2.292641 47.010344, -2.293106 47.012564, -2.295383 47.013143, -2.296226 47.016645, -2.301378 47.01837, -2.303318 47.022729, -2.307609 47.024979, -2.30127 47.02634, -2.30002 47.024241, -2.287778 47.024846, -2.277033 47.02908, -2.269047 47.027535, -2.262399 47.028632, -2.257233 47.027431, -2.251192 47.027593, -2.246092 47.020563, -2.239233 47.017629, -2.224768 47.016699, -2.219159 47.011438, -2.218033 47.007417, -2.219605 47.005469, -2.219919 47.002165, -2.217972 46.992954, -2.218337 46.990594, -2.221978 46.990091, -2.226809 46.992977, -2.240805 46.998578, -2.240203 46.995897, -2.242174 46.995053, -2.237488 46.995876, -2.235658 46.995358, -2.232504 46.988224, -2.235452 46.986629, -2.237233 46.980787, -2.232285 46.976376, -2.232589 46.975145, -2.230369 46.973081)), ((-2.032471 47.301418, -2.047088 47.303759, -2.070082 47.303588, -2.101196 47.304865, -2.101561 47.305742, -2.115001 47.304451, -2.14522 47.298243, -2.158458 47.293785, -2.171742 47.288058, -2.175215 47.290613, -2.178078 47.296392, -2.181919 47.298571, -2.180026 47.296141, -2.181625 47.293486, -2.180627 47.291979, -2.18358 47.290141, -2.184436 47.288018, -2.181093 47.284576, -2.19301 47.27742, -2.200859 47.270314, -2.205208 47.270956, -2.220921 47.267181, -2.22442 47.265265, -2.225089 47.263659, -2.222896 47.259194, -2.223499 47.258021, -2.230261 47.255381, -2.235943 47.25629, -2.246568 47.256045, -2.249552 47.253687, -2.253222 47.253178, -2.256689 47.249913, -2.259472 47.24924, -2.262633 47.241759, -2.266518 47.239978, -2.2674 47.238492, -2.27495 47.239426, -2.276866 47.237413, -2.290315 47.237208, -2.292925 47.234868, -2.297118 47.23475, -2.298547 47.233423, -2.303723 47.237117, -2.306353 47.23713, -2.310499 47.2409, -2.315462 47.243293, -2.317761 47.242668, -2.321346 47.245834, -2.335951 47.25263, -2.340725 47.255858, -2.345788 47.257087, -2.348818 47.255448, -2.352335 47.257616, -2.347052 47.260238, -2.345357 47.263794, -2.348532 47.26699, -2.357651 47.272592, -2.370911 47.277394, -2.382379 47.279977, -2.394382 47.281036, -2.404457 47.280026, -2.413941 47.278062, -2.421645 47.274916, -2.424338 47.270203, -2.422026 47.266535, -2.419627 47.265173, -2.416877 47.261842, -2.416904 47.258339, -2.419228 47.258168, -2.425092 47.25965, -2.432837 47.259136, -2.436961 47.26047, -2.447592 47.261635, -2.44995 47.263626, -2.452681 47.263718, -2.455711 47.267275, -2.461311 47.270003, -2.467812 47.26927, -2.47247 47.269607, -2.484754 47.2744, -2.494867 47.274591, -2.494526 47.277769, -2.498347 47.280439, -2.503893 47.280678, -2.513027 47.28274, -2.515433 47.28493, -2.523653 47.28705, -2.526893 47.286347, -2.543319 47.290004, -2.546232 47.289367, -2.547755 47.290906, -2.547889 47.293795, -2.544397 47.299897, -2.541994 47.301032, -2.536151 47.299633, -2.535245 47.301632, -2.531421 47.302465, -2.520789 47.301543, -2.518781 47.299918, -2.513601 47.298348, -2.510758 47.295315, -2.506895 47.293548, -2.50171 47.28956, -2.50206 47.287898, -2.499592 47.286927, -2.490731 47.286932, -2.487757 47.289015, -2.484267 47.288428, -2.480993 47.286276, -2.476462 47.285681, -2.4804 47.293181, -2.47321 47.295023, -2.46947 47.294832, -2.47352 47.299412, -2.479018 47.300779, -2.484596 47.300905, -2.489031 47.302236, -2.491319 47.300486, -2.494249 47.302252, -2.497391 47.301575, -2.498338 47.304375, -2.496454 47.305774, -2.488398 47.305116, -2.484238 47.3061, -2.478942 47.305686, -2.47456 47.306273, -2.471522 47.309551, -2.472992 47.310511, -2.472841 47.313629, -2.478536 47.3137, -2.477223 47.317924, -2.482679 47.315872, -2.485329 47.313772, -2.493124 47.312661, -2.500893 47.312989, -2.504268 47.310794, -2.506135 47.307831, -2.509595 47.304921, -2.51125 47.300546, -2.514332 47.304018, -2.510219 47.306893, -2.506862 47.310939, -2.504721 47.315093, -2.503552 47.321118, -2.503429 47.326102, -2.505202 47.336169, -2.508813 47.34435, -2.512537 47.347717, -2.517071 47.349677, -2.522182 47.359359, -2.52584 47.36112, -2.528173 47.363333, -2.531667 47.365337, -2.545242 47.365822, -2.545159 47.367899, -2.551952 47.368958, -2.558986 47.375398, -2.556204 47.376073, -2.556182 47.378408, -2.551052 47.379335, -2.547107 47.382088, -2.545567 47.381058, -2.534487 47.383279, -2.532108 47.385604, -2.529011 47.386636, -2.523317 47.392013, -2.518986 47.394156, -2.516026 47.394488, -2.511391 47.399018, -2.506331 47.400758, -2.502347 47.403318, -2.492706 47.40423, -2.489738 47.406447, -2.488442 47.411232, -2.48423 47.413295, -2.482603 47.411988, -2.476268 47.413318, -2.474352 47.416495, -2.470823 47.416352, -2.468323 47.418039, -2.466588 47.415659, -2.462256 47.41219, -2.458631 47.411853, -2.455308 47.414734, -2.450899 47.410604, -2.448947 47.4102, -2.446185 47.412218, -2.444569 47.411642, -2.439075 47.414501, -2.43478 47.413769, -2.434457 47.412293, -2.43136 47.415814, -2.4355 47.417316, -2.440713 47.421635, -2.447632 47.422052, -2.451178 47.425542, -2.45402 47.425584, -2.457915 47.422973, -2.458022 47.425917, -2.456099 47.427537, -2.452686 47.43391, -2.450198 47.435292, -2.446264 47.435528, -2.446032 47.437108, -2.448735 47.441056, -2.458047 47.448849, -2.453099 47.456103, -2.453694 47.459398, -2.453198 47.462402, -2.442115 47.466253, -2.437614 47.465803, -2.434242 47.472021, -2.429674 47.475703, -2.423091 47.477208, -2.418687 47.471922, -2.423102 47.468605, -2.417893 47.466896, -2.416747 47.460182, -2.399849 47.455918, -2.390107 47.456904, -2.383259 47.4601, -2.383706 47.461882, -2.37254 47.462714, -2.368375 47.464404, -2.362797 47.459342, -2.354963 47.455105, -2.35242 47.454582, -2.34933 47.457889, -2.339966 47.458187, -2.337783 47.459887, -2.326743 47.458747, -2.316847 47.461387, -2.311697 47.465132, -2.314021 47.474805, -2.313082 47.478229, -2.313854 47.482237, -2.313284 47.485875, -2.303852 47.491571, -2.301884 47.49752, -2.29908 47.500598, -2.299077 47.504427, -2.296762 47.509176, -2.296383 47.512294, -2.298692 47.514168, -2.298521 47.515924, -2.297174 47.515864, -2.295476 47.514515, -2.286997 47.513074, -2.280773 47.509372, -2.278409 47.511676, -2.275381 47.512598, -2.270888 47.510816, -2.266628 47.510512, -2.266105 47.511753, -2.26181 47.513486, -2.255131 47.511629, -2.254413 47.507746, -2.25724 47.505158, -2.260321 47.504482, -2.265594 47.501741, -2.254492 47.49833, -2.244274 47.493665, -2.229372 47.498886, -2.228538 47.500708, -2.222715 47.502235, -2.222909 47.504272, -2.220646 47.50555, -2.217299 47.505715, -2.215217 47.508435, -2.208157 47.510131, -2.187787 47.512461, -2.184501 47.512184, -2.186332 47.506421, -2.184156 47.504548, -2.183562 47.50179, -2.187046 47.499948, -2.192482 47.500039, -2.192134 47.496809, -2.189648 47.494272, -2.18436 47.492607, -2.181866 47.490493, -2.17271 47.492056, -2.165745 47.490113, -2.162752 47.49112, -2.154222 47.496469, -2.154342 47.507479, -2.152841 47.510461, -2.154814 47.514412, -2.156038 47.521965, -2.151257 47.522632, -2.143947 47.52517, -2.135095 47.525758, -2.130631 47.527491, -2.131619 47.531043, -2.123606 47.528474, -2.118844 47.528074, -2.114499 47.528428, -2.098786 47.533709, -2.097354 47.5414, -2.104587 47.546741, -2.104271 47.549815, -2.100822 47.553526, -2.101698 47.5543, -2.098806 47.566456, -2.096474 47.570996, -2.096637 47.572719, -2.098345 47.575149, -2.101614 47.576809, -2.104606 47.575111, -2.105622 47.577712, -2.101399 47.578554, -2.099452 47.58102, -2.10368 47.589745, -2.102346 47.5957, -2.085928 47.60337, -2.083998 47.611046, -2.083987 47.617469, -2.084908 47.621377, -2.08681 47.624459, -2.091357 47.628687, -2.096609 47.631386, -2.091238 47.639456, -2.090796 47.642062, -2.086667 47.644223, -2.08225 47.649809, -2.073943 47.652002, -2.066979 47.649735, -2.054096 47.649406, -2.05066 47.650377, -2.051021 47.652612, -2.048269 47.658264, -2.049962 47.66196, -2.047117 47.664246, -2.04065 47.667209, -2.038964 47.66983, -2.028961 47.666908, -2.018135 47.667206, -2.012194 47.66657, -2.006922 47.672805, -2.003368 47.673343, -1.987418 47.68147, -1.978819 47.691182, -1.973482 47.694467, -1.972564 47.694085, -1.971963 47.691598, -1.969086 47.689934, -1.968717 47.67965, -1.969567 47.67368, -1.966488 47.671687, -1.956786 47.671203, -1.953197 47.672749, -1.941726 47.683788, -1.935473 47.686857, -1.917472 47.691323, -1.913187 47.691453, -1.898365 47.69563, -1.891284 47.696251, -1.889347 47.695269, -1.885349 47.696019, -1.88238 47.6951, -1.877289 47.69553, -1.872496 47.699317, -1.866518 47.701956, -1.865593 47.705571, -1.862066 47.707683, -1.85753 47.708355, -1.841121 47.705556, -1.834662 47.708284, -1.829945 47.709089, -1.828497 47.710461, -1.825376 47.709849, -1.825414 47.708163, -1.820263 47.704654, -1.816739 47.705864, -1.812475 47.704312, -1.804559 47.703382, -1.802568 47.70149, -1.796402 47.700805, -1.790005 47.70209, -1.785757 47.699711, -1.780749 47.69979, -1.77076 47.698226, -1.761184 47.702489, -1.75953 47.704506, -1.75169 47.70746, -1.744865 47.706725, -1.7427 47.704912, -1.737623 47.704811, -1.729258 47.699144, -1.723193 47.698416, -1.72024 47.699437, -1.713787 47.699349, -1.708816 47.701469, -1.703854 47.700423, -1.704907 47.70944, -1.70699 47.714325, -1.695353 47.714038, -1.694416 47.712286, -1.688897 47.713412, -1.685081 47.713114, -1.684376 47.711579, -1.675708 47.712319, -1.673337 47.711687, -1.665213 47.712729, -1.66352 47.710398, -1.660306 47.709126, -1.657097 47.709582, -1.65464 47.712281, -1.655689 47.715241, -1.651876 47.717504, -1.649932 47.717592, -1.648501 47.720813, -1.644316 47.722127, -1.638171 47.722279, -1.639863 47.726182, -1.639362 47.730033, -1.636424 47.738925, -1.636647 47.74256, -1.63334 47.744791, -1.628072 47.752578, -1.625981 47.757633, -1.627313 47.759708, -1.623709 47.762081, -1.623114 47.763527, -1.619787 47.764143, -1.618061 47.761999, -1.612472 47.764661, -1.605537 47.762378, -1.598226 47.766401, -1.594934 47.766713, -1.593741 47.768099, -1.598725 47.769817, -1.594767 47.772475, -1.594098 47.775616, -1.589902 47.776335, -1.586419 47.779695, -1.582239 47.778262, -1.566656 47.778683, -1.557816 47.783831, -1.55339 47.785408, -1.550359 47.782964, -1.540445 47.784421, -1.532876 47.783842, -1.529209 47.784601, -1.520257 47.793485, -1.503164 47.801418, -1.503179 47.799718, -1.499827 47.798236, -1.491146 47.798185, -1.48819 47.799679, -1.473847 47.801816, -1.47101 47.802984, -1.466921 47.807365, -1.467865 47.810755, -1.470056 47.812331, -1.469726 47.814763, -1.471831 47.818313, -1.47411 47.819752, -1.473799 47.822484, -1.475069 47.825186, -1.477517 47.827048, -1.481217 47.828164, -1.483313 47.831372, -1.479867 47.835255, -1.476211 47.835506, -1.475018 47.833411, -1.47012 47.833091, -1.462741 47.83592, -1.460765 47.835312, -1.459005 47.831697, -1.454518 47.831057, -1.452499 47.832648, -1.447314 47.833203, -1.439669 47.830436, -1.42984 47.831908, -1.428351 47.833098, -1.423378 47.832633, -1.417849 47.827265, -1.414613 47.827441, -1.412834 47.828888, -1.409122 47.827383, -1.405662 47.82448, -1.401128 47.826228, -1.398512 47.829082, -1.393528 47.829203, -1.388699 47.827847, -1.388254 47.826142, -1.381639 47.823305, -1.380017 47.818577, -1.376538 47.814391, -1.377883 47.810036, -1.373907 47.808265, -1.364594 47.806634, -1.361665 47.803568, -1.364832 47.799063, -1.353869 47.797819, -1.324785 47.792124, -1.318185 47.79231, -1.302195 47.789081, -1.290954 47.785779, -1.245919 47.776756, -1.244387 47.779582, -1.244447 47.782552, -1.240709 47.793548, -1.237503 47.795579, -1.236516 47.798334, -1.240114 47.80231, -1.239932 47.806552, -1.242613 47.807924, -1.238817 47.809697, -1.236455 47.812168, -1.233694 47.816931, -1.235299 47.817923, -1.231923 47.820382, -1.226021 47.820501, -1.222942 47.819323, -1.220321 47.820261, -1.222285 47.822626, -1.221509 47.826246, -1.216082 47.831699, -1.216049 47.836153, -1.215188 47.837, -1.213929 47.84413, -1.216326 47.847405, -1.221778 47.849353, -1.223254 47.85229, -1.218583 47.854604, -1.216224 47.857083, -1.210087 47.857185, -1.206376 47.858619, -1.202776 47.856993, -1.198749 47.860803, -1.19715 47.863732, -1.191012 47.865806, -1.189073 47.867946, -1.189094 47.870849, -1.191788 47.875149, -1.19711 47.877448, -1.196626 47.889177, -1.191832 47.892189, -1.181823 47.892065, -1.180594 47.895211, -1.176062 47.897537, -1.177129 47.901637, -1.175255 47.911961, -1.171828 47.912663, -1.168179 47.916279, -1.168589 47.918181, -1.167009 47.922074, -1.164464 47.92539, -1.163529 47.92902, -1.166081 47.931024, -1.167361 47.935701, -1.159938 47.939145, -1.162398 47.94475, -1.161152 47.948208, -1.161542 47.95276, -1.158878 47.953905, -1.160423 47.958684, -1.158313 47.958934, -1.156142 47.961966, -1.156492 47.964199, -1.148455 47.968133, -1.141389 47.967438, -1.137832 47.970192, -1.136057 47.968133, -1.132436 47.968674, -1.132907 47.970937, -1.130878 47.971766, -1.125545 47.971404, -1.127736 47.97482, -1.125088 47.977044, -1.124469 47.979656, -1.128223 47.981738, -1.125138 47.983066, -1.126401 47.985525, -1.124842 47.986796, -1.119841 47.985733, -1.113603 47.988891, -1.110546 47.988102, -1.108127 47.989267, -1.10122 47.989307, -1.098702 47.988577, -1.09799 47.986756, -1.092932 47.987566, -1.083554 47.986194, -1.081571 47.984473, -1.078737 47.984359, -1.071053 47.981817, -1.065091 47.984909, -1.05062 47.984413, -1.045929 47.985606, -1.04536 47.987936, -1.035364 47.991991, -1.03001 47.992365, -1.028324 47.993568, -1.023042 47.994246, -1.019834 47.997361, -1.020116 48.000097, -1.016049 48.002786, -1.019016 48.005069, -1.016721 48.008284, -1.018396 48.013079, -1.021331 48.017532, -1.025043 48.020415, -1.032872 48.031114, -1.03286 48.033541, -1.029721 48.035912, -1.029669 48.03775, -1.027123 48.039577, -1.029442 48.041578, -1.029664 48.044206, -1.026718 48.045567, -1.028727 48.048008, -1.031085 48.049017, -1.033815 48.052644, -1.032023 48.056927, -1.028139 48.059221, -1.028328 48.063288, -1.026703 48.06547, -1.021373 48.068375, -1.040755 48.078264, -1.044743 48.082408, -1.049427 48.089778, -1.050745 48.095243, -1.050678 48.101109, -1.052621 48.106254, -1.054853 48.109439, -1.054028 48.116053, -1.059369 48.125727, -1.058122 48.131187, -1.060105 48.133651, -1.061142 48.136993, -1.06032 48.150231, -1.06301 48.153885, -1.064112 48.159403, -1.07433 48.159315, -1.07275 48.161401, -1.073816 48.164245, -1.072954 48.166584, -1.077433 48.16702, -1.078678 48.168369, -1.075007 48.170414, -1.077252 48.173897, -1.080911 48.175644, -1.078524 48.179876, -1.079885 48.184076, -1.077294 48.186709, -1.078702 48.189726, -1.076509 48.194475, -1.076723 48.196652, -1.073985 48.199142, -1.073784 48.200749, -1.081874 48.205046, -1.081527 48.206718, -1.085961 48.208087, -1.087267 48.210071, -1.084398 48.211733, -1.084742 48.213612, -1.082517 48.215091, -1.08234 48.217589, -1.080636 48.219559, -1.084457 48.2208, -1.084239 48.226918, -1.087015 48.230892, -1.089564 48.231019, -1.091653 48.232753, -1.090339 48.236109, -1.09017 48.239197, -1.093677 48.240372, -1.092806 48.243461, -1.094492 48.246172, -1.099128 48.249553, -1.098788 48.255613, -1.100186 48.258084, -1.099043 48.260244, -1.102005 48.26276, -1.100315 48.268415, -1.097782 48.27104, -1.093556 48.272961, -1.092604 48.275646, -1.093358 48.278136, -1.092798 48.282554, -1.090418 48.285167, -1.090373 48.289455, -1.087201 48.290024, -1.084365 48.293866, -1.082871 48.297583, -1.07108 48.305174, -1.066016 48.30942, -1.061451 48.311166, -1.055257 48.318513, -1.054047 48.321364, -1.051345 48.322224, -1.04919 48.324893, -1.045047 48.327954, -1.049912 48.335236, -1.053175 48.337473, -1.055923 48.341098, -1.056908 48.344916, -1.060255 48.349346, -1.05968 48.353023, -1.060622 48.355191, -1.05895 48.35944, -1.055684 48.361982, -1.055835 48.364845, -1.058887 48.36702, -1.0638 48.366816, -1.065574 48.367524, -1.064415 48.370014, -1.057279 48.375615, -1.057109 48.37913, -1.05426 48.379106, -1.052999 48.380943, -1.054395 48.384295, -1.058173 48.388369, -1.058352 48.389803, -1.062998 48.394514, -1.062303 48.396524, -1.063236 48.399052, -1.067253 48.401647, -1.068713 48.405501, -1.074481 48.409012, -1.080683 48.415319, -1.080503 48.417019, -1.078963 48.418326, -1.078282 48.425201, -1.080295 48.428795, -1.082555 48.429954, -1.081895 48.43254, -1.08351 48.433844, -1.080954 48.438808, -1.08124 48.441043, -1.077961 48.443649, -1.067911 48.449115, -1.065272 48.451445, -1.066357 48.452671, -1.065136 48.456554, -1.067041 48.460182, -1.066799 48.461987, -1.064258 48.465251, -1.063917 48.467257, -1.067727 48.470722, -1.071279 48.46938, -1.071288 48.473288, -1.07392 48.473487, -1.07538 48.477885, -1.074178 48.48231, -1.069852 48.485866, -1.073939 48.487811, -1.078075 48.488592, -1.078336 48.49173, -1.075743 48.494633, -1.076317 48.497419, -1.075476 48.500921, -1.066912 48.50478, -1.070109 48.508811, -1.06865 48.510277, -1.061941 48.510434, -1.063142 48.513369, -1.061181 48.515596, -1.059698 48.51419, -1.056014 48.513234, -1.054351 48.509895, -1.052341 48.509101, -1.049035 48.510131, -1.047859 48.507527, -1.044722 48.50585, -1.040544 48.506372, -1.038045 48.505019, -1.035829 48.501696, -1.032158 48.501823, -1.02553 48.498179, -1.022049 48.498547, -1.021414 48.49575, -1.018232 48.495522, -1.018039 48.492836, -1.009367 48.492498, -1.007514 48.490434, -1.002945 48.4891, -0.998871 48.489885, -0.996132 48.492336, -0.98588 48.49388, -0.985088 48.493149, -0.976804 48.493008, -0.972275 48.494464, -0.971012 48.495749, -0.971822 48.500165, -0.970214 48.501108, -0.966654 48.500003, -0.962386 48.503541, -0.962094 48.506504, -0.964365 48.511109, -0.963258 48.51286, -0.955406 48.517274, -0.952331 48.516827, -0.946316 48.514133, -0.935925 48.515108, -0.927111 48.513221, -0.923827 48.513399, -0.92053 48.509776, -0.922821 48.507327, -0.923106 48.504207, -0.918806 48.500712, -0.910504 48.499295, -0.908963 48.4966, -0.905397 48.496035, -0.8991 48.497764, -0.895785 48.494895, -0.893671 48.494557, -0.892004 48.496735, -0.884945 48.497448, -0.880875 48.499384, -0.874122 48.500022, -0.8711 48.498159, -0.867705 48.498548, -0.860319 48.501506, -0.859108 48.500482, -0.84953 48.497586, -0.846877 48.499647, -0.84451 48.496278, -0.841901 48.495593, -0.83783 48.484718, -0.834374 48.483795, -0.832319 48.484629, -0.829922 48.478805, -0.826271 48.4787, -0.827199 48.476683, -0.823838 48.474996, -0.821064 48.476121, -0.814782 48.472196, -0.81844 48.468994, -0.816247 48.467708, -0.814043 48.464134, -0.816138 48.462256, -0.814419 48.459788, -0.815918 48.458236, -0.81257 48.455047, -0.806891 48.457817, -0.798686 48.459346, -0.799578 48.462554, -0.796522 48.463607, -0.796798 48.466184, -0.792233 48.465961, -0.789905 48.464921, -0.786885 48.466123, -0.784543 48.464242, -0.780635 48.466202, -0.77785 48.465533, -0.777424 48.460602, -0.778671 48.458283, -0.777612 48.455509, -0.777565 48.452009, -0.779839 48.448482, -0.779795 48.445915, -0.77519 48.445745, -0.774108 48.442686, -0.771471 48.442763, -0.7664 48.440654, -0.764518 48.436288, -0.759735 48.436153, -0.747661 48.438981, -0.747336 48.441398, -0.745625 48.44257, -0.740944 48.442283, -0.734528 48.445843, -0.726928 48.444848, -0.714799 48.449062, -0.714225 48.452634, -0.715743 48.45431, -0.719077 48.454231, -0.720953 48.455449, -0.725341 48.455479, -0.725011 48.457465, -0.728427 48.459721, -0.733035 48.459885, -0.735967 48.461349, -0.737229 48.465014, -0.733762 48.467095, -0.731037 48.471984, -0.724897 48.473436, -0.721879 48.470562, -0.713408 48.469407, -0.711309 48.470677, -0.707617 48.47528, -0.705316 48.475692, -0.700699 48.474895, -0.700224 48.472808, -0.70412 48.470612, -0.703424 48.468301, -0.699607 48.46716, -0.695227 48.468623, -0.692231 48.468072, -0.683018 48.471838, -0.685627 48.474587, -0.685585 48.477206, -0.677513 48.478845, -0.675219 48.480653, -0.675514 48.483118, -0.669181 48.482883, -0.668886 48.486573, -0.662526 48.484084, -0.660116 48.479036, -0.6629 48.477628, -0.657142 48.476575, -0.656048 48.472936, -0.659883 48.469452, -0.656622 48.465694, -0.653528 48.459372, -0.653814 48.450232, -0.655763 48.447919, -0.654152 48.444549, -0.650957 48.443734, -0.642491 48.447974, -0.636139 48.452358, -0.620406 48.458863, -0.615708 48.458826, -0.609472 48.463952, -0.60431 48.465872, -0.598346 48.471034, -0.594352 48.472626, -0.593139 48.470907, -0.586116 48.472134, -0.576656 48.470547, -0.572062 48.46871, -0.568237 48.472342, -0.566771 48.475693, -0.564621 48.477077, -0.561926 48.473144, -0.559198 48.472029, -0.551452 48.473278, -0.550347 48.474316, -0.549673 48.480291, -0.543484 48.483456, -0.539182 48.484367, -0.539448 48.485733, -0.53765 48.49038, -0.530618 48.495117, -0.524326 48.496211, -0.521203 48.495258, -0.520518 48.497278, -0.516028 48.498343, -0.517353 48.503579, -0.514552 48.503627, -0.512543 48.507162, -0.509491 48.508876, -0.505014 48.505869, -0.499968 48.507434, -0.500349 48.504496, -0.492983 48.501764, -0.489236 48.501324, -0.488566 48.503232, -0.484718 48.504298, -0.483283 48.502344, -0.478212 48.501607, -0.473745 48.503205, -0.473911 48.505733, -0.471922 48.507745, -0.46944 48.512329, -0.462515 48.513533, -0.458288 48.511922, -0.45021 48.513081, -0.447252 48.515448, -0.443119 48.513112, -0.438422 48.511645, -0.436442 48.513398, -0.433816 48.51376, -0.424394 48.508526, -0.425818 48.507684, -0.424317 48.506943, -0.418473 48.507323, -0.411194 48.506528, -0.409187 48.505591, -0.398736 48.508546, -0.398068 48.510677, -0.391627 48.509043, -0.393145 48.501074, -0.390791 48.500718, -0.383006 48.49675, -0.372451 48.49611, -0.366639 48.493867, -0.368941 48.492591, -0.369345 48.489663, -0.36793 48.487872, -0.357163 48.483694, -0.353267 48.483755, -0.349414 48.488372, -0.353112 48.492701, -0.355174 48.492906, -0.355589 48.49565, -0.353121 48.497207, -0.350392 48.501012, -0.338817 48.500127, -0.335999 48.501862, -0.334911 48.505059, -0.336205 48.509391, -0.329621 48.51361, -0.327644 48.516509, -0.320229 48.523214, -0.313634 48.521033, -0.308932 48.518499, -0.29353 48.515345, -0.289008 48.517274, -0.284904 48.51723, -0.286417 48.511681, -0.285151 48.506343, -0.271502 48.507434, -0.271206 48.509344, -0.26726 48.513739, -0.26908 48.517116, -0.272993 48.517525, -0.263405 48.523575, -0.261513 48.527133, -0.253347 48.525949, -0.250182 48.527355, -0.242404 48.536213, -0.242287 48.538418, -0.245835 48.542573, -0.258824 48.546368, -0.262564 48.548634, -0.246192 48.55821, -0.24883 48.562306, -0.246553 48.565752, -0.24288 48.568289, -0.234431 48.562075, -0.227429 48.561681, -0.219374 48.559805, -0.21689 48.558175, -0.212629 48.56289, -0.208193 48.564181, -0.203412 48.559328, -0.198011 48.557702, -0.193817 48.554629, -0.188362 48.548063, -0.180506 48.544901, -0.180646 48.542711, -0.178664 48.541574, -0.173331 48.541427, -0.171334 48.53815, -0.164557 48.535726, -0.15879 48.532344, -0.147151 48.529334, -0.144305 48.527574, -0.145912 48.520305, -0.149438 48.518628, -0.155631 48.520882, -0.158101 48.5191, -0.167336 48.515307, -0.166372 48.513754, -0.172518 48.510537, -0.170622 48.506713, -0.170708 48.503662, -0.172253 48.502324, -0.168151 48.504115, -0.162047 48.498821, -0.156545 48.496172, -0.155373 48.486921, -0.151656 48.483954, -0.149353 48.480786, -0.150127 48.477881, -0.152783 48.476653, -0.147405 48.47284, -0.149724 48.470617, -0.149331 48.468997, -0.150632 48.465252, -0.149657 48.460201, -0.147302 48.456883, -0.137825 48.452903, -0.124818 48.449364, -0.107817 48.447822, -0.093477 48.448583, -0.089093 48.450417, -0.080171 48.44992, -0.073233 48.450551, -0.07205 48.452795, -0.072777 48.456816, -0.07045 48.458364, -0.062588 48.456731, -0.051474 48.453068, -0.051297 48.450677, -0.049138 48.448353, -0.050807 48.445694, -0.049686 48.444415, -0.052212 48.442617, -0.051613 48.440068, -0.054916 48.430797, -0.057283 48.429125, -0.053325 48.425802, -0.053496 48.422722, -0.057665 48.420791, -0.05338 48.416445, -0.052267 48.412835, -0.057055 48.407839, -0.054925 48.40684, -0.055646 48.401235, -0.056681 48.399262, -0.056193 48.395432, -0.052483 48.393119, -0.053399 48.390035, -0.057609 48.388294, -0.057186 48.384322, -0.054794 48.382136, -0.055123 48.379371, -0.053598 48.376963, -0.049985 48.37521, -0.051362 48.379935, -0.043277 48.379203, -0.039607 48.381245, -0.037452 48.380662, -0.035273 48.382474, -0.034871 48.386445, -0.027481 48.386072, -0.026112 48.385217, -0.021908 48.387409, -0.022088 48.392415, -0.020094 48.39399, -0.011784 48.393565, -0.010847 48.395323, -0.006921 48.394841, -0.001855 48.397508, 0.003495 48.396038, 0.003569 48.388778, 0.006751 48.388337, 0.008057 48.390226, 0.011002 48.389283, 0.011454 48.385912, 0.014874 48.383762, 0.015412 48.381708, 0.023087 48.380432, 0.027129 48.381222, 0.03142 48.38028, 0.046705 48.381345, 0.057651 48.379215, 0.061678 48.380675, 0.062539 48.383285, 0.058426 48.38949, 0.056045 48.389783, 0.053844 48.391863, 0.059318 48.396171, 0.065804 48.404977, 0.070511 48.409082, 0.07218 48.407883, 0.082615 48.409369, 0.083588 48.411136, 0.099828 48.41031, 0.103619 48.414134, 0.110386 48.4232, 0.106497 48.426572, 0.111487 48.432437, 0.116968 48.436125, 0.121436 48.4362, 0.124158 48.434653, 0.126956 48.434613, 0.134386 48.43713, 0.150919 48.437305, 0.157699 48.440777, 0.158417 48.444007, 0.155334 48.445264, 0.153331 48.447303, 0.148368 48.448997, 0.14547 48.452356, 0.144136 48.455259, 0.146124 48.457636, 0.152517 48.457458, 0.155508 48.45569, 0.15698 48.453593, 0.162492 48.450773, 0.170467 48.449411, 0.173584 48.450754, 0.170762 48.453514, 0.169465 48.458877, 0.16963 48.461665, 0.173692 48.465331, 0.183548 48.464716, 0.185643 48.462918, 0.190108 48.461753, 0.205063 48.468573, 0.204398 48.469839, 0.209694 48.470609, 0.213572 48.473605, 0.231451 48.472441, 0.236903 48.474868, 0.24876 48.473957, 0.259266 48.47691, 0.261835 48.479664, 0.262284 48.48269, 0.265647 48.484953, 0.272114 48.482533, 0.273425 48.480049, 0.275687 48.479145, 0.279663 48.481356, 0.283558 48.481479, 0.28852 48.478453, 0.292104 48.478671, 0.29631 48.480404, 0.30071 48.480539, 0.304037 48.475671, 0.306034 48.475637, 0.310424 48.471938, 0.314881 48.473159, 0.316944 48.471477, 0.321538 48.472878, 0.326778 48.471782, 0.329333 48.468372, 0.33821 48.46546, 0.335519 48.46356, 0.346193 48.458629, 0.352532 48.459674, 0.3568 48.45781, 0.358502 48.454386, 0.363539 48.452166, 0.365491 48.449202, 0.364781 48.446475, 0.366157 48.443535, 0.368441 48.441323, 0.367997 48.437766, 0.370513 48.437201, 0.371057 48.434603, 0.37333 48.433814, 0.379709 48.425922, 0.382843 48.425057, 0.381541 48.422086, 0.381983 48.420282, 0.380897 48.416278, 0.377306 48.413513, 0.373422 48.412829, 0.371477 48.410922, 0.372738 48.408049, 0.372942 48.404043, 0.37516 48.398756, 0.374523 48.39399, 0.376379 48.391443, 0.373682 48.386965, 0.376126 48.384432, 0.378761 48.383237, 0.379905 48.380248, 0.379878 48.375885, 0.380704 48.373836, 0.380336 48.366489, 0.382608 48.360888, 0.382325 48.358408, 0.383543 48.352642, 0.386576 48.352419, 0.387979 48.349585, 0.387725 48.347355, 0.385149 48.347313, 0.384991 48.342846, 0.380464 48.343173, 0.382578 48.333982, 0.390742 48.326806, 0.392874 48.322599, 0.395871 48.320342, 0.398841 48.320464, 0.405979 48.314824, 0.413338 48.31899, 0.411483 48.320568, 0.415528 48.321585, 0.420538 48.321183, 0.427689 48.315004, 0.428749 48.309668, 0.431313 48.308549, 0.431103 48.306722, 0.438771 48.306528, 0.443289 48.304377, 0.455829 48.306584, 0.457831 48.305276, 0.46658 48.305952, 0.473403 48.300571, 0.480495 48.298559, 0.483144 48.302922, 0.487562 48.307826, 0.490272 48.309631, 0.492812 48.30565, 0.495525 48.304874, 0.507261 48.295593, 0.506017 48.293693, 0.503055 48.293959, 0.499723 48.291739, 0.49393 48.285968, 0.494431 48.282261, 0.49867 48.281212, 0.503518 48.277987, 0.502351 48.275742, 0.505295 48.274883, 0.510119 48.271809, 0.512769 48.267635, 0.516538 48.268976, 0.517393 48.267229, 0.53026 48.265546, 0.533291 48.263274, 0.538796 48.257021, 0.536282 48.249415, 0.543929 48.249459, 0.546723 48.250589, 0.551973 48.247941, 0.560317 48.246963, 0.562072 48.24565, 0.578939 48.244491, 0.58455 48.245288, 0.593607 48.244453, 0.598864 48.245319, 0.603998 48.244404, 0.60771 48.244754, 0.610466 48.242356, 0.613454 48.242322, 0.623789 48.245426, 0.626108 48.243128, 0.630116 48.241603, 0.630504 48.239427, 0.628041 48.237781, 0.631983 48.234629, 0.638493 48.235356, 0.636289 48.241549, 0.632827 48.245794, 0.63344 48.249529, 0.63108 48.252502, 0.633105 48.257282, 0.63717 48.258258, 0.638928 48.260737, 0.652086 48.264248, 0.660629 48.261165, 0.66438 48.26092, 0.670883 48.255459, 0.683082 48.254904, 0.684165 48.254077, 0.681976 48.249314, 0.687074 48.248078, 0.688326 48.246279, 0.685475 48.243918, 0.685999 48.240646, 0.688601 48.239148, 0.693504 48.238027, 0.697383 48.233051, 0.700022 48.231445, 0.699698 48.228676, 0.702315 48.225752, 0.705996 48.223923, 0.706136 48.22107, 0.704508 48.218897, 0.711266 48.216851, 0.712299 48.214842, 0.715527 48.214728, 0.718559 48.208433, 0.722189 48.204011, 0.721787 48.200851, 0.723704 48.198351, 0.728488 48.200816, 0.734463 48.196399, 0.735237 48.192709, 0.737732 48.189239, 0.745615 48.184985, 0.752137 48.183901, 0.75532 48.182376, 0.75831 48.179386, 0.772867 48.185042, 0.777201 48.188085, 0.782095 48.188953, 0.798181 48.194836, 0.795861 48.191515, 0.795679 48.187928, 0.800418 48.188772, 0.805508 48.185895, 0.811086 48.185863, 0.813094 48.180769, 0.816948 48.180602, 0.826429 48.175838, 0.827887 48.172975, 0.831515 48.170918, 0.833127 48.168745, 0.836492 48.167524, 0.83659 48.166837, 0.843664 48.164764, 0.849331 48.166852, 0.854366 48.16503, 0.860322 48.167576, 0.864936 48.165955, 0.866134 48.164034, 0.87253 48.16246, 0.872675 48.163805, 0.880488 48.161696, 0.886158 48.161876, 0.88876 48.159138, 0.906682 48.151679, 0.911461 48.148981, 0.911343 48.14682, 0.909273 48.144081, 0.913251 48.139507, 0.916599 48.138966, 0.91379 48.134986, 0.909616 48.136094, 0.894441 48.135465, 0.882654 48.133674, 0.879995 48.135769, 0.872552 48.134816, 0.872768 48.132538, 0.870614 48.131873, 0.866332 48.134201, 0.850207 48.133305, 0.852332 48.130913, 0.85527 48.122824, 0.841126 48.103012, 0.83251 48.098427, 0.814423 48.098827, 0.815146 48.093503, 0.822986 48.092845, 0.824934 48.090719, 0.83133 48.092408, 0.835816 48.091187, 0.838301 48.088905, 0.840546 48.089666, 0.838445 48.092279, 0.838808 48.094364, 0.846106 48.094978, 0.848707 48.089253, 0.844333 48.088065, 0.845458 48.084314, 0.843854 48.078935, 0.843628 48.072916, 0.834125 48.069272, 0.821598 48.070413, 0.813682 48.070244, 0.808217 48.071272, 0.799791 48.071145, 0.794065 48.069413, 0.797872 48.065796, 0.798145 48.060329, 0.797161 48.057442, 0.797884 48.05549, 0.795822 48.054551, 0.796642 48.051756, 0.793784 48.048088, 0.797831 48.042633, 0.797345 48.037313, 0.801052 48.037356, 0.802563 48.038505, 0.806829 48.037594, 0.808126 48.035321, 0.806925 48.032895, 0.815123 48.032012, 0.817973 48.030322, 0.823223 48.031122, 0.825314 48.029878, 0.829592 48.030858, 0.830577 48.033377, 0.834434 48.034455, 0.83781 48.034238, 0.842435 48.030145, 0.841235 48.025831, 0.838609 48.023571, 0.841924 48.019127, 0.837174 48.01591, 0.836218 48.010675, 0.83683 48.00873, 0.833084 48.009031, 0.831575 48.006342, 0.833198 48.002612, 0.831016 47.998543, 0.832445 47.997082, 0.825705 47.991281, 0.821471 47.98938, 0.818677 47.989223, 0.818969 47.985962, 0.825538 47.979756, 0.82426 47.978042, 0.827902 47.972858, 0.832041 47.972135, 0.835462 47.97043, 0.837758 47.968177, 0.837134 47.964705, 0.83843 47.962212, 0.842094 47.959611, 0.841909 47.956576, 0.845312 47.954036, 0.844093 47.951925, 0.845474 47.947383, 0.849383 47.946897, 0.848725 47.942812, 0.847535 47.94153, 0.842242 47.940111, 0.837034 47.937122, 0.816391 47.934343, 0.813413 47.931833, 0.812052 47.92655, 0.813691 47.926011, 0.812549 47.920151, 0.808305 47.916162, 0.813194 47.913613, 0.809182 47.910766, 0.807165 47.907749, 0.815176 47.904197, 0.812566 47.90068, 0.813715 47.898262, 0.817168 47.897093, 0.81444 47.894931, 0.816568 47.891805, 0.811654 47.888435, 0.808805 47.891406, 0.805662 47.892429, 0.8022 47.895958, 0.798842 47.897065, 0.795016 47.899656, 0.793626 47.902628, 0.794862 47.905598, 0.793281 47.908866, 0.789981 47.912104, 0.78268 47.911007, 0.774862 47.907401, 0.770257 47.902028, 0.764185 47.8995, 0.759768 47.899398, 0.758489 47.893685, 0.757134 47.891366, 0.75778 47.883812, 0.759765 47.883096, 0.761278 47.878388, 0.761175 47.873859, 0.764647 47.866568, 0.763375 47.862865, 0.759129 47.859309, 0.763833 47.85641, 0.765784 47.854289, 0.774031 47.851191, 0.772639 47.848706, 0.774278 47.847475, 0.771802 47.845533, 0.774763 47.843919, 0.77353 47.841981, 0.774724 47.839552, 0.772641 47.837863, 0.768029 47.831257, 0.763365 47.834109, 0.758871 47.83373, 0.756419 47.830533, 0.749912 47.828927, 0.745807 47.826353, 0.745196 47.822727, 0.743264 47.821989, 0.738035 47.816202, 0.740229 47.811694, 0.7341 47.807697, 0.731769 47.807704, 0.7274 47.802102, 0.726315 47.799319, 0.724206 47.798917, 0.719384 47.793991, 0.714589 47.793794, 0.711054 47.787561, 0.705889 47.788499, 0.704086 47.789755, 0.698328 47.789345, 0.691287 47.783436, 0.689356 47.779929, 0.699943 47.774393, 0.703575 47.767892, 0.701756 47.76653, 0.698022 47.766051, 0.697321 47.764285, 0.692036 47.763888, 0.689079 47.765563, 0.683937 47.765447, 0.681163 47.76851, 0.676816 47.769581, 0.672662 47.76834, 0.662505 47.761351, 0.653377 47.757948, 0.651179 47.75528, 0.646284 47.753148, 0.635986 47.751488, 0.626225 47.75162, 0.623392 47.748673, 0.621201 47.748544, 0.61931 47.745401, 0.618773 47.741304, 0.620063 47.73858, 0.616542 47.735362, 0.610524 47.732177, 0.612181 47.728276, 0.608557 47.725064, 0.604435 47.724792, 0.601583 47.72576, 0.595002 47.723451, 0.590965 47.721346, 0.580554 47.712898, 0.585052 47.708464, 0.589919 47.706221, 0.59296 47.703564, 0.594592 47.700416, 0.591663 47.697749, 0.592158 47.694606, 0.594733 47.691296, 0.5956 47.688152, 0.60442 47.685705, 0.607526 47.689328, 0.614914 47.694169, 0.618778 47.693934, 0.618857 47.691239, 0.615641 47.687515, 0.614543 47.682707, 0.604274 47.680686, 0.604458 47.678149, 0.600421 47.677613, 0.597035 47.673251, 0.587295 47.669342, 0.579025 47.668189, 0.575816 47.668845, 0.570837 47.668555, 0.558363 47.67101, 0.55937 47.666302, 0.55593 47.6644, 0.554196 47.661516, 0.551324 47.659019, 0.543533 47.656416, 0.536992 47.65704, 0.533987 47.655544, 0.527071 47.654782, 0.522933 47.653117, 0.520116 47.653781, 0.518921 47.655707, 0.516313 47.656801, 0.514879 47.654484, 0.498237 47.644454, 0.493385 47.64423, 0.489357 47.645296, 0.478659 47.643379, 0.476502 47.646836, 0.473437 47.647401, 0.466119 47.644248, 0.464008 47.645622, 0.456764 47.639006, 0.453046 47.63367, 0.45503 47.62999, 0.457026 47.628459, 0.449931 47.6194, 0.440896 47.61995, 0.42877 47.617531, 0.423491 47.618325, 0.419709 47.620996, 0.417979 47.623933, 0.413404 47.626224, 0.409712 47.626477, 0.408731 47.63244, 0.402594 47.634492, 0.39757 47.638681, 0.396003 47.641024, 0.389455 47.640846, 0.385952 47.641562, 0.382645 47.643414, 0.380286 47.638499, 0.366133 47.626275, 0.364486 47.623599, 0.364722 47.620199, 0.374728 47.612018, 0.383393 47.610186, 0.384382 47.606652, 0.388724 47.601621, 0.390218 47.598084, 0.392151 47.595956, 0.396685 47.594017, 0.395851 47.586848, 0.397516 47.585972, 0.400329 47.580353, 0.402448 47.578414, 0.398701 47.577426, 0.393473 47.577404, 0.384387 47.572271, 0.384395 47.570802, 0.379279 47.569378, 0.378437 47.568394, 0.375821 47.569974, 0.367815 47.571949, 0.366237 47.573919, 0.358353 47.574952, 0.353485 47.57695, 0.346451 47.577164, 0.341373 47.579612, 0.338904 47.579587, 0.340132 47.580942, 0.339247 47.584147, 0.332896 47.587541, 0.332294 47.58971, 0.327237 47.591999, 0.324518 47.592027, 0.321964 47.595255, 0.31155 47.594966, 0.289143 47.598078, 0.278698 47.598197, 0.274559 47.599269, 0.27212 47.601383, 0.267904 47.602577, 0.269966 47.604703, 0.26767 47.608718, 0.262444 47.609563, 0.259333 47.612392, 0.255135 47.611744, 0.253062 47.613421, 0.246162 47.610921, 0.238831 47.610549, 0.236208 47.611672, 0.23231 47.61095, 0.229893 47.608496, 0.232553 47.604635, 0.231809 47.594888, 0.233306 47.593293, 0.234283 47.589818, 0.231485 47.584952, 0.229508 47.584774, 0.233984 47.580539, 0.234438 47.578215, 0.231825 47.578326, 0.230052 47.576564, 0.225454 47.574159, 0.215216 47.573277, 0.214888 47.569845, 0.207833 47.564024, 0.206099 47.561171, 0.208911 47.557654, 0.20466 47.552061, 0.203432 47.547244, 0.199499 47.545355, 0.199319 47.540951, 0.193791 47.539295, 0.194165 47.537602, 0.202353 47.534901, 0.205602 47.534762, 0.206699 47.532663, 0.202863 47.528226, 0.205803 47.526873, 0.211567 47.525784, 0.215024 47.523465, 0.217516 47.529345, 0.225881 47.526426, 0.223519 47.521857, 0.219873 47.519712, 0.221964 47.5177, 0.221044 47.512847, 0.21928 47.509244, 0.220016 47.501899, 0.21399 47.498318, 0.209589 47.494523, 0.207687 47.49037, 0.203257 47.485653, 0.201774 47.485778, 0.198821 47.481286, 0.199419 47.478589, 0.198437 47.47645, 0.194623 47.47483, 0.190519 47.461305, 0.181145 47.453474, 0.182648 47.443748, 0.183208 47.433318, 0.18526 47.424261, 0.181188 47.417794, 0.176506 47.414379, 0.174604 47.415066, 0.169542 47.40726, 0.166152 47.403923, 0.162535 47.40484, 0.158598 47.403351, 0.153451 47.398739, 0.157475 47.398996, 0.166003 47.397383, 0.169492 47.395468, 0.167219 47.38546, 0.172819 47.38588, 0.179161 47.38443, 0.182322 47.383068, 0.183021 47.380404, 0.174361 47.375603, 0.170673 47.374502, 0.163873 47.370518, 0.162515 47.368249, 0.153573 47.363559, 0.149377 47.362237, 0.140344 47.361994, 0.143972 47.357454, 0.146983 47.351693, 0.147892 47.347223, 0.14734 47.345893, 0.13979 47.339529, 0.137933 47.335921, 0.126853 47.332667, 0.117452 47.332316, 0.11836 47.326061, 0.11407 47.320033, 0.113999 47.31882, 0.109122 47.313455, 0.099341 47.308782, 0.098137 47.306011, 0.092266 47.300466, 0.086636 47.292596, 0.085128 47.289301, 0.082311 47.287757, 0.078412 47.282912, 0.089321 47.282951, 0.088617 47.275397, 0.083392 47.274966, 0.079892 47.271722, 0.081502 47.269176, 0.079522 47.266815, 0.080747 47.265154, 0.074824 47.262354, 0.077358 47.253862, 0.074982 47.250418, 0.074992 47.248083, 0.0679 47.247487, 0.067943 47.245225, 0.069663 47.241624, 0.073892 47.23607, 0.074395 47.227796, 0.072938 47.226451, 0.073263 47.223926, 0.071417 47.22316, 0.072481 47.220011, 0.07665 47.220266, 0.079171 47.216761, 0.074565 47.214739, 0.067758 47.21567, 0.065684 47.213307, 0.067097 47.211528, 0.062388 47.207494, 0.058993 47.20674, 0.057021 47.201706, 0.053532 47.199311, 0.052721 47.196564, 0.055217 47.194444, 0.057978 47.193995, 0.06199 47.190408, 0.066502 47.189608, 0.062744 47.174965, 0.059165 47.171753, 0.058803 47.169174, 0.055495 47.166292, 0.053791 47.163467, 0.052486 47.166842, 0.0493 47.168887, 0.046509 47.166055, 0.038426 47.162981, 0.036538 47.159578, 0.018907 47.175876, 0.010366 47.169612, -0.002218 47.163688, -0.009038 47.159027, -0.013547 47.154665, -0.036143 47.124974, -0.036595 47.120057, -0.03463 47.120761, -0.035655 47.118606, -0.041105 47.113702, -0.038392 47.109488, -0.039255 47.10801, -0.0265 47.106085, -0.029372 47.095453, -0.034184 47.089756, -0.035148 47.086809, -0.039832 47.086829, -0.041376 47.093871, -0.04409 47.093334, -0.060061 47.095267, -0.067845 47.09344, -0.06934 47.095808, -0.067407 47.099615, -0.082946 47.099188, -0.085874 47.101013, -0.094763 47.095471, -0.100857 47.08613, -0.101381 47.082743, -0.099874 47.081293, -0.10003 47.077914, -0.103177 47.076898, -0.102233 47.072168, -0.104731 47.069781, -0.102128 47.06508, -0.11869 47.05978, -0.122783 47.055906, -0.125411 47.055958, -0.128789 47.054372, -0.137198 47.056653, -0.135373 47.059058, -0.138428 47.060559, -0.136752 47.064038, -0.139423 47.066242, -0.147543 47.069901, -0.152575 47.069669, -0.1548 47.07075, -0.157521 47.070007, -0.165902 47.064633, -0.174725 47.067737, -0.17908 47.07018, -0.165194 47.082557, -0.160709 47.085496, -0.153574 47.087667, -0.145856 47.09158, -0.140226 47.097897, -0.141403 47.104114, -0.152211 47.100998, -0.172056 47.105063, -0.180051 47.108207, -0.18519 47.108372, -0.187486 47.10611, -0.186225 47.101649, -0.189376 47.099862, -0.199605 47.097318, -0.206213 47.093198, -0.207934 47.095951, -0.213803 47.096474, -0.215548 47.098398, -0.221277 47.099703, -0.227946 47.099503, -0.233945 47.103569, -0.242038 47.105697, -0.248464 47.104616, -0.254999 47.100894, -0.263315 47.099023, -0.263735 47.101557, -0.262716 47.105865, -0.266084 47.105662, -0.265543 47.103354, -0.269016 47.101246, -0.280756 47.100014, -0.282827 47.103508, -0.287026 47.101741, -0.301292 47.099095, -0.304563 47.097825, -0.312596 47.09222, -0.335682 47.087956, -0.3403048635978878 47.08752336289627, -0.335593 47.087996, -0.312555 47.092257, -0.311854 47.104175, -0.315605 47.105394, -0.314916 47.106305, -0.317185 47.108012, -0.318197 47.107497, -0.322738 47.108762, -0.322166 47.113341, -0.323874 47.116436, -0.321459 47.121283, -0.325581 47.123121, -0.327816 47.122427, -0.330002 47.123199, -0.3293 47.12564, -0.330249 47.126144, -0.332498 47.125027, -0.33722 47.12614, -0.338209 47.125162, -0.339118 47.125369, -0.339153 47.12661, -0.341232 47.128987, -0.337955 47.130561, -0.33382 47.130432, -0.332489 47.131577, -0.334297 47.132289, -0.333255 47.133742, -0.338095 47.134994, -0.342742 47.134635, -0.350545 47.13761, -0.353369 47.141311, -0.347566 47.146139, -0.348841 47.146936, -0.350786 47.146715, -0.350341 47.148346, -0.352047 47.151282, -0.351485 47.152225, -0.353323 47.152762, -0.35578 47.149185, -0.36114 47.151223, -0.366432 47.151314, -0.369563 47.153469, -0.375187 47.151642, -0.384412 47.156495, -0.396127 47.159938, -0.399628 47.159767, -0.40023 47.155858, -0.404906 47.160023, -0.410125 47.158827, -0.406628 47.163987, -0.394179 47.171043, -0.38967 47.175879, -0.394587 47.176119, -0.397269 47.174935, -0.399488 47.177426, -0.402195 47.177222, -0.407773 47.179534, -0.413784 47.180231, -0.411807 47.183143, -0.411996 47.185065, -0.412716 47.185433, -0.412285 47.187333, -0.413439 47.187417, -0.413958 47.190365, -0.417619 47.190956, -0.418248 47.193134, -0.418511 47.195844, -0.412792 47.200155, -0.412285 47.201901, -0.409833 47.204575, -0.41171 47.205248, -0.410264 47.206932, -0.407826 47.206784, -0.405048 47.210537, -0.40383 47.213639, -0.401814 47.215326, -0.401168 47.219627, -0.408793 47.219609, -0.417328 47.223194, -0.421213 47.223417, -0.423234 47.221124, -0.42749 47.218448, -0.430493 47.214774, -0.432012 47.215171, -0.436489 47.21435, -0.439494 47.215173, -0.443709 47.220465, -0.448277 47.221702, -0.454212 47.218059, -0.453324 47.216126, -0.455677 47.211151, -0.461469 47.206421, -0.46267 47.206468, -0.473101 47.197326, -0.476512 47.198431, -0.478934 47.198011, -0.480203 47.199556, -0.48129 47.199278, -0.482276 47.200104, -0.483332 47.20406, -0.480932 47.206143, -0.479899 47.208412, -0.48982 47.2108, -0.493161 47.210967, -0.495366 47.210041, -0.497523 47.211184, -0.500894 47.20962, -0.506224 47.209061, -0.518344 47.210022, -0.533786 47.207824, -0.544078 47.207204, -0.547078 47.208665, -0.550243 47.20432, -0.555934 47.200523, -0.555665 47.199108, -0.557256 47.197598, -0.558835 47.194163, -0.565194 47.192525, -0.571555 47.189365, -0.581188 47.180057, -0.589552 47.175159, -0.590948 47.173115, -0.591142 47.169356, -0.593306 47.166566, -0.596559 47.163645, -0.598875 47.159885, -0.60299 47.157147, -0.606321 47.153981, -0.606431 47.153063, -0.608714 47.151739, -0.611255 47.147944, -0.614066 47.148949, -0.634778 47.151401, -0.636791 47.151277, -0.637368 47.149049, -0.641321 47.15116, -0.642901 47.150853, -0.645837 47.148712, -0.648111 47.148068, -0.648071 47.146159, -0.650229 47.144351, -0.650943 47.144014, -0.650964 47.14514, -0.655204 47.144456, -0.655244 47.141967, -0.65679 47.140824, -0.657742 47.141094, -0.657647 47.141996, -0.659167 47.141034, -0.660958 47.141474, -0.661645 47.142495, -0.662358 47.13973, -0.660788 47.138781, -0.661117 47.137602, -0.659606 47.136733, -0.666837 47.133182, -0.670074 47.134202, -0.671374 47.132367, -0.678609 47.129982, -0.679654 47.130824, -0.685009 47.131849, -0.688837 47.129736, -0.692463 47.129899, -0.694172 47.130908, -0.696088 47.129613, -0.699315 47.1292, -0.70149 47.127601, -0.701852 47.130356, -0.703497 47.131179, -0.705908 47.131881, -0.706937 47.130723, -0.7106 47.13282, -0.715656 47.132769, -0.719769 47.130794, -0.719932 47.128783, -0.722145 47.128122, -0.726214 47.127882, -0.727239 47.1286, -0.740311 47.130005, -0.743658 47.127853, -0.747465 47.126936, -0.753305 47.128401, -0.755615 47.126224, -0.757279 47.129441, -0.764166 47.130843, -0.765193 47.13241, -0.764681 47.137155, -0.765204 47.138177, -0.76298 47.14355, -0.775934 47.142725, -0.776545 47.14425, -0.784825 47.142603, -0.785197 47.146892, -0.786251 47.146968, -0.788176 47.149197, -0.789696 47.147616, -0.790662 47.148312, -0.792366 47.147384, -0.796446 47.14782, -0.79675 47.150273, -0.798743 47.152046, -0.7999 47.151605, -0.8017 47.153203, -0.802353 47.157038, -0.805691 47.156591, -0.808284 47.157468, -0.818054 47.154176, -0.821728 47.15623, -0.825337 47.156855, -0.827803 47.152363, -0.830325 47.152719, -0.831657 47.150077, -0.836781 47.150523, -0.839548 47.149972, -0.851464 47.152844, -0.855811 47.152801, -0.860479 47.151358, -0.863144 47.151598, -0.866328 47.154278, -0.866803 47.156878, -0.874066 47.158261, -0.875957 47.159696, -0.877381 47.158906, -0.879756 47.159392, -0.885042 47.158851, -0.888682 47.160368, -0.895814 47.161263, -0.899084 47.160432, -0.902938 47.161005, -0.90419 47.160098, -0.904825 47.161118, -0.906819 47.161096, -0.908851 47.160224, -0.911125 47.164967, -0.912727 47.164685, -0.910135 47.159648, -0.911496 47.159322, -0.918746 47.159644, -0.926071 47.163675, -0.927214 47.162774, -0.92893 47.162757, -0.934443 47.160325, -0.937325 47.157219, -0.938397 47.157361, -0.940798 47.154856, -0.940044 47.153671, -0.942047 47.153084, -0.941596 47.152113, -0.944796 47.151628, -0.944708 47.149874, -0.948285 47.149339, -0.955456 47.144794, -0.955037 47.144178, -0.956323 47.139477, -0.957614 47.13712, -0.956129 47.13727, -0.956686 47.136964, -0.954873 47.135147, -0.948601 47.132549, -0.948274 47.131818, -0.950375 47.129795, -0.946984 47.127447, -0.948981 47.125865, -0.948527 47.124269, -0.951528 47.123316, -0.952133 47.120092, -0.946189 47.120618, -0.946038 47.119935, -0.949882 47.117637, -0.950936 47.115496, -0.953683 47.114413, -0.95651 47.11443, -0.961096 47.116071, -0.965263 47.115767, -0.964548 47.114124, -0.967254 47.109873, -0.96705 47.108872, -0.967849 47.107754, -0.970367 47.106898, -0.96872 47.105441, -0.966329 47.104755, -0.969109 47.101294, -0.978438 47.100071, -0.979903 47.096908, -0.984779 47.094839, -0.989408 47.091092, -0.9921 47.09038, -0.99311 47.089019, -0.997895 47.09084, -0.998496 47.088622, -0.997505 47.086696, -0.998069 47.085131, -0.996599 47.08316, -1.001639 47.082483, -1.004834 47.080101, -1.008233 47.080038, -1.012071 47.07765, -1.013411 47.075481, -1.017289 47.074766, -1.023597 47.077407, -1.026835 47.077853, -1.030644 47.072867, -1.032601 47.071583, -1.032856 47.070107, -1.038363 47.068104, -1.038371 47.067549, -1.039566 47.067823, -1.035791 47.070638, -1.039291 47.07315, -1.041014 47.073183, -1.046194 47.068615, -1.042919 47.063977, -1.04296 47.059505, -1.03872 47.061387, -1.031558 47.055852, -1.040741 47.052037, -1.042479 47.052727, -1.043862 47.052359, -1.041309 47.050274, -1.040363 47.048076, -1.040996 47.047222, -1.038031 47.045406, -1.033921 47.044428, -1.028526 47.046577, -1.028338 47.043193, -1.023855 47.042567, -1.023727 47.044304, -1.022619 47.044506, -1.020078 47.042246, -1.020713 47.0395, -1.018823 47.038146, -1.020219 47.0374, -1.017553 47.03602, -1.011849 47.034329, -1.011117 47.034892, -1.012478 47.036518, -1.012062 47.037209, -1.010507 47.036397, -1.008813 47.037094, -1.005892 47.034645, -1.003499 47.034155, -1.00369 47.029205, -1.008565 47.027608, -1.005871 47.027086, -1.003761 47.02556, -1.001848 47.027837, -1.000034 47.027594, -0.995461 47.024415, -0.997423 47.022981, -1.000446 47.022611, -0.999402 47.025138, -1.000672 47.02556, -1.002044 47.024403, -1.000567 47.022544, -1.002179 47.02152, -0.999529 47.020687, -0.995514 47.017676, -0.982174 47.010593, -0.980279 47.014309, -0.982976 47.016083, -0.981502 47.017046, -0.981873 47.018124, -0.978354 47.018918, -0.976156 47.018317, -0.975663 47.01687, -0.973361 47.016124, -0.975314 47.013218, -0.973166 47.012531, -0.974932 47.010525, -0.975229 47.008652, -0.973483 47.008101, -0.972909 47.009056, -0.970504 47.007588, -0.967816 47.007355, -0.968678 47.006687, -0.965982 47.004729, -0.967052 47.005199, -0.968005 47.004208, -0.966535 47.002838, -0.964014 47.003068, -0.963229 47.001985, -0.963101 47.00063, -0.964984 46.999584, -0.963447 46.998099, -0.964354 46.997292, -0.963159 46.996458, -0.961741 46.997277, -0.962158 46.995809, -0.959851 46.995287, -0.960803 46.994723, -0.957388 46.994887, -0.958285 46.99543, -0.956737 46.996404, -0.954756 46.995966, -0.955661 46.99757, -0.95504 46.999919, -0.953334 47.000764, -0.951958 47.002736, -0.947959 47.003694, -0.948313 47.001307, -0.947166 46.999717, -0.944993 46.998988, -0.941698 47.00358, -0.940278 47.003189, -0.939812 47.002193, -0.939634 47.002783, -0.938673 47.002401, -0.938529 47.0034, -0.937296 47.003048, -0.936462 47.005257, -0.934844 47.005633, -0.935539 47.007348, -0.933399 47.009041, -0.93295 47.007838, -0.932015 47.007985, -0.932389 47.006069, -0.929194 47.008111, -0.927473 47.006346, -0.928248 47.00382, -0.931039 47.004519, -0.931063 47.003357, -0.93278 47.00456, -0.935226 47.002345, -0.928661 47.002451, -0.928445 47.000682, -0.925042 46.999834, -0.925021 47.002535, -0.919706 47.003377, -0.919365 47.002324, -0.915853 47.001637, -0.914871 47.000633, -0.916957 46.999858, -0.917958 46.998454, -0.921435 46.998028, -0.918685 46.996536, -0.918747 46.995522, -0.916525 46.996111, -0.914227 46.994688, -0.915649 46.993302, -0.915289 46.992611, -0.912311 46.992815, -0.910853 46.994271, -0.912372 46.995659, -0.9117 46.995997, -0.908708 46.99287, -0.907873 46.994955, -0.904396 46.994915, -0.902515 46.993922, -0.90103 46.991734, -0.897484 46.989799, -0.898968 46.988701, -0.895404 46.986335, -0.89623 46.985842, -0.895727 46.985249, -0.893065 46.984496, -0.896843 46.980815, -0.894874 46.980231, -0.895071 46.979177, -0.892484 46.978577, -0.892187 46.976082, -0.8896042740474589 46.97572423178752, -0.895699 46.975752, -0.897661 46.973273, -0.897875 46.970966, -0.903493 46.971561, -0.90218 46.97024, -0.902604 46.968243, -0.899224 46.966279, -0.894384 46.968889, -0.892635 46.96602, -0.889161 46.967229, -0.893355 46.969266, -0.889019 46.971167, -0.883448 46.969432, -0.880263 46.970216, -0.877022 46.96848, -0.883824 46.962448, -0.883243 46.959838, -0.878217 46.956067, -0.876274 46.955649, -0.871703 46.95862, -0.871495 46.959655, -0.8672 46.962977, -0.863684 46.962366, -0.867944 46.958479, -0.868998 46.956474, -0.864855 46.955415, -0.864252 46.952829, -0.861976 46.950103, -0.865806 46.94834, -0.867576 46.95135, -0.874979 46.954688, -0.877309 46.952462, -0.883955 46.951369, -0.880955 46.946521, -0.877307 46.945906, -0.87368 46.943966, -0.871504 46.945744, -0.861617 46.945579, -0.858137 46.947048, -0.854501 46.947499, -0.849257 46.946324, -0.847463 46.94454, -0.851113 46.941442, -0.852927 46.938683, -0.860194 46.936545, -0.859157 46.934728, -0.852673 46.937443, -0.849338 46.940076, -0.846916 46.93992, -0.84133 46.936499, -0.840695 46.932748, -0.846029 46.9316, -0.841048 46.928971, -0.837647 46.93206, -0.831566 46.934116, -0.829471 46.933644, -0.827671 46.931198, -0.829439 46.929234, -0.825408 46.922028, -0.821739 46.918495, -0.812263 46.920653, -0.807424 46.920013, -0.809562 46.917016, -0.8137 46.914175, -0.821043 46.911107, -0.818757 46.908374, -0.817237 46.904106, -0.821947 46.897463, -0.82548 46.894516, -0.826226 46.889966, -0.82854 46.887337, -0.830449 46.887885, -0.833133 46.885103, -0.828385 46.882845, -0.825014 46.883797, -0.819709 46.881263, -0.816985 46.880959, -0.814741 46.877333, -0.807782 46.869825, -0.808389 46.868667, -0.800923 46.865552, -0.799269 46.862044, -0.794663 46.861096, -0.794106 46.857893, -0.791745 46.857931, -0.790454 46.855678, -0.787007 46.853987, -0.787228 46.852532, -0.784865 46.84998, -0.784262 46.846006, -0.782415 46.843225, -0.773206 46.840486, -0.769405 46.836278, -0.766398 46.834209, -0.763058 46.834635, -0.759744 46.833351, -0.758182 46.831406, -0.751243 46.831135, -0.750635 46.830014, -0.746245 46.831106, -0.741102 46.829169, -0.738509 46.829233, -0.736764 46.827445, -0.737432 46.825465, -0.733283 46.821744, -0.728472 46.822213, -0.725044 46.821685, -0.722118 46.822608, -0.714965 46.82111, -0.710741 46.821197, -0.706705 46.818844, -0.707742 46.815966, -0.702185 46.813181, -0.699066 46.808782, -0.700859 46.808822, -0.706947 46.805912, -0.713065 46.805096, -0.715068 46.80153, -0.717903 46.800458, -0.718931 46.79589, -0.717193 46.792775, -0.720479 46.789582, -0.723677 46.784336, -0.727249 46.782473, -0.724537 46.776815, -0.726983 46.773802, -0.726599 46.770289, -0.727599 46.767676, -0.726309 46.764797, -0.722361 46.765076, -0.720233 46.763734, -0.721165 46.761269, -0.71918 46.758665, -0.719525 46.75598, -0.715715 46.751989, -0.710585 46.749902, -0.704524 46.749506, -0.698268 46.751824, -0.697086 46.748538, -0.695147 46.747569, -0.693937 46.743825, -0.695854 46.742466, -0.696229 46.740184, -0.698781 46.737906, -0.700876 46.738325, -0.702782 46.734835, -0.700064 46.733813, -0.696053 46.737115, -0.693722 46.735617, -0.696608 46.732721, -0.695773 46.730162, -0.692599 46.731201, -0.688769 46.730298, -0.68871 46.725931, -0.685507 46.729673, -0.683361 46.728145, -0.684351 46.726696, -0.678176 46.725619, -0.678338 46.724251, -0.674744 46.722861, -0.673096 46.719861, -0.669078 46.717449, -0.665199 46.711321, -0.662813 46.709665, -0.661735 46.705351, -0.658607 46.703851, -0.656248 46.700363, -0.660331 46.698921, -0.665432 46.695215, -0.674688 46.691015, -0.681106 46.68697, -0.673418 46.684114, -0.670222 46.681546, -0.658042 46.676781, -0.647307 46.670582, -0.641652 46.664009, -0.637011 46.663297, -0.648668 46.656557, -0.649292 46.653809, -0.648262 46.647884, -0.649252 46.645173, -0.652978 46.642964, -0.658744 46.641197, -0.659605 46.638704, -0.658926 46.636003, -0.657048 46.634133, -0.656537 46.635666, -0.653238 46.636841, -0.648118 46.637068, -0.643565 46.638336, -0.634885 46.637667, -0.623556 46.632698, -0.624065 46.629875, -0.616642 46.623978, -0.614261 46.620411, -0.616566 46.619914, -0.621917 46.612047, -0.623576 46.610876, -0.623016 46.607513, -0.626751 46.605485, -0.619888 46.6016, -0.618441 46.598687, -0.614078 46.598894, -0.614604 46.595383, -0.620743 46.593135, -0.611514 46.588135, -0.614295 46.583853, -0.617986 46.582037, -0.620446 46.579152, -0.62442 46.577192, -0.624321 46.575232, -0.618702 46.572673, -0.620064 46.568712, -0.62031 46.564727, -0.617569 46.564692, -0.617968 46.561771, -0.614757 46.561167, -0.610732 46.564304, -0.606421 46.563802, -0.607003 46.560094, -0.605343 46.557423, -0.608156 46.551032, -0.605142 46.550471, -0.601905 46.548044, -0.604163 46.546433, -0.60327 46.542824, -0.602334 46.541901, -0.602288 46.533159, -0.609312 46.526057, -0.612473 46.528814, -0.615804 46.52614, -0.618588 46.527344, -0.621684 46.530434, -0.623935 46.529349, -0.62744 46.52934, -0.631551 46.526803, -0.641987 46.524898, -0.64415 46.521689, -0.637887 46.522017, -0.637354 46.51923, -0.639987 46.515057, -0.638813 46.512765, -0.646087 46.512527, -0.645414 46.508851, -0.637768 46.506917, -0.634236 46.504493, -0.634197 46.502401, -0.624901 46.497564, -0.625355 46.494731, -0.6242 46.487581, -0.626729 46.482436, -0.629537 46.481163, -0.631064 46.478691, -0.619147 46.475858, -0.616963 46.47186, -0.616113 46.461783, -0.610379 46.457864, -0.608706 46.454378, -0.609963 46.453486, -0.610772 46.449865, -0.613573 46.44892, -0.618103 46.454996, -0.620309 46.453284, -0.616628 46.44682, -0.618531 46.438947, -0.636508 46.432383, -0.634617 46.42897, -0.635657 46.425563, -0.638476 46.421732, -0.640627 46.416371, -0.639313 46.416265, -0.639502 46.410679, -0.628998 46.404114, -0.632845 46.401195, -0.637908 46.400047, -0.64068 46.39718, -0.637446 46.39588, -0.634376 46.395785, -0.62093 46.390698, -0.616127 46.39806, -0.612648 46.411604, -0.60997 46.413784, -0.602342 46.412813, -0.593899 46.410075, -0.588559 46.405674, -0.582226 46.402395, -0.572383 46.40084, -0.571837 46.396114, -0.566119 46.393079, -0.550565 46.393395, -0.547652 46.391239, -0.540092 46.388367, -0.538114 46.386377, -0.544455 46.379141, -0.54616 46.375225, -0.557555 46.364245, -0.558174 46.361931, -0.561678 46.360737, -0.562021 46.359502, -0.572139 46.358344, -0.577068 46.355404, -0.586195 46.356943, -0.603051 46.36149, -0.604958 46.359518, -0.606853 46.355112, -0.603394 46.35434, -0.605109 46.347318, -0.606803 46.347497, -0.612835 46.344254, -0.61861 46.339032, -0.621572 46.337935, -0.627385 46.337887, -0.629835 46.336388, -0.63312 46.338551, -0.637155 46.337013, -0.639515 46.329094, -0.635706 46.327829, -0.636783 46.324405, -0.643459 46.319408, -0.649704 46.316985, -0.651972 46.317529, -0.657001 46.314961, -0.66175 46.316963, -0.672243 46.316298, -0.676642 46.318485, -0.678294 46.318338, -0.697233 46.325083, -0.706659 46.318218, -0.710484 46.316953, -0.716471 46.316852, -0.721051 46.314174, -0.721348 46.311757, -0.724012 46.309806, -0.71579 46.307083, -0.71965 46.303101, -0.721935 46.302549, -0.731055 46.303752, -0.734731 46.305034, -0.741386 46.304972, -0.74755 46.302886, -0.750289 46.304377, -0.75893 46.311959, -0.762494 46.312845, -0.769953 46.312836, -0.775798 46.318715, -0.785036 46.319185, -0.789035 46.322712, -0.793866 46.325055, -0.800268 46.32463, -0.803039 46.325392, -0.807668 46.331054, -0.807178 46.334109, -0.804385 46.336319, -0.800329 46.337213, -0.797038 46.339239, -0.799785 46.342365, -0.803605 46.342882, -0.806173 46.341811, -0.80964 46.338625, -0.817711 46.336526, -0.823579 46.336016, -0.826268 46.336847, -0.829663 46.340813, -0.834032 46.342183, -0.840968 46.340023, -0.846452 46.335059, -0.848805 46.331784, -0.84779 46.328784, -0.844776 46.325497, -0.849388 46.318393, -0.852679 46.317409, -0.860987 46.317957, -0.863154 46.31945, -0.862857 46.322231, -0.860446 46.32479, -0.861408 46.326292, -0.865332 46.327689, -0.868298 46.326457, -0.869752 46.322487, -0.874233 46.322563, -0.87757 46.324134, -0.884314 46.324288, -0.887128 46.326867, -0.889867 46.323458, -0.893356 46.322918, -0.892715 46.319914, -0.894736 46.316992, -0.899021 46.316977, -0.903557 46.314192, -0.908928 46.314403, -0.912338 46.313058, -0.915375 46.316163, -0.918929 46.313045, -0.923026 46.313138, -0.925959 46.31564, -0.928701 46.314482, -0.928457 46.310796, -0.92998 46.31009, -0.934321 46.311757, -0.935534 46.314911, -0.941487 46.315692, -0.943208 46.318109, -0.947087 46.317692, -0.950724 46.319283, -0.952514 46.318937, -0.956415 46.321013, -0.959645 46.321303, -0.963127 46.322744, -0.956805 46.325602, -0.953739 46.329781, -0.950504 46.331496, -0.942594 46.337948, -0.938865 46.345597, -0.938538 46.352176, -0.936179 46.354123, -0.931834 46.365745, -0.927318 46.370812, -0.929713 46.371448, -0.934139 46.367304, -0.938289 46.366236, -0.942146 46.368106, -0.951095 46.360274, -0.964889 46.365361, -0.969925 46.358338, -0.970373 46.354968, -0.974551 46.351307, -0.99492 46.350448, -0.995312 46.351651, -0.999659 46.354824, -1.012902 46.349281, -1.013427 46.355583, -1.029106 46.349004, -1.030181 46.351529, -1.052409 46.342609, -1.053715 46.349453, -1.054521 46.347257, -1.062908 46.337223, -1.068373 46.331954, -1.074111 46.328819, -1.073276 46.32701, -1.081013 46.324142, -1.079332 46.321071, -1.075202 46.320186, -1.074958 46.317874, -1.08399 46.316934, -1.088592 46.317824, -1.092145 46.317134, -1.095148 46.312486, -1.09812 46.312797, -1.099207 46.315588, -1.102677 46.316215, -1.106373 46.314716, -1.109354 46.316233, -1.115746 46.317179, -1.116904 46.318536, -1.116618 46.32182, -1.117617 46.323216, -1.120206 46.323911, -1.122922 46.323085, -1.123876 46.32045, -1.123536 46.315122, -1.127321 46.312549, -1.131668 46.304897, -1.142493 46.30746, -1.145378 46.309687, -1.149443 46.309881, -1.154924 46.312022, -1.167511 46.311968, -1.170526 46.310349, -1.177723 46.310977, -1.179839 46.308574, -1.18358 46.307351, -1.185791 46.307642, -1.186977 46.305352, -1.194512 46.30037, -1.206384 46.289114, -1.208025 46.283366, -1.208407 46.278116, -1.205224 46.271248, -1.202174 46.268762, -1.205165 46.266537, -1.209378 46.267922, -1.213976 46.27176, -1.220209 46.273261, -1.226099 46.276871, -1.23035 46.277763, -1.233354 46.280667, -1.237072 46.282508, -1.246519 46.289954, -1.268993 46.30015, -1.273371 46.302858, -1.278671 46.307625, -1.283861 46.309454, -1.294737 46.310334, -1.296858 46.311789, -1.297433 46.317721, -1.298391 46.319072, -1.304215 46.321957, -1.306739 46.32471, -1.309591 46.330189, -1.314043 46.334295, -1.319988 46.337101, -1.327964 46.338487, -1.323545 46.336841, -1.319684 46.336626, -1.313567 46.333246, -1.31048 46.33018, -1.30799 46.324941, -1.303775 46.32028, -1.299302 46.318331, -1.298694 46.312124, -1.294381 46.30592, -1.290941 46.30614, -1.286945 46.308255, -1.283572 46.307963, -1.279158 46.304552, -1.275037 46.299351, -1.268189 46.293463, -1.26906 46.289711, -1.263365 46.28511, -1.265229 46.283116, -1.271975 46.282444, -1.277244 46.285269, -1.280264 46.284881, -1.284699 46.285929, -1.296114 46.290426, -1.302741 46.29444, -1.30811 46.300891, -1.31193 46.303536, -1.319445 46.316896, -1.328481 46.326793, -1.345137 46.336881, -1.356055 46.342489, -1.355158 46.345759, -1.367658 46.348704, -1.373026 46.34866, -1.377099 46.34771, -1.38315 46.342549, -1.397082 46.340725, -1.403875 46.341339, -1.414557 46.345784, -1.423455 46.347639, -1.428484 46.347222, -1.431212 46.343999, -1.437725 46.340038, -1.443964 46.340871, -1.449133 46.340369, -1.467251 46.34243, -1.470072 46.343943, -1.47624 46.35888, -1.478512 46.366326, -1.483761 46.373351, -1.486725 46.37874, -1.496097 46.390535, -1.502055 46.396663, -1.50585 46.399425, -1.51574 46.4041, -1.524956 46.404985, -1.53361 46.408307, -1.541221 46.409484, -1.548026 46.405393, -1.569561 46.406976, -1.572163 46.408023, -1.583283 46.409723, -1.584629 46.407849, -1.604706 46.412369, -1.611704 46.41322, -1.615955 46.412386, -1.621047 46.413338, -1.623606 46.412939, -1.627793 46.413903, -1.628663 46.416425, -1.631933 46.418193, -1.63641 46.419189, -1.63957 46.418752, -1.648493 46.419767, -1.654443 46.421244, -1.654663 46.42431, -1.650119 46.425089, -1.647719 46.428668, -1.649756 46.431501, -1.663832 46.434924, -1.667509 46.437881, -1.672458 46.437946, -1.676069 46.439269, -1.677023 46.440775, -1.694789 46.444502, -1.697338 46.447432, -1.701031 46.447266, -1.70544 46.449112, -1.706155 46.450274, -1.710229 46.450576, -1.71117 46.453259, -1.712935 46.454014, -1.714188 46.458786, -1.718837 46.459007, -1.721978 46.457572, -1.724852 46.458772, -1.730171 46.462811, -1.746133 46.470312, -1.746889 46.471548, -1.757589 46.474876, -1.761577 46.477774, -1.761702 46.480306, -1.770988 46.489216, -1.777938 46.492621, -1.783186 46.494147, -1.790126 46.494228, -1.792829 46.492346, -1.792614 46.490015, -1.800036 46.488009, -1.805635 46.48899, -1.807255 46.491211, -1.813913 46.494258, -1.820805 46.510031, -1.820148 46.512467, -1.821618 46.517844, -1.819548 46.518087, -1.82321 46.531062, -1.828552 46.544776, -1.831537 46.548367, -1.838254 46.562875, -1.840175 46.569817, -1.844413 46.578192, -1.845948 46.579737, -1.853684 46.602151, -1.857732 46.610398, -1.862332 46.613126, -1.864002 46.615477, -1.869705 46.616288, -1.873169 46.619785, -1.873131 46.62168, -1.875612 46.627849, -1.8777 46.629398, -1.88373 46.631174, -1.889788 46.634113, -1.893518 46.637868, -1.897746 46.640106, -1.904602 46.64856, -1.908637 46.652187, -1.908496 46.655448, -1.912402 46.66117, -1.91904 46.666732, -1.931208 46.681585, -1.943741 46.692934, -1.947536 46.694629, -1.948566 46.697005, -1.952628 46.694478, -1.960016 46.694188, -1.961567 46.692017, -1.966235 46.692416, -1.972195 46.697047, -1.973331 46.699322, -1.979488 46.704723, -1.979225 46.70696, -1.980651 46.709649, -1.979225 46.715876, -1.980543 46.718508, -2.022579 46.750576, -2.068242 46.779337, -2.121299 46.80455, -2.138277 46.815029, -2.142841 46.818618, -2.144313 46.821863, -2.146766 46.835905, -2.146404 46.851717, -2.147276 46.857642, -2.14961 46.869816, -2.157071 46.885763, -2.156146 46.889601, -2.152559 46.890598, -2.149468 46.889477, -2.145692 46.889624, -2.142622 46.891369, -2.137263 46.892744, -2.134337 46.891798, -2.126762 46.892448, -2.120737 46.900602, -2.117865 46.909114, -2.113977 46.911755, -2.106491 46.919823, -2.097987 46.925145, -2.095321 46.926044, -2.091548 46.930337, -2.084673 46.933416, -2.083923 46.93816, -2.075047 46.940048, -2.058233 46.950747, -2.044374 46.968525, -2.046227 46.968648, -2.047756 46.977958, -2.038419 46.991878, -2.035115 46.992686, -2.038689 46.995459, -2.038435 46.998328, -2.031588 46.999019, -2.030717 47.004247, -2.029034 47.007773, -2.016889 47.01239, -2.010031 47.016734, -1.997288 47.018552, -1.981275 47.027165, -1.984323 47.029732, -1.983688 47.030679, -1.987869 47.039027, -1.99336 47.046002, -1.997262 47.053383, -1.999305 47.056137, -2.001085 47.05645, -2.00372 47.060464, -2.007989 47.063239, -2.014022 47.064689, -2.020457 47.06856, -2.028097 47.070737, -2.036345 47.076722, -2.039833 47.077274, -2.043368 47.083734, -2.048964 47.086516, -2.051275 47.089278, -2.053512 47.094609, -2.070528 47.098767, -2.073341 47.101259, -2.08029 47.101227, -2.083346 47.103161, -2.090808 47.103895, -2.097246 47.106928, -2.104684 47.106508, -2.107998 47.109262, -2.105789 47.110413, -2.102659 47.114069, -2.104829 47.114478, -2.107192 47.111932, -2.110842 47.10999, -2.116457 47.109492, -2.117996 47.110331, -2.121988 47.109514, -2.127364 47.112116, -2.131046 47.11106, -2.136047 47.110862, -2.140297 47.112084, -2.145738 47.112264, -2.147519 47.113167, -2.151045 47.112848, -2.158497 47.114076, -2.161922 47.115253, -2.164983 47.118528, -2.167154 47.117747, -2.176731 47.120334, -2.178191 47.121657, -2.192661 47.12239, -2.195766 47.123715, -2.200125 47.12321, -2.203498 47.124669, -2.207386 47.125122, -2.214614 47.123699, -2.220662 47.125289, -2.221904 47.127686, -2.22703 47.130822, -2.234199 47.131775, -2.238047 47.130527, -2.242419 47.132459, -2.245606 47.13084, -2.247935 47.134056, -2.245034 47.137216, -2.242596 47.135927, -2.237013 47.139038, -2.234231 47.142174, -2.23287 47.142113, -2.229011 47.14486, -2.225642 47.152336, -2.222142 47.153873, -2.219112 47.15352, -2.208448 47.157292, -2.205239 47.156733, -2.197472 47.159203, -2.188271 47.157167, -2.183373 47.157478, -2.179123 47.156044, -2.176446 47.157311, -2.170233 47.163542, -2.164395 47.175662, -2.163983 47.179277, -2.16259 47.181682, -2.161021 47.188546, -2.161526 47.193554, -2.159219 47.195511, -2.158712 47.197708, -2.162802 47.209274, -2.163088 47.213914, -2.16583 47.21442, -2.167101 47.216606, -2.181496 47.232072, -2.182041 47.235692, -2.178199 47.237609, -2.175167 47.236739, -2.171962 47.239148, -2.169681 47.24937, -2.171143 47.263528, -2.170427 47.268746, -2.168365 47.269244, -2.164116 47.268167, -2.162545 47.269304, -2.149958 47.270349, -2.1337 47.274832, -2.115096 47.275872, -2.115342 47.281129, -2.099551 47.281738, -2.098483 47.280181, -2.062354 47.281905, -2.053257 47.285506, -2.044404 47.292027, -2.031057 47.291343, -2.027146 47.289965, -2.006091 47.286976, -2.005834 47.294403, -2.010663 47.294983, -2.032471 47.301418)), ((-0.341794 47.087384, -0.3417811381014327 47.08748194993711, -0.3417655774515091 47.087386659963634, -0.341794 47.087384)), ((-0.341188 47.091999, -0.349044 47.091592, -0.34921277323225797 47.09172999424087, -0.340917 47.092061, -0.3413030236388612 47.0911230361496, -0.341188 47.091999)), ((-0.3691558728829346 47.09143564325446, -0.368792 47.091703, -0.3681481499656784 47.091814973919014, -0.3691558728829346 47.09143564325446)), ((-0.3803147988555136 47.08971740273918, -0.380109 47.09001, -0.37683036632614975 47.088755191641184, -0.3803147988555136 47.08971740273918)), ((-0.383869 47.08749, -0.38430409088009554 47.08746405582182, -0.3836970213602107 47.087620355707635, -0.383869 47.08749)), ((-0.386351 47.087342, -0.38646102897948953 47.088065403863816, -0.386349 47.087343, -0.3863168644932478 47.087344035477436, -0.386351 47.087342)), ((-0.39088191546174444 47.09201022553183, -0.387114 47.092276, -0.3871134011072399 47.09227213812028, -0.39088191546174444 47.09201022553183)), ((-0.396697 47.083261, -0.3967285064306482 47.08317647910853, -0.396159 47.091638, -0.3960654066890819 47.091644601717235, -0.396697 47.083261)), ((-0.40095566795909054 47.0718364620575, -0.400268 47.074938, -0.39694409673204367 47.08259812465545, -0.40095566795909054 47.0718364620575)), ((-0.402944 47.06866, -0.40556378173261937 47.067616766262255, -0.4015459226340491 47.07049780239671, -0.402944 47.06866)), ((-0.417621 47.070724, -0.422818 47.069782, -0.42289647070947267 47.069852264450844, -0.418326 47.071955, -0.41758152420617656 47.07070354394554, -0.417621 47.070724)), ((-0.42457383357347717 47.07135421315634, -0.424254 47.071464, -0.42373286123351833 47.07060118747271, -0.42457383357347717 47.07135421315634)), ((-0.428836 47.072509, -0.437379 47.069877, -0.4407705141565704 47.067930328878774, -0.439206 47.068855, -0.438973 47.069898, -0.426981 47.072988, -0.425819 47.072494, -0.4258157314362948 47.07246207351323, -0.428836 47.072509)), ((-0.441238 47.067662, -0.454367 47.067332, -0.4544389494967627 47.067363754141205, -0.44113398201352566 47.06772170454523, -0.441238 47.067662)), ((-0.4614225617232834 47.068644910461906, -0.461078 47.068813, -0.46099085388410654 47.06869269045734, -0.4614225617232834 47.068644910461906)), ((-0.46554195723134395 47.06629668008338, -0.465024 47.066888, -0.46174877780700324 47.06848577058325, -0.46554195723134395 47.06629668008338)), ((-0.47175 47.058117, -0.47194748803236847 47.05795633306641, -0.471237 47.059795, -0.4675132495662173 47.0640461768593, -0.47175 47.058117)), ((-0.476915 47.053915, -0.4793321256175541 47.053592230552304, -0.4763769209345769 47.054352755708216, -0.476915 47.053915)), ((-0.480562 47.053428, -0.485674 47.063937, -0.485483 47.06533, -0.4850257511693596 47.06576572811287, -0.485332 47.063885, -0.4803746566887061 47.05345301677888, -0.480562 47.053428)), ((-0.48032 47.07025, -0.4794327886006138 47.07075853164534, -0.48309081091292344 47.067609599130044, -0.48032 47.07025)), ((-0.4713328467301733 47.07274436827911, -0.472027 47.072332, -0.4757886900161014 47.072070969590115, -0.4713328467301733 47.07274436827911)), ((-0.468179 47.073221, -0.46415362902679486 47.07461485100317, -0.464185 47.074359, -0.468249 47.073194, -0.46828586229072233 47.07320485021154, -0.468179 47.073221)), ((-0.464242 47.075683, -0.4639964340261098 47.075896880041775, -0.46411975848924386 47.074891087604236, -0.464242 47.075683)), ((-0.459189 47.080084, -0.4596501255537318 47.08204428265699, -0.459531 47.082046, -0.458991 47.079943, -0.4622164043573792 47.07744722846293, -0.459189 47.080084)), ((-0.47159975359016104 47.082471451075946, -0.468364 47.083816, -0.4681402929923137 47.08371061499459, -0.47159975359016104 47.082471451075946)), ((-0.473505 47.081789, -0.47471697278437286 47.082429287508724, -0.47338939559008014 47.081830409002805, -0.473505 47.081789)), ((-0.47615394223790325 47.08300129932788, -0.476073 47.083041, -0.4760333177049281 47.08302309906461, -0.47615394223790325 47.08300129932788)), ((-0.48744966017783975 47.08095989306382, -0.484783 47.081687, -0.4833746734331433 47.081696340584095, -0.48744966017783975 47.08095989306382)), ((-0.492938 47.083313, -0.502452 47.079843, -0.5029697500286452 47.07976930598165, -0.493101 47.083353, -0.490791 47.082896, -0.48777275218616584 47.08090328396301, -0.492938 47.083313)), ((-0.5076718380888184 47.079100033659884, -0.507317 47.079241, -0.5065191617863474 47.07926409999283, -0.5076718380888184 47.079100033659884)), ((-0.512173 47.07744, -0.515268 47.077998, -0.524487 47.074276, -0.5251839100812622 47.074137566590935, -0.51525 47.078035, -0.5120136644161671 47.07750354979879, -0.512173 47.07744)), ((-0.535507 47.072087, -0.53876 47.070097, -0.544601 47.068061, -0.545923 47.066432, -0.5462230560046099 47.06636954466871, -0.544635 47.068135, -0.535313 47.0722, -0.5314046473433887 47.072901886566726, -0.535507 47.072087)), ((-0.557463 47.06403, -0.559278 47.061798, -0.5575982883816426 47.061056041493735, -0.559461 47.061813, -0.557553 47.06409, -0.55189227244443 47.06518952232136, -0.557463 47.06403)), ((-0.556507 47.060574, -0.554252 47.057285, -0.558094 47.055973, -0.5582745306388526 47.05326504041721, -0.558239 47.056069, -0.554371 47.05726, -0.5566692194782514 47.060645655229656, -0.556507 47.060574)), ((-0.555658 47.042613, -0.5553203503638842 47.04242834478258, -0.556265 47.042695, -0.5560440975438603 47.044130439512294, -0.555658 47.042613)), ((-0.549039 47.041082, -0.5485513471294586 47.04041476702476, -0.548737 47.04057, -0.5516812209438812 47.04140109318621, -0.549039 47.041082)), ((-0.543737 47.036695, -0.5435592935935457 47.036240679542445, -0.5450255221508034 47.03746666123976, -0.543737 47.036695)), ((-0.542217 47.032809, -0.5424197932107816 47.03267017639902, -0.542997 47.033622, -0.5426995000997724 47.03404254959718, -0.542217 47.032809)), ((-0.552053 47.029, -0.5542484562518981 47.030230039496075, -0.5517748035356896 47.02906810584119, -0.552053 47.029)), ((-0.5640741448688028 47.02592815762922, -0.564087 47.026005, -0.562342 47.030496, -0.5612979493047805 47.03055961767706, -0.5640741448688028 47.02592815762922)), ((-0.564646 47.020228, -0.5652264143167098 47.01998296546704, -0.564869 47.020141, -0.5645412450571938 47.02133907314103, -0.564646 47.020228)), ((-0.56949 47.018183, -0.5711167761632182 47.01812997398659, -0.5692752570561823 47.0182736584063, -0.56949 47.018183)), ((-0.579473 47.015378, -0.5834907385372773 47.012317380872005, -0.580904 47.014612, -0.574987 47.017828, -0.5739981247923656 47.01790515692975, -0.579473 47.015378)), ((-0.5869486003516973 47.007211666747125, -0.587014 47.009192, -0.5862711523072205 47.00985095818246, -0.5869486003516973 47.007211666747125)), ((-0.587217 47.006166, -0.5872929394992047 47.006103610033115, -0.5871877119886153 47.006280104097335, -0.587217 47.006166)), ((-0.589173 47.004559, -0.594553 47.002861, -0.597046 47.000765, -0.5969846080262176 47.00065228726875, -0.597171 47.000769, -0.594749 47.002794, -0.5886034899987862 47.00502689497544, -0.589173 47.004559)), ((-0.595455 46.997844, -0.5983805740247622 46.99784109091082, -0.595493 46.99791, -0.5954914242760251 46.99791087323084, -0.595455 46.997844)), ((-0.611663 46.994039, -0.6176156494542291 46.992709998291154, -0.6021046676807195 46.99760810796943, -0.611663 46.994039)), ((-0.6224558943959153 46.99371795408759, -0.621938 46.993911, -0.6189431475573631 46.99242258584653, -0.6224558943959153 46.99371795408759)), ((-0.6326868633376213 46.99749074867015, -0.63266 46.997508, -0.626743 46.996879, -0.6278874470454501 46.99572090537479, -0.6326868633376213 46.99749074867015)), ((-0.635261 46.995814, -0.6352948346037052 46.99581593918899, -0.6351851351003205 46.99588638696222, -0.635261 46.995814)), ((-0.6403567780766788 46.99610605829579, -0.640352 46.996116, -0.6398971323899606 46.996079714264724, -0.6403567780766788 46.99610605829579)), ((-0.6434218584071346 46.99380343362827, -0.642167 46.994818, -0.6421200406825756 46.99481188397829, -0.6434218584071346 46.99380343362827)), ((-0.6464488304637879 46.99369986567167, -0.646391 46.99368, -0.6464104275249908 46.99363331950212, -0.6464488304637879 46.99369986567167)), ((-0.65002 46.99505, -0.6483294829452705 46.996734500979805, -0.648025 46.996594, -0.6498903706221957 46.995003645890485, -0.65002 46.99505)), ((-0.653518 46.99779, -0.6535851836905956 46.997817669817216, -0.6535129212243874 46.99779087882234, -0.653518 46.99779)), ((-0.6574631231269518 46.99896947417369, -0.657311 46.999199, -0.6570400821525655 46.99909855838703, -0.6574631231269518 46.99896947417369)), ((-0.6616182266988745 46.997701610518824, -0.660979 46.998839, -0.658487359013965 46.99865694491114, -0.6616182266988745 46.997701610518824)), ((-0.661653 46.997691, -0.661952281434718 46.99780797075218, -0.6616460169239949 46.99769313077439, -0.661653 46.997691)), ((-0.670429 47.001121, -0.6702583292832465 47.002169326926854, -0.6699697885264497 47.00094152240721, -0.670429 47.001121)), ((-0.6724180344234812 47.00287229004231, -0.671843 47.003185, -0.6712100401657285 47.00294941020406, -0.6724180344234812 47.00287229004231)), ((-0.676743034236543 47.00051038281922, -0.676179 47.001885, -0.6751763065571047 47.00170369104868, -0.676743034236543 47.00051038281922)), ((-0.6758249033702463 46.996897697353916, -0.676007 46.997074, -0.6753436340883097 46.9981655621041, -0.6758249033702463 46.996897697353916)), ((-0.677686 46.989134, -0.6796613689608947 46.988146691493846, -0.6780564147162824 46.9896329740617, -0.677686 46.989134)), ((-0.686601 46.987968, -0.6867711016411456 46.988075533517, -0.682981 46.98842, -0.6808266382180916 46.98783300776368, -0.686601 46.987968)), ((-0.688553 46.989202, -0.6886951971619505 46.98963117077191, -0.6872451581089017 46.9883752188045, -0.688553 46.989202)), ((-0.6898197967295191 46.99302536836267, -0.689629 46.993058, -0.6896218510690343 46.99242794088422, -0.6898197967295191 46.99302536836267)), ((-0.698702 46.994585, -0.69945 46.993286, -0.7044578673254455 46.99047195100628, -0.703637 46.991424, -0.70435 46.992196, -0.700809 46.992531, -0.698748 46.99461, -0.696663 46.994873, -0.696636926848806 46.99485325466065, -0.698702 46.994585)), ((-0.715881 46.984053, -0.7158874824567 46.984062178787696, -0.712202 46.986674, -0.7061473870714967 46.98952256656131, -0.715881 46.984053)), ((-0.7190000901994882 46.987892946331364, -0.718107 46.987193, -0.7178856314390012 46.98686781368331, -0.7190000901994882 46.987892946331364)), ((-0.72676 46.99345, -0.7294089018966339 46.99600538945638, -0.72926 46.995934, -0.7253361397680932 46.99285873215394, -0.72676 46.99345)), ((-0.739572 46.998836, -0.743401 47.000959, -0.7434819924928819 46.99867281889088, -0.743405 47.000992, -0.7395574506088287 46.998833260456095, -0.739572 46.998836)), ((-0.7430445279977965 46.99224404108186, -0.743626 46.994335, -0.7436217422845758 46.994463251636105, -0.7430445279977965 46.99224404108186)), ((-0.747802 46.991541, -0.7478428486994089 46.99155899376982, -0.747779950767796 46.9915434239006, -0.747802 46.991541)), ((-0.754708902498637 46.992612724255316, -0.753551 46.992972, -0.752393650795236 46.99268550765761, -0.754708902498637 46.992612724255316)), ((-0.76243 46.99237, -0.7629918667807284 46.992681165067545, -0.7619443188970353 46.99238526811234, -0.76243 46.99237)), ((-0.765478 46.994058, -0.766567011180406 46.99550168913366, -0.76528 46.994815, -0.7654663273518074 46.99405153562003, -0.765478 46.994058)), ((-0.768748 46.998393, -0.7689051735944741 47.002214457394636, -0.768472 47.001449, -0.767998 46.99898, -0.768693 46.998337, -0.7686939120170678 46.998321296206115, -0.768748 46.998393)), ((-0.7701922501849866 47.00318523120572, -0.769335 47.002974, -0.76913354996482 47.002618019346876, -0.7701922501849866 47.00318523120572)), ((-0.772622 47.004487, -0.77638 47.003017, -0.7764063538067401 47.00303223375693, -0.773718 47.004606, -0.772268 47.004577, -0.7718516294226294 47.004074264346535, -0.772622 47.004487)), ((-0.7785620826371522 47.0042783478132, -0.778001 47.00428, -0.7766981501504754 47.00320090595743, -0.7785620826371522 47.0042783478132)), ((-0.7816465838154405 47.00227203910258, -0.779699 47.004275, -0.7786388011745905 47.00427812190467, -0.7816465838154405 47.00227203910258)), ((-0.781966 47.002059, -0.7820076627691509 47.00209494147339, -0.7818720253817789 47.00212167768917, -0.781966 47.002059)), ((-0.7872720543809799 47.0051357432289, -0.786724 47.005452, -0.784649384356195 47.00430437972876, -0.7872720543809799 47.0051357432289)), ((-0.7906546169952946 47.000892977611876, -0.789635 47.002406, -0.78967 47.003752, -0.7877577089360617 47.00485549450397, -0.7906546169952946 47.000892977611876)), ((-0.791692 46.999474, -0.7961118591223406 46.99617238293865, -0.791297814191919 47.00001318449989, -0.791692 46.999474)), ((-0.808403 46.991586, -0.8083749854225803 46.99156847707312, -0.809145 46.99059, -0.810871 46.991732, -0.807032 46.994405, -0.8069770230059816 46.994394954681766, -0.808403 46.991586)), ((-0.805108 46.989525, -0.8076665916588466 46.98806700157569, -0.807346 46.988608, -0.8051209700904761 46.98953311270303, -0.805108 46.989525)), ((-0.8099054302139941 46.98865086550853, -0.809551 46.988562, -0.8093903282680468 46.98828893209795, -0.8099054302139941 46.98865086550853)), ((-0.812604 46.990547, -0.8126002692433345 46.990567154251806, -0.812597 46.990568, -0.8125900266955104 46.99053718173821, -0.812604 46.990547)), ((-0.811873 46.994496, -0.8130694774849495 46.99408708546666, -0.811747 46.994549, -0.811339 46.991774, -0.8124736013133625 46.9912514383222, -0.811873 46.994496)), ((-0.815589 46.993226, -0.8156742349025659 46.99324745888322, -0.8154903612994103 46.99325971128895, -0.815589 46.993226)), ((-0.818711 46.994012, -0.826549 46.992632, -0.8280170040975143 46.991622990056776, -0.826568 46.992643, -0.81869 46.994079, -0.8185630449571221 46.99397475058818, -0.818711 46.994012)), ((-0.83949 46.985388, -0.84306 46.990094, -0.8432023835200954 46.98997263410858, -0.842993 46.990173, -0.839504 46.985428, -0.8386984215420525 46.98551311964725, -0.83949 46.985388)), ((-0.8474906899528284 46.98631733655357, -0.847436 46.986872, -0.8469388016860249 46.986787759053435, -0.8474906899528284 46.98631733655357)), ((-0.847927 46.981953, -0.848441943727889 46.98200331458258, -0.8479226897943654 46.982013844065584, -0.847927 46.981953)), ((-0.855365 46.977391, -0.8519035912021574 46.975124537096484, -0.85654 46.977397, -0.857129 46.978461, -0.8561942341482982 46.978900170174455, -0.855365 46.977391)), ((-0.851799 46.971244, -0.8523719130238475 46.9711990007674, -0.8516347445722372 46.97181630799966, -0.851799 46.971244)), ((-0.8551635415484966 46.97097973338112, -0.854617 46.971188, -0.8536315860658032 46.97110006023393, -0.8551635415484966 46.97097973338112)), ((-0.860752 46.968918, -0.8627848463070165 46.97030520008207, -0.861169 46.970234, -0.861437 46.969427, -0.860720855824619 46.968929652119535, -0.860752 46.968918)), ((-0.862808 46.970321, -0.8628821369295863 46.97142281134168, -0.862043 46.971125, -0.8627964159811281 46.97031309514665, -0.862808 46.970321)), ((-0.8645525033526239 46.97282925376255, -0.863054 46.972617, -0.8630541772893132 46.97259474034178, -0.8645525033526239 46.97282925376255)), ((-0.8667183160804068 46.97311813189592, -0.866704 46.973134, -0.8666702880727887 46.97312922491333, -0.8667183160804068 46.97311813189592)), ((-0.8692129535189275 46.972541946085045, -0.868179 46.973273, -0.8676914836574042 46.97289335961406, -0.8692129535189275 46.972541946085045)), ((-0.870425 46.972262, -0.872961226633606 46.9739864038065, -0.872356 46.973921, -0.8702251724650165 46.97230815411783, -0.870425 46.972262)), ((-0.87911 46.974628, -0.8791173644273369 46.97465166673896, -0.8774635298340564 46.97447294513002, -0.87911 46.974628)), ((-0.8821599075411882 46.9766851707185, -0.882064 46.977455, -0.8796398697377759 46.97610448253928, -0.8821599075411882 46.9766851707185)), ((-0.8849387956823328 46.97732550535663, -0.884937 46.977334, -0.8847635278570178 46.97728511867901, -0.8849387956823328 46.97732550535663)), ((-0.888017 46.975717, -0.8882087678025378 46.97571787371428, -0.886918 46.976492, -0.8866232351865962 46.976459545758345, -0.888017 46.975717)))

The a zone (save it under a.wkt):

POLYGON ((-1.003499 47.034155, -1.005892 47.034645, -1.008813 47.037094, -1.010507 47.036397, -1.012062 47.037209, -1.012478 47.036518, -1.011117 47.034892, -1.011849 47.034329, -1.017553 47.03602, -1.020219 47.0374, -1.018823 47.038146, -1.020713 47.0395, -1.020078 47.042246, -1.022619 47.044506, -1.023727 47.044304, -1.023855 47.042567, -1.028338 47.043193, -1.028526 47.046577, -1.033921 47.044428, -1.038031 47.045406, -1.040996 47.047222, -1.040363 47.048076, -1.041309 47.050274, -1.043862 47.052359, -1.042479 47.052727, -1.040741 47.052037, -1.031558 47.055852, -1.03872 47.061387, -1.04296 47.059505, -1.042919 47.063977, -1.046194 47.068615, -1.041014 47.073183, -1.039291 47.07315, -1.035791 47.070638, -1.039566 47.067823, -1.038371 47.067549, -1.038363 47.068104, -1.032856 47.070107, -1.032601 47.071583, -1.030644 47.072867, -1.026835 47.077853, -1.023597 47.077407, -1.017289 47.074766, -1.013411 47.075481, -1.012071 47.07765, -1.008233 47.080038, -1.004834 47.080101, -1.001639 47.082483, -0.996599 47.08316, -0.998069 47.085131, -0.997505 47.086696, -0.998496 47.088622, -0.997895 47.09084, -0.99311 47.089019, -0.9921 47.09038, -0.989408 47.091092, -0.984779 47.094839, -0.979903 47.096908, -0.978438 47.100071, -0.969109 47.101294, -0.966329 47.104755, -0.96872 47.105441, -0.970367 47.106898, -0.967849 47.107754, -0.96705 47.108872, -0.967254 47.109873, -0.964548 47.114124, -0.965263 47.115767, -0.961096 47.116071, -0.95651 47.11443, -0.953683 47.114413, -0.950936 47.115496, -0.949882 47.117637, -0.946038 47.119935, -0.946189 47.120618, -0.952133 47.120092, -0.951528 47.123316, -0.948527 47.124269, -0.948981 47.125865, -0.946984 47.127447, -0.950375 47.129795, -0.948274 47.131818, -0.948601 47.132549, -0.954873 47.135147, -0.956686 47.136964, -0.956129 47.13727, -0.957614 47.13712, -0.956323 47.139477, -0.955037 47.144178, -0.955456 47.144794, -0.948285 47.149339, -0.944708 47.149874, -0.944796 47.151628, -0.941596 47.152113, -0.942047 47.153084, -0.940044 47.153671, -0.940798 47.154856, -0.938397 47.157361, -0.937325 47.157219, -0.934443 47.160325, -0.92893 47.162757, -0.927214 47.162774, -0.926071 47.163675, -0.918746 47.159644, -0.911496 47.159322, -0.910135 47.159648, -0.912727 47.164685, -0.911125 47.164967, -0.908851 47.160224, -0.906819 47.161096, -0.904825 47.161118, -0.90419 47.160098, -0.902938 47.161005, -0.899084 47.160432, -0.895814 47.161263, -0.888682 47.160368, -0.885042 47.158851, -0.879756 47.159392, -0.877381 47.158906, -0.875957 47.159696, -0.874066 47.158261, -0.866803 47.156878, -0.866328 47.154278, -0.863144 47.151598, -0.860479 47.151358, -0.855811 47.152801, -0.851464 47.152844, -0.839548 47.149972, -0.836781 47.150523, -0.831657 47.150077, -0.830325 47.152719, -0.827803 47.152363, -0.825337 47.156855, -0.821728 47.15623, -0.818054 47.154176, -0.808284 47.157468, -0.805691 47.156591, -0.802353 47.157038, -0.8017 47.153203, -0.7999 47.151605, -0.798743 47.152046, -0.79675 47.150273, -0.796446 47.14782, -0.792366 47.147384, -0.790662 47.148312, -0.789696 47.147616, -0.788176 47.149197, -0.786251 47.146968, -0.785197 47.146892, -0.784825 47.142603, -0.776545 47.14425, -0.775934 47.142725, -0.76298 47.14355, -0.765204 47.138177, -0.764681 47.137155, -0.765193 47.13241, -0.764166 47.130843, -0.757279 47.129441, -0.755615 47.126224, -0.753305 47.128401, -0.747465 47.126936, -0.743658 47.127853, -0.740311 47.130005, -0.727239 47.1286, -0.726214 47.127882, -0.722145 47.128122, -0.719932 47.128783, -0.719769 47.130794, -0.715656 47.132769, -0.7106 47.13282, -0.706937 47.130723, -0.705908 47.131881, -0.703497 47.131179, -0.701852 47.130356, -0.70149 47.127601, -0.699315 47.1292, -0.696088 47.129613, -0.694172 47.130908, -0.692463 47.129899, -0.688837 47.129736, -0.685009 47.131849, -0.679654 47.130824, -0.678609 47.129982, -0.671374 47.132367, -0.670074 47.134202, -0.666837 47.133182, -0.659606 47.136733, -0.661117 47.137602, -0.660788 47.138781, -0.662358 47.13973, -0.661645 47.142495, -0.660958 47.141474, -0.659167 47.141034, -0.657647 47.141996, -0.657742 47.141094, -0.65679 47.140824, -0.655244 47.141967, -0.655204 47.144456, -0.650964 47.14514, -0.650943 47.144014, -0.650229 47.144351, -0.648071 47.146159, -0.648111 47.148068, -0.645837 47.148712, -0.642901 47.150853, -0.641321 47.15116, -0.637368 47.149049, -0.636791 47.151277, -0.634778 47.151401, -0.614066 47.148949, -0.611255 47.147944, -0.608714 47.151739, -0.606431 47.153063, -0.606321 47.153981, -0.60299 47.157147, -0.598875 47.159885, -0.596559 47.163645, -0.593306 47.166566, -0.591142 47.169356, -0.590948 47.173115, -0.589552 47.175159, -0.581188 47.180057, -0.571555 47.189365, -0.565194 47.192525, -0.558835 47.194163, -0.557256 47.197598, -0.555665 47.199108, -0.555934 47.200523, -0.550243 47.20432, -0.547078 47.208665, -0.544078 47.207204, -0.533786 47.207824, -0.518344 47.210022, -0.506224 47.209061, -0.500894 47.20962, -0.497523 47.211184, -0.495366 47.210041, -0.493161 47.210967, -0.48982 47.2108, -0.479899 47.208412, -0.480932 47.206143, -0.483332 47.20406, -0.482276 47.200104, -0.48129 47.199278, -0.480203 47.199556, -0.478934 47.198011, -0.476512 47.198431, -0.473101 47.197326, -0.46267 47.206468, -0.461469 47.206421, -0.455677 47.211151, -0.453324 47.216126, -0.454212 47.218059, -0.448277 47.221702, -0.443709 47.220465, -0.439494 47.215173, -0.436489 47.21435, -0.432012 47.215171, -0.430493 47.214774, -0.42749 47.218448, -0.423234 47.221124, -0.421213 47.223417, -0.417328 47.223194, -0.408793 47.219609, -0.401168 47.219627, -0.401814 47.215326, -0.40383 47.213639, -0.405048 47.210537, -0.407826 47.206784, -0.410264 47.206932, -0.41171 47.205248, -0.409833 47.204575, -0.412285 47.201901, -0.412792 47.200155, -0.418511 47.195844, -0.418248 47.193134, -0.417619 47.190956, -0.413958 47.190365, -0.413439 47.187417, -0.412285 47.187333, -0.412716 47.185433, -0.411996 47.185065, -0.411807 47.183143, -0.413784 47.180231, -0.407773 47.179534, -0.402195 47.177222, -0.399488 47.177426, -0.397269 47.174935, -0.394587 47.176119, -0.38967 47.175879, -0.394179 47.171043, -0.406628 47.163987, -0.410125 47.158827, -0.404906 47.160023, -0.40023 47.155858, -0.399628 47.159767, -0.396127 47.159938, -0.384412 47.156495, -0.375187 47.151642, -0.369563 47.153469, -0.366432 47.151314, -0.36114 47.151223, -0.35578 47.149185, -0.353323 47.152762, -0.351485 47.152225, -0.352047 47.151282, -0.350341 47.148346, -0.350786 47.146715, -0.348841 47.146936, -0.347566 47.146139, -0.353369 47.141311, -0.350545 47.13761, -0.342742 47.134635, -0.338095 47.134994, -0.333255 47.133742, -0.334297 47.132289, -0.332489 47.131577, -0.33382 47.130432, -0.337955 47.130561, -0.341232 47.128987, -0.339153 47.12661, -0.339118 47.125369, -0.338209 47.125162, -0.33722 47.12614, -0.332498 47.125027, -0.330249 47.126144, -0.3293 47.12564, -0.330002 47.123199, -0.327816 47.122427, -0.325581 47.123121, -0.321459 47.121283, -0.323874 47.116436, -0.322166 47.113341, -0.322738 47.108762, -0.318197 47.107497, -0.317185 47.108012, -0.314916 47.106305, -0.315605 47.105394, -0.311854 47.104175, -0.312555 47.092257, -0.335593 47.087996, -0.341764 47.087377, -0.342071 47.089257, -0.340917 47.092061, -0.349764 47.091708, -0.353789 47.095386, -0.359845 47.093259, -0.368792 47.091703, -0.370858 47.090185, -0.376532 47.088641, -0.380109 47.09001, -0.381368 47.08822, -0.384549 47.087401, -0.386349 47.087343, -0.387114 47.092276, -0.396159 47.091638, -0.396735 47.08308, -0.400268 47.074938, -0.401197 47.070748, -0.407124 47.066498, -0.409291 47.066201, -0.417558 47.070664, -0.418326 47.071955, -0.423197 47.069714, -0.424254 47.071464, -0.425664 47.07098, -0.425819 47.072494, -0.426981 47.072988, -0.438973 47.069898, -0.439206 47.068855, -0.441123 47.067722, -0.45469 47.067357, -0.458225 47.068988, -0.460605 47.06816, -0.461078 47.068813, -0.465024 47.066888, -0.471237 47.059795, -0.472096 47.057572, -0.476341 47.054362, -0.48032 47.053338, -0.485332 47.063885, -0.484992 47.065973, -0.478094 47.071911, -0.472027 47.072332, -0.469805 47.073652, -0.468249 47.073194, -0.464185 47.074359, -0.463973 47.076088, -0.458991 47.079943, -0.459531 47.082046, -0.464456 47.081975, -0.468364 47.083816, -0.473271 47.081777, -0.476073 47.083041, -0.478752 47.081727, -0.484783 47.081687, -0.487739 47.080881, -0.490791 47.082896, -0.493101 47.083353, -0.504174 47.079332, -0.507317 47.079241, -0.511785 47.077466, -0.51525 47.078035, -0.525741 47.073919, -0.535313 47.0722, -0.544635 47.068135, -0.546309 47.066274, -0.557553 47.06409, -0.559461 47.061813, -0.5567 47.060691, -0.554371 47.05726, -0.558239 47.056069, -0.558275 47.053228, -0.556006 47.044378, -0.556265 47.042695, -0.548737 47.04057, -0.542042 47.034972, -0.542997 47.033622, -0.542336 47.032532, -0.54533 47.030668, -0.54581 47.029103, -0.547006 47.028835, -0.547965 47.029652, -0.551732 47.029048, -0.555679 47.030902, -0.562342 47.030496, -0.564087 47.026005, -0.563775 47.02414, -0.564869 47.020141, -0.569053 47.018291, -0.574987 47.017828, -0.580904 47.014612, -0.587014 47.009192, -0.586932 47.006709, -0.58775 47.005337, -0.594749 47.002794, -0.597171 47.000769, -0.593961 46.998759, -0.595493 46.99791, -0.601611 46.997764, -0.618781 46.992342, -0.621938 46.993911, -0.62494 46.992792, -0.624561 46.994115, -0.627917 46.995691, -0.626743 46.996879, -0.63266 46.997508, -0.635438 46.995724, -0.640352 46.996116, -0.641046 46.994672, -0.642167 46.994818, -0.645504 46.99212, -0.646962 46.992308, -0.646391 46.99368, -0.649992 46.994917, -0.648025 46.996594, -0.650398 46.997689, -0.653462 46.997772, -0.657311 46.999199, -0.657708 46.9986, -0.660979 46.998839, -0.661627 46.997686, -0.669937 47.000802, -0.670368 47.002636, -0.671843 47.003185, -0.674719 47.001621, -0.676179 47.001885, -0.676831 47.000296, -0.674732 46.999172, -0.676007 46.997074, -0.675567 46.996648, -0.68038 46.993238, -0.678529 46.992114, -0.677686 46.989976, -0.680188 46.987659, -0.682981 46.98842, -0.686887 46.988065, -0.689599 46.990414, -0.689629 46.993058, -0.693412 46.992411, -0.696663 46.994873, -0.698748 46.99461, -0.700809 46.992531, -0.70435 46.992196, -0.703637 46.991424, -0.704682 46.990212, -0.712202 46.986674, -0.715947 46.98402, -0.718107 46.987193, -0.72926 46.995934, -0.732543 46.997508, -0.739475 46.998787, -0.743405 47.000992, -0.743626 46.994335, -0.74298 46.992012, -0.747754 46.991537, -0.753551 46.992972, -0.756819 46.991958, -0.761515 46.992264, -0.76411 46.992997, -0.765475 46.994016, -0.76528 46.994815, -0.767098 46.995785, -0.768885 46.995031, -0.768693 46.998337, -0.767998 46.99898, -0.768472 47.001449, -0.769335 47.002974, -0.771352 47.003471, -0.772268 47.004577, -0.773718 47.004606, -0.776458 47.003002, -0.778001 47.00428, -0.779699 47.004275, -0.781774 47.002141, -0.783438 47.001813, -0.784541 47.002807, -0.784486 47.004214, -0.786724 47.005452, -0.78967 47.003752, -0.789635 47.002406, -0.791189 47.0001, -0.796264 46.996051, -0.800662 46.994378, -0.804104 46.99387, -0.807032 46.994405, -0.810871 46.991732, -0.809145 46.99059, -0.808373 46.991571, -0.805102 46.989541, -0.807346 46.988608, -0.808466 46.986718, -0.809551 46.988562, -0.812299 46.989251, -0.812597 46.990568, -0.815701 46.989765, -0.811339 46.991774, -0.811747 46.994549, -0.815426 46.993264, -0.817527 46.993124, -0.81869 46.994079, -0.826568 46.992643, -0.836343 46.985762, -0.839504 46.985428, -0.842993 46.990173, -0.846592 46.986729, -0.847436 46.986872, -0.847915 46.982014, -0.849641 46.981979, -0.857129 46.978461, -0.85654 46.977397, -0.849242 46.97382, -0.8526 46.971008, -0.854617 46.971188, -0.860658 46.968886, -0.861437 46.969427, -0.861169 46.970234, -0.862803 46.970306, -0.862043 46.971125, -0.863063 46.971487, -0.863054 46.972617, -0.866704 46.973134, -0.867239 46.972541, -0.868179 46.973273, -0.869896 46.972059, -0.872356 46.973921, -0.87925 46.974666, -0.880167 46.975259, -0.879569 46.976065, -0.882064 46.977455, -0.882176 46.976556, -0.884937 46.977334, -0.885156 46.976298, -0.886918 46.976492, -0.888462 46.975566, -0.892187 46.976082, -0.892484 46.978577, -0.895071 46.979177, -0.894874 46.980231, -0.896843 46.980815, -0.893065 46.984496, -0.895727 46.985249, -0.89623 46.985842, -0.895404 46.986335, -0.898968 46.988701, -0.897484 46.989799, -0.90103 46.991734, -0.902515 46.993922, -0.904396 46.994915, -0.907873 46.994955, -0.908708 46.99287, -0.9117 46.995997, -0.912372 46.995659, -0.910853 46.994271, -0.912311 46.992815, -0.915289 46.992611, -0.915649 46.993302, -0.914227 46.994688, -0.916525 46.996111, -0.918747 46.995522, -0.918685 46.996536, -0.921435 46.998028, -0.917958 46.998454, -0.916957 46.999858, -0.914871 47.000633, -0.915853 47.001637, -0.919365 47.002324, -0.919706 47.003377, -0.925021 47.002535, -0.925042 46.999834, -0.928445 47.000682, -0.928661 47.002451, -0.935226 47.002345, -0.93278 47.00456, -0.931063 47.003357, -0.931039 47.004519, -0.928248 47.00382, -0.927473 47.006346, -0.929194 47.008111, -0.932389 47.006069, -0.932015 47.007985, -0.93295 47.007838, -0.933399 47.009041, -0.935539 47.007348, -0.934844 47.005633, -0.936462 47.005257, -0.937296 47.003048, -0.938529 47.0034, -0.938673 47.002401, -0.939634 47.002783, -0.939812 47.002193, -0.940278 47.003189, -0.941698 47.00358, -0.944993 46.998988, -0.947166 46.999717, -0.948313 47.001307, -0.947959 47.003694, -0.951958 47.002736, -0.953334 47.000764, -0.95504 46.999919, -0.955661 46.99757, -0.954756 46.995966, -0.956737 46.996404, -0.958285 46.99543, -0.957388 46.994887, -0.960803 46.994723, -0.959851 46.995287, -0.962158 46.995809, -0.961741 46.997277, -0.963159 46.996458, -0.964354 46.997292, -0.963447 46.998099, -0.964984 46.999584, -0.963101 47.00063, -0.963229 47.001985, -0.964014 47.003068, -0.966535 47.002838, -0.968005 47.004208, -0.967052 47.005199, -0.965982 47.004729, -0.968678 47.006687, -0.967816 47.007355, -0.970504 47.007588, -0.972909 47.009056, -0.973483 47.008101, -0.975229 47.008652, -0.974932 47.010525, -0.973166 47.012531, -0.975314 47.013218, -0.973361 47.016124, -0.975663 47.01687, -0.976156 47.018317, -0.978354 47.018918, -0.981873 47.018124, -0.981502 47.017046, -0.982976 47.016083, -0.980279 47.014309, -0.982174 47.010593, -0.995514 47.017676, -0.999529 47.020687, -1.002179 47.02152, -1.000567 47.022544, -1.002044 47.024403, -1.000672 47.02556, -0.999402 47.025138, -1.000446 47.022611, -0.997423 47.022981, -0.995461 47.024415, -1.000034 47.027594, -1.001848 47.027837, -1.003761 47.02556, -1.005871 47.027086, -1.008565 47.027608, -1.00369 47.029205, -1.003499 47.034155))

Having the data saved in correct file, you can compile (I did it on a macos with clang and GEOS 3.9.1) and run the next source file:

#include <stdio.h>
#include <stdlib.h>
#include <geos_c.h>

static char* read_file(const char * filename);
static void print_inter_type(const GEOSContextHandle_t handle, const GEOSGeom a, const GEOSGeom b);
static GEOSGeom geom_from_file(const GEOSContextHandle_t handle, const char * filename);
static GEOSGeom remove_little_polygons(const GEOSContextHandle_t handle, const GEOSGeom geom);

int main(int argc, char const *argv[]) {
	GEOSContextHandle_t handle;
	GEOSGeom a, c, d;

	handle = GEOS_init_r();

	c = geom_from_file(handle, "c.wkt");
	a = geom_from_file(handle, "a.wkt");

	d = remove_little_polygons(handle, c);

	print_inter_type(handle, c, a);
	print_inter_type(handle, d, a);

	GEOSGeom_destroy_r(handle, a);
	GEOSGeom_destroy_r(handle, c);
	GEOSGeom_destroy_r(handle, d);
	GEOS_finish_r(handle);
	return 0;
}

static char* read_file(const char * filename) {
	char * buffer;
	long length;
	FILE * f = fopen (filename, "rb");

	if (f)
	{
		fseek (f, 0, SEEK_END);
		length = ftell (f);
		fseek (f, 0, SEEK_SET);
		buffer = malloc (length);
		if (buffer)
		{
			fread (buffer, 1, length, f);
		}
		fclose (f);
	}

	return buffer;
}

static void print_inter_type(const GEOSContextHandle_t handle, const GEOSGeom a, const GEOSGeom b) {
	GEOSGeom inter;
	char *buffer;
	inter = GEOSIntersection_r(handle, a, b);
	buffer = GEOSGeomType_r(handle, inter);
	printf("intersection type: %s\n", buffer);
	GEOSGeom_destroy_r(handle, inter);
	GEOSFree_r(handle, buffer);
}

static GEOSGeom geom_from_file(const GEOSContextHandle_t handle, const char * filename) {
	GEOSGeom result;
	GEOSWKTReader *reader;
	char *buffer;
	reader = GEOSWKTReader_create_r(handle);
	buffer = read_file(filename);
	result = GEOSWKTReader_read_r(handle, reader, buffer);
	free(buffer);
	GEOSWKTReader_destroy_r(handle, reader);
	return result;
}

static GEOSGeom remove_little_polygons(const GEOSContextHandle_t handle, const GEOSGeom geom) {
	size_t size, ngeoms = 0;
	GEOSGeom *geoms;
	GEOSGeom result;
	double area;
	size = GEOSGetNumGeometries_r(handle, geom);
	geoms = malloc(size * sizeof(GEOSGeom));
	for (size_t i = 0; i < size; i++)
	{
		const GEOSGeometry *temp = GEOSGetGeometryN_r(handle, geom, i);
		GEOSArea_r(handle, temp, &area);
		if (area > 1e-4) {
			geoms[ngeoms++] = GEOSGeom_clone_r(handle, temp);
		}
	}


	result = GEOSGeom_createCollection_r(handle, GEOS_MULTIPOLYGON, geoms, ngeoms);
	free(geoms);
	return result;
}

expected:

intersection type: MultiLineString
intersection type: MultiLineString

actual:

intersection type: MultiLineString
intersection type: GeometryCollection

I can also give you the ruby reproduction, however I did the C version to make sure the issue was not rgeo related.

Thank you for reading, please let me know if you need more information, or more data.

Cheers,
Ulysse

Assert (0) with IsValid

Hi I noticed that there is an assert(0) which is making it hard to fail from this gracefully. (https://github.com/libgeos/geos/blob/master/src/operation/valid/IsValidOp.cpp at line 603). I have been using shapely for python and it relies on this module. Occasionally, I will receive some geometry that triggers this. I have tried to reproduce it by making a multipolygon that contains two polygons. One that has a hole and the other that perfectly fits that hole. However, when calling isvalid it says false. Am I misunderstanding this edge case? Is there any reason why this has to be an assert(0)? I am just curious and would like to understand more about this.

GEOSWithin gives bad results on big endian architectures (s390x)

Hello. In Fedora, we build geos for various architectures. One of them is s390x, which is big endian.

Python package Shapely was failing some tests on thich architecture and we tracked the problem to the following reporducer:

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <geos_c.h>

static void message_handler(const char *fmt, ...)
{
  va_list ap;

  va_start(ap, fmt);
  vfprintf(stderr, fmt, ap);
  putc('\n', stderr);
  va_end(ap);
}

int main()
{
  GEOSCoordSeq polygon1, polygon2;
  GEOSGeom ring1, ring2;
  GEOSGeom poly1, poly2;
  char result;

  // Initialization
  initGEOS(message_handler, message_handler);

  // Create the first polygon
  polygon1 = GEOSCoordSeq_create(10, 2);
  GEOSCoordSeq_setX(polygon1,  0, 339);
  GEOSCoordSeq_setY(polygon1,  0, 346);
  GEOSCoordSeq_setX(polygon1,  1, 459);
  GEOSCoordSeq_setY(polygon1,  1, 346);
  GEOSCoordSeq_setX(polygon1,  2, 399);
  GEOSCoordSeq_setY(polygon1,  2, 311);
  GEOSCoordSeq_setX(polygon1,  3, 340);
  GEOSCoordSeq_setY(polygon1,  3, 277);
  GEOSCoordSeq_setX(polygon1,  4, 399);
  GEOSCoordSeq_setY(polygon1,  4, 173);
  GEOSCoordSeq_setX(polygon1,  5, 280);
  GEOSCoordSeq_setY(polygon1,  5, 242);
  GEOSCoordSeq_setX(polygon1,  6, 339);
  GEOSCoordSeq_setY(polygon1,  6, 415);
  GEOSCoordSeq_setX(polygon1,  7, 280);
  GEOSCoordSeq_setY(polygon1,  7, 381);
  GEOSCoordSeq_setX(polygon1,  8, 460);
  GEOSCoordSeq_setY(polygon1,  8, 207);
  GEOSCoordSeq_setX(polygon1,  9, 339);
  GEOSCoordSeq_setY(polygon1,  9, 346);
  ring1 = GEOSGeom_createLinearRing(polygon1);
  poly1 = GEOSGeom_createPolygon(ring1, NULL, 0);

  // Create the second polygon
  polygon2 = GEOSCoordSeq_create(12, 2);
  GEOSCoordSeq_setX(polygon2,  0, 339);
  GEOSCoordSeq_setY(polygon2,  0, 207);
  GEOSCoordSeq_setX(polygon2,  1, 280);
  GEOSCoordSeq_setY(polygon2,  1, 311);
  GEOSCoordSeq_setX(polygon2,  2, 460);
  GEOSCoordSeq_setY(polygon2,  2, 138);
  GEOSCoordSeq_setX(polygon2,  3, 399);
  GEOSCoordSeq_setY(polygon2,  3, 242);
  GEOSCoordSeq_setX(polygon2,  4, 459);
  GEOSCoordSeq_setY(polygon2,  4, 277);
  GEOSCoordSeq_setX(polygon2,  5, 459);
  GEOSCoordSeq_setY(polygon2,  5, 415);
  GEOSCoordSeq_setX(polygon2,  6, 399);
  GEOSCoordSeq_setY(polygon2,  6, 381);
  GEOSCoordSeq_setX(polygon2,  7, 519);
  GEOSCoordSeq_setY(polygon2,  7, 311);
  GEOSCoordSeq_setX(polygon2,  8, 520);
  GEOSCoordSeq_setY(polygon2,  8, 242);
  GEOSCoordSeq_setX(polygon2,  9, 519);
  GEOSCoordSeq_setY(polygon2,  9, 173);
  GEOSCoordSeq_setX(polygon2, 10, 399);
  GEOSCoordSeq_setY(polygon2, 10, 450);
  GEOSCoordSeq_setX(polygon2, 11, 339);
  GEOSCoordSeq_setY(polygon2, 11, 207);
  ring2 = GEOSGeom_createLinearRing(polygon2);
  poly2 = GEOSGeom_createPolygon(ring2, NULL, 0);

  // Check whether the second polygon is within the first
  result = GEOSWithin(poly1, poly2);
  printf("The result is %d\n", (int)result);

  // Cleanup
  GEOSGeom_destroy(poly1);
  GEOSGeom_destroy(poly2);
  finishGEOS();
  return EXIT_SUCCESS;
}

The code is a C translation of one of the failing Shapely tests. It shows that the bug is not caused by Shapely. Build it with gcc -o test test.c -lgeos_c. If built and run on a little endian machine, it correctly produces this output:

TopologyException: side location conflict at 459 346
The result is 2

If built and run on s390x (big endian), it incorrectly produces this output:

The result is 0

Since this was not an issue in the past, we've bisected the problem to https://git.osgeo.org/gitea/geos/geos/commit/10ff0f8d6809c212aa9eb75f710bd068a90ccff0 -- likely, the DD class itself being the issue.

See the downstream report in https://bugzilla.redhat.com/show_bug.cgi?id=1841335

I will report this to https://trac.osgeo.org/geos/report/1 once I get an account there.

WKT writer precision

Using the Julia interface to GEOS, a non-consistent behavior of WKTWriter with rounding precision was observed. Original issue JuliaGeo/LibGEOS.jl#86. Used versions are LibGEOS v0.6.6 and GEOS_jll v3.9.0+0.

using LibGEOS
p = readgeom("POINT (654321.12345 0.1)");
writer = LibGEOS.WKTWriter(LibGEOS._context, trim=false, roundingprecision=3);
writegeom(p, writer)

gives

"POINT (654321.123 0.100)"

whereas

writer = LibGEOS.WKTWriter(LibGEOS._context, trim=true, roundingprecision=3);
writegeom(p, writer)

gives

"POINT (6.54e+05 0.1)"

Relevant libgeos code here

geos/src/io/WKTWriter.cpp

Lines 358 to 369 in 5b722cf

WKTWriter::writeNumber(double d)
{
std::stringstream ss;
if(! trim) {
ss << std::fixed;
}
ss << std::setprecision(decimalPlaces >= 0 ? decimalPlaces : 0) << d;
return ss.str();
}

Judging from http://www.cplusplus.com/reference/iomanip/setprecision/ , if std::fixed is not in the stream, std::setprecision sets the significant digits.

Is there an easy way of installing the latest version on Ubuntu?

Hi,
is there a way of installing the latest version of geos on Ubuntu with apt? I would like to use version 3.9, however, sudo apt-get install --upgrade libgeos-dev gives me 3.8.0-1build1.

Is there an easier way of installing 3.9 than building it manually from source?

Thanks.

Build error in ARM64 Mac system

Hello,
I am trying to build geos in my ARM64 Mac system, but I am getting an error when the make process gets to make a dynamic library:

% sudo /usr/local/bin/cmake .
-- GEOS: Using default build type: Release
-- GEOS: Run-time output: /Users/isong/Downloads/geos/bin
-- GEOS: Archives output: /Users/isong/Downloads/geos/lib
-- GEOS: Version 3.9.0dev
-- GEOS: C API Version 1.14.0
-- GEOS: JTS port 1.16.0
-- GEOS: Require C++11
-- GEOS: Developer mode enabled
-- GEOS: Configured 'dist' target
-- GEOS: Configured 'distcheck' target
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/isong/Downloads/geos
isong@Insangs-MacBook-Pro geos % sudo /usr/local/bin/make . 
isong@Insangs-MacBook-Pro geos % sudo /usr/local/bin/make  
[  0%] Linking CXX shared library lib/libgeos.dylib
duplicate symbol 'vtable for geos::noding::BasicSegmentString' in:
    CMakeFiles/geos.dir/src/inlines.cpp.o
    CMakeFiles/geos.dir/src/noding/BasicSegmentString.cpp.o
duplicate symbol 'typeinfo name for geos::noding::BasicSegmentString' in:
    CMakeFiles/geos.dir/src/inlines.cpp.o
    CMakeFiles/geos.dir/src/noding/BasicSegmentString.cpp.o
duplicate symbol 'typeinfo for geos::noding::BasicSegmentString' in:
    CMakeFiles/geos.dir/src/inlines.cpp.o
    CMakeFiles/geos.dir/src/noding/BasicSegmentString.cpp.o
ld: 3 duplicate symbols for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [CMakeFiles/geos.dir/build.make:5383: lib/libgeos.3.9.0.dylib] Error 1
make[1]: *** [CMakeFiles/Makefile2:817: CMakeFiles/geos.dir/all] Error 2
make: *** [Makefile:182: all] Error 2

Does anyone have an idea for the error?
Thank you.

Crash in GEOSDistance_r

Given the polygon with WKT:

MultiPolygonZ (PolygonZ EMPTY,((-0.14000000000000001 44.89999999999999858 0, -0.14699999999999999 44.90400000000000347 0, -0.14729999999999999 44.90500000000000114 0, -0.14000000000000001 44.89999999999999858 0)))

Attempting to find the distance to any other polygon geometries using GEOSDistance_r results in a crash from within geos::operation::distance::GeometryLocation

(Likely it's due to the empty polygon member, but this should raise a GEOSException instead of crashing.)

Reported downstream as qgis/QGIS#35149

change in the result of polygon-line intersection from versions 3.8.1 to v3.9.0

Apologies for not having a pure geos example. I observe a change in the result of a polygon-line intersection from geos versions 3.8.1 to 3.9.0. My shapely version is the same in both environments (1.7.1)

from shapely.geometry import Polygon, LineString
poly = Polygon(((-200, -200), (200, -200), (200, 200), (-200, 200), (-200, -200)))
line = LineString([(-100, 100), (-100, -100)])
print(poly.intersects(line))                       # always True
print(poly.intersection(line).wkt)                 # LINESTRING EMPTY in version 3.9.0

The intersection is LINESTRING EMPTY according to version 3.9.0, but is LINESTRING (-100 100, -100 -100) according to version 3.8.1.

I'm not entirely sure, is this a bugfix or a regression?

Does the voronoi calculation handle shapes?

For https://github.com/pcb2gcode/pcb2gcode, I need a voronoi calculation that can compute the voronoi regions of shapes, not just points. For example:

image

Currently this is done using libboost geometry. All the points of each polygon are added to the voronoi builder and then the voronoi diagram is built, similar to how GEOS would do it. libboost reports for each edge which point was the cause for the edge. It also reports the back-edge, which is the edge going the other direction and the point that caused it. By removing all edges that are separating points in the same shape, only the edges that separate voronoi shapes remain.

Can GEOS voronoi do this?

SIGSEV when using GEOSCoordSeq_destroy_r

Hi,
I'm using geos in golang using a wrapper. I'm getting a SIGSEV because of destroy coordseq.
Not exactly the code but I'm doing something like:

*GeosGeometry g;
// define g somehow
r = GEOSGetExteriorRing_r(handle, g);
seq = GEOSGeom_getCoordSeq_r(handle, r);
GEOSCoordSeq_destroy_r(handle, seq);
GEOSGeom_destroy_r(handle, g);

As I said, this is not exactly the code since I'm using go, but those are the calls to the Geos library.
If I comment GEOSCoordSeq_destroy_r then I don't get the SIGSEV. Is the coordseq using an internal memory from the polygon? In the case of Exterior Ring it is, but it is documented in the headers file geos_c.h.

I'm using version 3.9.0dev

Thanks

ParseException: Expected word but encountered end of stream

Hello,

Encountered this problem when trying to use shapely.wkt sub-module to parse wkt format

This was my code: df2['Coordinates'] = df2['Coordinates'].apply(wkt.loads)

-There is no missing data (Have checked)

  • The format of coordiantes are the same e.g "POINT (-122.30332400000002 47.756486)"

Any suggestions ?

GEOSversion() link with static library failed

hi, I have a problem when link with libgeos_c.a

geot.c
#include "geos_c.h" const char *GEOSversion(); int main() { GEOSversion(); return 0; }
compile with libgeos_c.so. it works OK!
clang geot.c -o geot -I/root/geostest/geos/include -L/root/geostest/geos/lib -lgeos_c
but when i build it with static lib libgeos_c.a, it fail.
clang geot.c -o geot -I/root/geostest/geos/include /root/geostest/geos/lib/libgeos_c.a

error msg:

ld: error: undefined symbol: operator new(unsigned long)
referenced by geos_ts_c.cpp:430
libgeos_c_la-geos_ts_c.o:(initGEOS_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: geos::geom::GeometryFactory::getDefaultInstance()
referenced by geos_ts_c.cpp:195
libgeos_c_la-geos_ts_c.o:(initGEOS_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: geos::util::Interrupt::cancel()
referenced by geos_ts_c.cpp:432
libgeos_c_la-geos_ts_c.o:(initGEOS_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: operator delete(void*)
referenced by geos_ts_c.cpp:430
libgeos_c_la-geos_ts_c.o:(initGEOS_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: operator new(unsigned long)
referenced by geos_ts_c.cpp:430
libgeos_c_la-geos_ts_c.o:(GEOS_init_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: geos::geom::GeometryFactory::getDefaultInstance()
referenced by geos_ts_c.cpp:195
libgeos_c_la-geos_ts_c.o:(GEOS_init_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: geos::util::Interrupt::cancel()
referenced by geos_ts_c.cpp:432
libgeos_c_la-geos_ts_c.o:(GEOS_init_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: operator delete(void*)
referenced by geos_ts_c.cpp:430
libgeos_c_la-geos_ts_c.o:(GEOS_init_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: operator delete(void*)
referenced by geos_ts_c.cpp:485
libgeos_c_la-geos_ts_c.o:(finishGEOS_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: operator delete(void*)
referenced by geos_ts_c.cpp:485
libgeos_c_la-geos_ts_c.o:(GEOS_finish_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: __cxa_begin_catch
referenced by geos_ts_c.cpp:0
libgeos_c_la-geos_ts_c.o:(GEOSDisjoint_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: __cxa_end_catch
referenced by geos_ts_c.cpp:0
libgeos_c_la-geos_ts_c.o:(GEOSDisjoint_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: __cxa_end_catch
referenced by geos_ts_c.cpp:369
libgeos_c_la-geos_ts_c.o:(GEOSDisjoint_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: __cxa_end_catch
referenced by geos_ts_c.cpp:367
libgeos_c_la-geos_ts_c.o:(GEOSDisjoint_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: __cxa_begin_catch
referenced by geos_ts_c.cpp:0
libgeos_c_la-geos_ts_c.o:(GEOSTouches_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: __cxa_end_catch
referenced by geos_ts_c.cpp:0
libgeos_c_la-geos_ts_c.o:(GEOSTouches_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: __cxa_end_catch
referenced by geos_ts_c.cpp:369
libgeos_c_la-geos_ts_c.o:(GEOSTouches_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: __cxa_end_catch
referenced by geos_ts_c.cpp:367
libgeos_c_la-geos_ts_c.o:(GEOSTouches_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: __cxa_begin_catch
referenced by geos_ts_c.cpp:0
libgeos_c_la-geos_ts_c.o:(GEOSIntersects_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: undefined symbol: __cxa_end_catch
referenced by geos_ts_c.cpp:0
libgeos_c_la-geos_ts_c.o:(GEOSIntersects_r) in archive /root/geostest/geos/lib/libgeos_c.a

ld: error: too many errors emitted, stopping now (use -error-limit=0 to see all errors)
clang: error: linker command failed with exit code 1 (use -v to see invocation)

3.6.4 README and INSTALL disagree on how to install, python cbindings

cmake build, it's unclear if this will build python bindings or not

Using Autotools:

    ./autogen.sh  # in ${srcdir}, if obtained from SVN or GIT
    ${srcdir}/configure # in build dir

Using CMake:

    cmake ${srcdir} # in build dir

Now, all versions:

    make
    make check
    make install # as root
    ldconfig # as root

INSTALL suggests this

   ./configure
   make
   make install

and configure has an option for --enable-python, which is right? or are both right?

geos-3.3.3 make error: ‘ISNAN’ was not declared in this scope; did you mean ‘SNAN’?

/basemap-1.1.0/geos-3.3.3
make

basemap-1.1.0/geos-3.3.3/src/algorithm/locate”
/bin/bash ../../../libtool --tag=CXX --mode=compile g++ -DHAVE_CONFIG_H -I. -I../../../include -I../../../include/geos -I../../../include -DGEOS_INLINE -pedantic -Wall -ansi -Wno-long-long -ffloat-store -g -O2 -MT IndexedPointInAreaLocator.lo -MD -MP -MF .deps/IndexedPointInAreaLocator.Tpo -c -o IndexedPointInAreaLocator.lo IndexedPointInAreaLocator.cpp
libtool: compile: g++ -DHAVE_CONFIG_H -I. -I../../../include -I../../../include/geos -I../../../include -DGEOS_INLINE -pedantic -Wall -ansi -Wno-long-long -ffloat-store -g -O2 -MT IndexedPointInAreaLocator.lo -MD -MP -MF .deps/IndexedPointInAreaLocator.Tpo -c IndexedPointInAreaLocator.cpp -fPIC -DPIC -o .libs/IndexedPointInAreaLocator.oIn file included from ../../../include/geos/geom/Geometry.h:26, from IndexedPointInAreaLocator.cpp:18:
../../../include/geos/platform.h:110:2: error: #error "Can not compile without isnan function or macro"
110 | #error "Can not compile without isnan function or macro" | ^~~~~
In file included from ../../../include/geos/geom/Coordinate.h:161, from ../../../include/geos/geom/Envelope.h:26, from ../../../include/geos/geom/Geometry.h:28, from IndexedPointInAreaLocator.cpp:18:
../../../include/geos/geom/Coordinate.inl: In member function ‘bool geos::geom::Coordinate::isNull() const’:
../../../include/geos/geom/Coordinate.inl:39:10: error: ‘ISNAN’ was not declared in this scope; did you mean ‘SNAN’?
39 | return (ISNAN(x) && ISNAN(y) && ISNAN(z));
| ^~~~~
| SNAN
../../../include/geos/geom/Coordinate.inl: In member function ‘bool geos::geom::Coordinate::equals3D(const geos::geom::Coordinate&) const’:
../../../include/geos/geom/Coordinate.inl:83:21: error: ‘ISNAN’ was not declared in this scope; did you mean ‘SNAN’?
83 | ((z == other.z)||(ISNAN(z) && ISNAN(other.z)));
| ^~~~~
| SNAN
make[4]: *** [Makefile:373:IndexedPointInAreaLocator.lo]

platform:

Linux DESKTOP-J925CM6 4.19.84-microsoft-standard #1 SMP Wed Nov 13 11:44:37 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu Focal Fossa (development branch)
Release: 20.04
Codename: focal

geos-3 3 3 make error ISNAN was not declared in this scope; did you mean SNAN#283

would you like to tell me how can I make?
tks.

Segmentation fault when intersecting certain geometries using Shapely

Description

Not sure if this is necessarily a GEOS issue - might be just some Shapely -> GEOS interface issue. When using GEOS 3.7.3 the segfault is not happening. The issue was reported to Shapely back in March shapely/shapely#860

Environment

reproduced on Arch Linux and Ubuntu 20.04
Python 3.8
Shapely 1.7.0 (and also reproduced with 1.6.4.post2)
GEOS 3.8.0
GDAL 3.0.4
PROJ 6.3.1-1

Steps to reproduce

#!/usr/bin/env python3

from shapely.geometry import shape

polygon = shape({
    "type": "Polygon",
    "coordinates": [[
        [1.9280898571014473, 41.26269360649398],
        [1.9280898571014473, 41.267195716664716],
        [1.934056631049079, 41.267195716664716],
        [1.934056631049079, 41.26269360649398],
        [1.9280898571014473, 41.26269360649398]
    ]]
})

collection = shape({
    "type": "GeometryCollection",
    "geometries": [{
        "type": "MultiPolygon",
        "coordinates": [
            [[
                [1.933593750000014, 41.26954950284258],
                [1.9226074218749893, 41.26954950284258],
                [1.9226074218749893, 41.26129149391986],
                [1.933593750000014, 41.26129149391986],
                [1.933593750000014, 41.26954950284258]
            ]],
            [[
                [1.9225859642028806, 41.26033982031611],
                [1.9335937499999998, 41.26033982031611],
                [1.9335937499999998, 41.261130194285094],
                [1.9225859642028806, 41.261130194285094],
                [1.9225859642028806, 41.26033982031611]
            ]]
        ]
    }]
})

# Intersecting this particular collection fails
polygon.intersection(collection)

GDB backtrace:

#0  0x00007ffff6aa4d77 in geos::algorithm::locate::SimplePointInAreaLocator::locatePointInPolygon(geos::geom::Coordinate const&, geos::geom::Polygon const*) () from /usr/lib/libgeos-3.8.0.so
#1  0x00007ffff6ad0057 in geos::geomgraph::EdgeEndStar::getLocation(int, geos::geom::Coordinate const&, std::vector<geos::geomgraph::GeometryGraph*, std::allocator<geos::geomgraph::GeometryGraph*> >*) ()
   from /usr/lib/libgeos-3.8.0.so
#2  0x00007ffff6ad02af in geos::geomgraph::EdgeEndStar::computeLabelling(std::vector<geos::geomgraph::GeometryGraph*, std::allocator<geos::geomgraph::GeometryGraph*> >*) () from /usr/lib/libgeos-3.8.0.so
#3  0x00007ffff6acb8ff in geos::geomgraph::DirectedEdgeStar::computeLabelling(std::vector<geos::geomgraph::GeometryGraph*, std::allocator<geos::geomgraph::GeometryGraph*> >*) () from /usr/lib/libgeos-3.8.0.so
#4  0x00007ffff6b2a196 in geos::operation::overlay::OverlayOp::computeLabelling() () from /usr/lib/libgeos-3.8.0.so
#5  0x00007ffff6b2bba8 in geos::operation::overlay::OverlayOp::computeOverlay(geos::operation::overlay::OverlayOp::OpCode) () from /usr/lib/libgeos-3.8.0.so
#6  0x00007ffff6b2befa in geos::operation::overlay::OverlayOp::getResultGeometry(geos::operation::overlay::OverlayOp::OpCode) () from /usr/lib/libgeos-3.8.0.so
#7  0x00007ffff6b2c39e in geos::operation::overlay::OverlayOp::overlayOp(geos::geom::Geometry const*, geos::geom::Geometry const*, geos::operation::overlay::OverlayOp::OpCode) () from /usr/lib/libgeos-3.8.0.so
#8  0x00007ffff6ab2f67 in std::unique_ptr<geos::geom::Geometry, std::default_delete<geos::geom::Geometry> > geos::geom::BinaryOp<geos::operation::overlay::overlayOp>(geos::geom::Geometry const*, geos::geom::Geometry const*, geos::operation::overlay::overlayOp) () from /usr/lib/libgeos-3.8.0.so
#9  0x00007ffff6ab0844 in geos::geom::Geometry::intersection(geos::geom::Geometry const*) const () from /usr/lib/libgeos-3.8.0.so
#10 0x00007ffff6bda3ba in GEOSIntersection_r () from /usr/lib/libgeos_c.so.1
#11 0x00007ffff715d69a in ffi_call_unix64 () from /usr/lib/libffi.so.6
#12 0x00007ffff715cfb6 in ffi_call () from /usr/lib/libffi.so.6
#13 0x00007ffff71bf5b7 in _ctypes_callproc () from /home/ember/.envs/sk/lib/python3.6/lib-dynload/_ctypes.cpython-36m-x86_64-linux-gnu.so
#14 0x00007ffff71b9658 in ?? () from /home/ember/.envs/sk/lib/python3.6/lib-dynload/_ctypes.cpython-36m-x86_64-linux-gnu.so
#15 0x00007ffff7d214c8 in PyObject_Call (func=0x7ffff6c4a110, args=<optimized out>, kwargs=<optimized out>) at Objects/abstract.c:2261
#16 0x00007ffff7e4c5dc in partial_call (pto=0x7ffff67d7b38, args=<optimized out>, kw=<optimized out>) at ./Modules/_functoolsmodule.c:186
#17 0x00007ffff7d214c8 in PyObject_Call (func=0x7ffff67d7b38, args=<optimized out>, kwargs=<optimized out>) at Objects/abstract.c:2261
#18 0x00007ffff7deac03 in do_call_core (kwdict=0x0, callargs=0x7fffe0641208, func=0x7ffff67d7b38) at Python/ceval.c:5106
#19 _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3404
#20 0x00007ffff7de5ec9 in _PyEval_EvalCodeWithName (_co=_co@entry=0x7ffff7128780, globals=globals@entry=0x7ffff711bbd0, locals=locals@entry=0x0, args=args@entry=0x7fffffffd3c0, argcount=argcount@entry=3, 
    kwnames=kwnames@entry=0x0, kwargs=0x0, kwcount=0, kwstep=2, defs=0x0, defcount=0, kwdefs=0x0, closure=0x0, name=0x7ffff73e0170, qualname=0x7ffff67d7ee0) at Python/ceval.c:4166
#21 0x00007ffff7dedf09 in _PyFunction_FastCallDict (func=func@entry=0x7ffff67ef158, args=args@entry=0x7fffffffd3c0, nargs=nargs@entry=3, kwargs=kwargs@entry=0x0) at Python/ceval.c:5070
#22 0x00007ffff7d216f2 in _PyObject_FastCallDict (func=func@entry=0x7ffff67ef158, args=args@entry=0x7fffffffd3c0, nargs=nargs@entry=3, kwargs=kwargs@entry=0x0) at Objects/abstract.c:2310
#23 0x00007ffff7d2195e in _PyObject_Call_Prepend (func=0x7ffff67ef158, obj=<optimized out>, args=0x7fffe063ad88, kwargs=0x0) at Objects/abstract.c:2373
#24 0x00007ffff7d214c8 in PyObject_Call (func=0x7ffff732d948, args=<optimized out>, kwargs=<optimized out>) at Objects/abstract.c:2261
#25 0x00007ffff7d83861 in slot_tp_call (self=self@entry=0x7ffff67f5160, args=args@entry=0x7fffe063ad88, kwds=kwds@entry=0x0) at Objects/typeobject.c:6207
#26 0x00007ffff7d2164a in _PyObject_FastCallDict (func=0x7ffff67f5160, args=<optimized out>, nargs=2, kwargs=kwargs@entry=0x0) at Objects/abstract.c:2331
#27 0x00007ffff7d21c3a in _PyObject_FastCallKeywords (func=func@entry=0x7ffff67f5160, stack=<optimized out>, nargs=nargs@entry=2, kwnames=kwnames@entry=0x0) at Objects/abstract.c:2496
#28 0x00007ffff7de61f7 in call_function (pp_stack=pp_stack@entry=0x7fffffffd5d8, oparg=<optimized out>, kwnames=kwnames@entry=0x0) at Python/ceval.c:4861
#29 0x00007ffff7de84df in _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3335
#30 0x00007ffff7de5494 in _PyFunction_FastCall (co=<optimized out>, args=<optimized out>, nargs=2, globals=<optimized out>) at Python/ceval.c:4919
#31 0x00007ffff7de6167 in fast_function (func=<optimized out>, stack=<optimized out>, nargs=<optimized out>, kwnames=<optimized out>) at Python/ceval.c:4961
#32 0x00007ffff7de6265 in call_function (pp_stack=pp_stack@entry=0x7fffffffd788, oparg=<optimized out>, kwnames=kwnames@entry=0x0) at Python/ceval.c:4858
#33 0x00007ffff7de84df in _PyEval_EvalFrameDefault (f=<optimized out>, throwflag=<optimized out>) at Python/ceval.c:3335
#34 0x00007ffff7de5ec9 in _PyEval_EvalCodeWithName (_co=_co@entry=0x7ffff7352780, globals=globals@entry=0x7ffff7394510, locals=locals@entry=0x7ffff7394510, args=args@entry=0x0, argcount=argcount@entry=0, 
    kwnames=kwnames@entry=0x0, kwargs=0x0, kwcount=0, kwstep=2, defs=0x0, defcount=0, kwdefs=0x0, closure=0x0, name=0x0, qualname=0x0) at Python/ceval.c:4166
#35 0x00007ffff7de640e in PyEval_EvalCodeEx (_co=_co@entry=0x7ffff7352780, globals=globals@entry=0x7ffff7394510, locals=locals@entry=0x7ffff7394510, args=args@entry=0x0, argcount=argcount@entry=0, 
    kws=kws@entry=0x0, kwcount=0, defs=0x0, defcount=0, kwdefs=0x0, closure=0x0) at Python/ceval.c:4187
#36 0x00007ffff7de643c in PyEval_EvalCode (co=co@entry=0x7ffff7352780, globals=globals@entry=0x7ffff7394510, locals=locals@entry=0x7ffff7394510) at Python/ceval.c:731
#37 0x00007ffff7e10366 in run_mod (mod=mod@entry=0x555555631e90, filename=filename@entry=0x7ffff72c2270, globals=globals@entry=0x7ffff7394510, locals=locals@entry=0x7ffff7394510, 
    flags=flags@entry=0x7fffffffdacc, arena=arena@entry=0x7ffff73ae2e8) at Python/pythonrun.c:1025
#38 0x00007ffff7e12984 in PyRun_FileExFlags (fp=fp@entry=0x55555555a4c0, filename_str=filename_str@entry=0x7ffff732f5f0 "reproduce.py", start=start@entry=257, globals=globals@entry=0x7ffff7394510, 
    locals=locals@entry=0x7ffff7394510, closeit=closeit@entry=1, flags=0x7fffffffdacc) at Python/pythonrun.c:978
#39 0x00007ffff7e12af2 in PyRun_SimpleFileExFlags (fp=fp@entry=0x55555555a4c0, filename=<optimized out>, closeit=closeit@entry=1, flags=flags@entry=0x7fffffffdacc) at Python/pythonrun.c:419
#40 0x00007ffff7e12fa4 in PyRun_AnyFileExFlags (fp=fp@entry=0x55555555a4c0, filename=<optimized out>, closeit=closeit@entry=1, flags=flags@entry=0x7fffffffdacc) at Python/pythonrun.c:81
#41 0x00007ffff7e29d52 in run_file (p_cf=0x7fffffffdacc, filename=0x55555555b6e0 L"reproduce.py", fp=0x55555555a4c0) at Modules/main.c:340
#42 Py_Main (argc=2, argv=0x5555555592a0) at Modules/main.c:810
#43 0x000055555555519f in main ()

Slowdown in buffer of a MultiPolygon in GEOS 3.8

Original report from Shapely at shapely/shapely#834 (but further discussed in shapely/shapely#847 (comment) and conda-forge/geos-feedstock#43).

A reproducer using python and pygeos (reproducer with shapely is at shapely/shapely#834 (comment)):

import numpy as np
import pygeos

t = np.arange(1, 10000)
arr = pygeos.points(100000*np.sin(t), 100000*np.sin(4*t)) 
arr2 = pygeos.buffer(arr, radius=200, quadsegs=32) 
union = pygeos.union_all(arr2) 
# union is a large MultiPolygon now

%timeit pygeos.buffer(union, radius=1) 

The above gives a timing of around 60 ms with GEOS master or with 3.7, but around 3 seconds with GEOS 3.8.0.
So it seems this is already fixed on master, and so this might be a potential candidate to backport to 3.8? (I checked that the latest 3.8 branch (to become 3.8.1 I assume) does not yet include the fix, as it gives a similar timing as 3.8.0)

I didn't yet try to look for the commit that fixes this.

Crash in WKT of MultiPoint including an empty Point

Using the Python pygeos package to show the error (from pygeos/pygeos#134):

# creating a MultiPoint with that includes an empty Point
import pygeos

point = pygeos.points(1,1)  
box = pygeos.box(2,2,4,4) 
point_empty = pygeos.intersection(p, box)

mp_empty  = pygeos.multipoints([point, point_empty])                  

Converting to WKB raises an informative error:

>>> pygeos.to_wkb(mp_empty)      
...
GEOSException: IllegalArgumentException: Empty Points cannot be represented in WKB

However, converting to WKT crashes:

>>> pygeos.to_wkt(mp_empty)    
Segmentation fault (core dumped)

I am not 100% sure this is a GEOS issue, since there might be something wrong on the PyGEOS side. But posting here in case somebody knows or can confirm this is a GEOS bug.

Proper way to dynamic_cast LineString

Something strange happens with LineString:

    std::unique_ptr<geos::geom::LineString> a = geos::geom::GeometryFactory::getDefaultInstance()->createLineString();
    geos::geom::Geometry *b = a.get(); // ok
    geos::geom::LineString *c = dynamic_cast<geos::geom::LineString *>(b); // c = nullptr

but works with point:

    std::unique_ptr<geos::geom::Point> a = geos::geom::GeometryFactory::getDefaultInstance()->createPoint();
    geos::geom::Geometry *b = a.get(); // ok
    geos::geom::Point *c = dynamic_cast<geos::geom::Point *>(b); // c = b

Is there any reasonable explanation?

isValidOp.h

// CHECKME: should this really be a pointer ?
TopologyValidationError* validErr;

throw an exception method:
IsValidOp::checkNoSelfIntersectingRing(EdgeIntersectionList& eiList)
{
set<const Coordinate*, CoordinateLessThen>nodeSet;
bool isFirst = true;
for(const EdgeIntersection& ei : eiList) {
if(isFirst) {
isFirst = false;
continue;
}
if(nodeSet.find(&ei.coord) != nodeSet.end()) {
validErr = new TopologyValidationError(
TopologyValidationError::eRingSelfIntersection,
ei.coord); //throw an exception
return;
}
else {
nodeSet.insert(&ei.coord);
}
}

when i attach a value to validErr has throw an exception:
An attempt was made to read or write to protected memory. This usually indicates that other memory is corrupted

example source:
c# call dll

geos_c.h gives -Wstrict-prototypes warnings

Using geos-3.8.2 built on OS X 10.13, compiling the following foo.c:

#include <geos_c.h>
void foo(void) {
  GEOSBufferParams* bp;
  bp = GEOSBufferParams_create();
  GEOSBufferParams_destroy(bp);
}

using:

gcc -c foo.c -I/sw/opt/libgeos3.8.2/include -Wall -Wstrict-prototypes

gives a ton of warnings like:

In file included from foo.c:1:
/sw/opt/libgeos3.8.2/include/geos_c.h:160:37: warning: this function declaration
      is not a prototype [-Wstrict-prototypes]
typedef void (GEOSInterruptCallback)();
                                    ^
                                     void
/sw/opt/libgeos3.8.2/include/geos_c.h:163:43: warning: this function declaration
      is not a prototype [-Wstrict-prototypes]
extern void GEOS_DLL GEOS_interruptRequest();
                                          ^
                                           void

If the function takes no parameters, clang wants it explicitly prototyped thay way, for example:

extern void GEOS_DLL GEOS_interruptRequest(void);

Fail to link if compiled as shared lib + inline with MinGW

With MinGW on Windows, linker reports multiple definition of symbols when geos 3.8.0 is created as a shared lib and DISABLE_GEOS_INLINE is OFF.
There is no issue with others combination (shared lib + inline off, static with inline or not).

Click to expand log
[ 99%] Linking CXX shared library ..\bin\libgeos.dll
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x20): multiple definition of `geos::geom::LineSegment::~LineSegment()'
CMakeFiles\geos.dir/objects.a(MinimumDiameter.cpp.obj):MinimumDiameter.cpp:(.text$_ZN4geos4geom11LineSegmentD1Ev[_ZN4geos4geom11LineSegmentD1Ev]+0x0): first defined here
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x30): multiple definition of `geos::noding::BasicSegmentString::getCoordinate(unsigned long long) const'
CMakeFiles\geos.dir/objects.a(EdgeNodingValidator.cpp.obj):EdgeNodingValidator.cpp:(.text$_ZNK4geos6noding18BasicSegmentString13getCoordinateEy[_ZNK4geos6noding18BasicSegmentString13getCoordinateEy]+0x0): first defined here
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x40): multiple definition of `geos::noding::BasicSegmentString::getCoordinates() const'
CMakeFiles\geos.dir/objects.a(EdgeNodingValidator.cpp.obj):EdgeNodingValidator.cpp:(.text$_ZNK4geos6noding18BasicSegmentString14getCoordinatesEv[_ZNK4geos6noding18BasicSegmentString14getCoordinatesEv]+0x0): first defined here
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x50): multiple definition of `geos::geom::LineSegment::~LineSegment()'
CMakeFiles\geos.dir/objects.a(MinimumDiameter.cpp.obj):MinimumDiameter.cpp:(.text$_ZN4geos4geom11LineSegmentD0Ev[_ZN4geos4geom11LineSegmentD0Ev]+0x0): first defined here
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x60): multiple definition of `geos::geom::CoordinateArraySequenceFactory::create() const'
CMakeFiles\geos.dir/objects.a(CoordinateArraySequenceFactory.cpp.obj):CoordinateArraySequenceFactory.cpp:(.text$_ZNK4geos4geom30CoordinateArraySequenceFactory6createEv[_ZNK4geos4geom30CoordinateArraySequenceFactory6createEv]+0x0): first defined here
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0xb0): multiple definition of `geos::geom::CoordinateArraySequenceFactory::create(std::vector<geos::geom::Coordinate, std::allocator<geos::geom::Coordinate> >*, unsigned long long) const'
CMakeFiles\geos.dir/objects.a(CoordinateArraySequenceFactory.cpp.obj):CoordinateArraySequenceFactory.cpp:(.text$_ZNK4geos4geom30CoordinateArraySequenceFactory6createEPSt6vectorINS0_10CoordinateESaIS3_EEy[_ZNK4geos4geom30CoordinateArraySequenceFactory6createEPSt6vectorINS0_10CoordinateESaIS3_EEy]+0x0): first defined here
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x100): multiple definition of `geos::geom::CoordinateArraySequenceFactory::create(std::vector<geos::geom::Coordinate, std::allocator<geos::geom::Coordinate> >&&, unsigned long long) const'
CMakeFiles\geos.dir/objects.a(CoordinateArraySequenceFactory.cpp.obj):CoordinateArraySequenceFactory.cpp:(.text$_ZNK4geos4geom30CoordinateArraySequenceFactory6createEOSt6vectorINS0_10CoordinateESaIS3_EEy[_ZNK4geos4geom30CoordinateArraySequenceFactory6createEOSt6vectorINS0_10CoordinateESaIS3_EEy]+0x0): first defined here
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x150): multiple definition of `geos::geom::CoordinateArraySequenceFactory::create(unsigned long long, unsigned long long) const'
CMakeFiles\geos.dir/objects.a(CoordinateArraySequenceFactory.cpp.obj):CoordinateArraySequenceFactory.cpp:(.text$_ZNK4geos4geom30CoordinateArraySequenceFactory6createEyy[_ZNK4geos4geom30CoordinateArraySequenceFactory6createEyy]+0x0): first defined here
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x1a0): multiple definition of `geos::geom::CoordinateArraySequenceFactory::create(geos::geom::CoordinateSequence const&) const'
CMakeFiles\geos.dir/objects.a(CoordinateArraySequenceFactory.cpp.obj):CoordinateArraySequenceFactory.cpp:(.text$_ZNK4geos4geom30CoordinateArraySequenceFactory6createERKNS0_18CoordinateSequenceE[_ZNK4geos4geom30CoordinateArraySequenceFactory6createERKNS0_18CoordinateSequenceE]+0x0): first defined here
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x200): multiple definition of `geos::noding::BasicSegmentString::isClosed() const'
CMakeFiles\geos.dir/objects.a(EdgeNodingValidator.cpp.obj):EdgeNodingValidator.cpp:(.text$_ZNK4geos6noding18BasicSegmentString8isClosedEv[_ZNK4geos6noding18BasicSegmentString8isClosedEv]+0x0): first defined here
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x1b90): multiple definition of `geos::geom::MultiLineString::clone() const'
CMakeFiles\geos.dir/objects.a(MultiLineString.cpp.obj):MultiLineString.cpp:(.text$_ZNK4geos4geom15MultiLineString5cloneEv[_ZNK4geos4geom15MultiLineString5cloneEv]+0x0): first defined here
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x1c20): multiple definition of `geos::geom::MultiPolygon::clone() const'
CMakeFiles\geos.dir/objects.a(MultiPolygon.cpp.obj):MultiPolygon.cpp:(.text$_ZNK4geos4geom12MultiPolygon5cloneEv[_ZNK4geos4geom12MultiPolygon5cloneEv]+0x0): first defined here
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x2330): multiple definition of `geos::geomgraph::Quadrant::quadrant(double, double)'
CMakeFiles\geos.dir/objects.a(EdgeEnd.cpp.obj):EdgeEnd.cpp:(.text$_ZN4geos9geomgraph8Quadrant8quadrantEdd[_ZN4geos9geomgraph8Quadrant8quadrantEdd]+0x0): first defined here
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x2a50): multiple definition of `geos::geomgraph::GeometryGraph::~GeometryGraph()'
CMakeFiles\geos.dir/objects.a(PointLocator.cpp.obj):PointLocator.cpp:(.text$_ZN4geos9geomgraph13GeometryGraphD1Ev[_ZN4geos9geomgraph13GeometryGraphD1Ev]+0x0): first defined here
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x2af0): multiple definition of `geos::geomgraph::GeometryGraph::~GeometryGraph()'
CMakeFiles\geos.dir/objects.a(PointLocator.cpp.obj):PointLocator.cpp:(.text$_ZN4geos9geomgraph13GeometryGraphD0Ev[_ZN4geos9geomgraph13GeometryGraphD0Ev]+0x0): first defined here
CMakeFiles\geos.dir/objects.a(MCIndexNoder.cpp.obj):MCIndexNoder.cpp:(.text$_ZNK4geos6noding12MCIndexNoder18getNodedSubstringsEv[_ZNK4geos6noding12MCIndexNoder18getNodedSubstringsEv]+0x0): multiple definition of `geos::noding::MCIndexNoder::getNodedSubstrings() const'
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x2a40): first defined here
CMakeFiles\geos.dir/objects.a(MaximalEdgeRing.cpp.obj):MaximalEdgeRing.cpp:(.text$_ZN4geos9operation7overlay15MinimalEdgeRing11setEdgeRingEPNS_9geomgraph12DirectedEdgeEPNS3_8EdgeRingE[_ZN4geos9operation7overlay15MinimalEdgeRing11setEdgeRingEPNS_9geomgraph12DirectedEdgeEPNS3_8EdgeRingE]+0x0): multiple definition of `geos::operation::overlay::MinimalEdgeRing::setEdgeRing(geos::geomgraph::DirectedEdge*, geos::geomgraph::EdgeRing*)'
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x0): first defined here
CMakeFiles\geos.dir/objects.a(MaximalEdgeRing.cpp.obj):MaximalEdgeRing.cpp:(.text$_ZN4geos9operation7overlay15MinimalEdgeRing7getNextEPNS_9geomgraph12DirectedEdgeE[_ZN4geos9operation7overlay15MinimalEdgeRing7getNextEPNS_9geomgraph12DirectedEdgeE]+0x0): multiple definition of `geos::operation::overlay::MinimalEdgeRing::getNext(geos::geomgraph::DirectedEdge*)'
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x10): first defined here
CMakeFiles\geos.dir/objects.a(MaximalEdgeRing.cpp.obj):MaximalEdgeRing.cpp:(.text$_ZN4geos9operation7overlay15MinimalEdgeRingD1Ev[_ZN4geos9operation7overlay15MinimalEdgeRingD1Ev]+0x0): multiple definition of `geos::operation::overlay::MinimalEdgeRing::~MinimalEdgeRing()'
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x680): first defined here
CMakeFiles\geos.dir/objects.a(MaximalEdgeRing.cpp.obj):MaximalEdgeRing.cpp:(.text$_ZN4geos9operation7overlay15MinimalEdgeRingD0Ev[_ZN4geos9operation7overlay15MinimalEdgeRingD0Ev]+0x0): multiple definition of `geos::operation::overlay::MinimalEdgeRing::~MinimalEdgeRing()'
CMakeFiles\geos.dir/objects.a(inlines.cpp.obj):inlines.cpp:(.text+0x820): first defined here
collect2.exe: error: ld returned 1 exit status

Quick fix:

--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -224,7 +224,7 @@ add_subdirectory(src)

 if(BUILD_SHARED_LIBS)
   target_compile_definitions(geos
-    PRIVATE $<$<CXX_COMPILER_ID:MSVC>:GEOS_DLL_EXPORT>)
+    PRIVATE $<IF:$<CXX_COMPILER_ID:MSVC>,GEOS_DLL_EXPORT,DLL_EXPORT>)

   set_target_properties(geos PROPERTIES VERSION ${GEOS_VERSION})
   set_target_properties(geos PROPERTIES SOVERSION ${GEOS_VERSION})
@@ -238,7 +238,7 @@ target_link_libraries(geos_c PRIVATE geos)

 if(BUILD_SHARED_LIBS)
   target_compile_definitions(geos_c
-    PRIVATE $<$<CXX_COMPILER_ID:MSVC>:GEOS_DLL_EXPORT>)
+    PRIVATE $<IF:$<CXX_COMPILER_ID:MSVC>,GEOS_DLL_EXPORT,DLL_EXPORT>)

   set_target_properties(geos_c PROPERTIES VERSION ${CAPI_VERSION})
   if(NOT WIN32)

Therefore, inline.cpp is not compiled if MinGW + shared + inline (and we can make use of DLL_EXPORT which is not used or defined anywhere else in source code):

...
// Only do something if GEOS_INLINE is defined
// Otherwise we'll end up with duplicated symbols
#ifdef GEOS_INLINE

// If using Visual C++ with GEOS_INLINE, do not build inline.obj
// otherwise linker will complain "multiple definition" errors.
// If using MingW with GEOS_INLINE to build a DLL then MingW's gcc
// has already generated the stubs for the contents of this file.
// Hence we need to suppress it to avoid "multiple definition" errors
// during the final link phase
#if !defined(_MSC_VER) && (!defined(__MINGW32__) || defined(__MINGW32__) && !defined(GEOS_DLL_EXPORT) && !defined(DLL_EXPORT) )
...

Out of bound array access on emptyCoords3d

After upgrading QGIS from 3.4 to 3.10, it crashes when zooming into one of my maps. Here goes a backtrace from qgis/QGIS@0a1d225 using GEOS 43051eb:

#0  0x00007fffeda5798f in <lambda()>::operator()(void) const (__closure=0x7fffb3ffb7e0) at /…/geos/capi/geos_ts_c.cpp:2122
#1  0x00007fffeda6790d in execute<GEOSCoordSeq_getXYZ_r(GEOSContextHandle_t, const geos::geom::CoordinateSequence*, unsigned int, double*, double*, double*)::<lambda()> >(GEOSContextHandle_t, std::conditional<false, char, int>::type, <lambda()> &&) (extHandle=0x7fff545390a0, errval=0, f=...) at /…/geos/capi/geos_ts_c.cpp:353
#2  0x00007fffeda57a2a in GEOSCoordSeq_getXYZ_r(GEOSContextHandle_t, geos::geom::CoordinateSequence const*, unsigned int, double*, double*, double*) (extHandle=0x7fff545390a0, cs=0x7fffe939e2b0 <geos::geom::emptyCoords3d>, idx=0, x=0x7fffb3ffb880, y=0x7fffb3ffb878, z=0x7fffb3ffb870) at /…/geos/capi/geos_ts_c.cpp:2120
#3  0x00007ffff572fedb in QgsGeos::coordSeqPoint(GEOSCoordSeq_t const*, int, bool, bool) (cs=0x7fffe939e2b0 <geos::geom::emptyCoords3d>, i=0, hasZ=true, hasM=false) at /…/QGIS/src/core/geometry/qgsgeos.cpp:1276
#4  0x00007ffff572f000 in QgsGeos::fromGeos(GEOSGeom_t const*) (geos=0x7fffac90a950) at /…/QGIS/src/core/geometry/qgsgeos.cpp:1098
#5  0x00007ffff573061a in QgsGeos::overlay(QgsAbstractGeometry const*, QgsGeos::Overlay, QString*) const (this=0x7fffb3ffbaf0, geom=0x5555574e2330, op=QgsGeos::OverlayIntersection, errorMsg=0x7fffb3ffbc30) at /…/QGIS/src/core/geometry/qgsgeos.cpp:1434
#6  0x00007ffff572b065 in QgsGeos::intersection(QgsAbstractGeometry const*, QString*) const (this=0x7fffb3ffbaf0, geom=0x5555574e2330, errorMsg=0x7fffb3ffbc30) at /…/QGIS/src/core/geometry/qgsgeos.cpp:219
#7  0x00007ffff5704678 in QgsGeometry::intersection(QgsGeometry const&) const (this=0x7fffb3ffbc20, geometry=...) at /…/QGIS/src/core/geometry/qgsgeometry.cpp:2261
#8  0x00007ffff56bd6c6 in QgsPalLabeling::prepareGeometry(QgsGeometry const&, QgsRenderContext&, QgsCoordinateTransform const&, QgsGeometry const&, bool) (geometry=..., context=..., ct=..., clipGeometry=..., mergeLines=false) at /…/QGIS/src/core/labeling/qgspallabeling.cpp:3588
#9  0x00007ffff56b20cf in QgsPalLayerSettings::registerFeature(QgsFeature const&, QgsRenderContext&, QgsLabelFeature**, QgsGeometry, QgsSymbol const*) (this=0x555557837400, f=..., context=..., labelFeature=0x7fffb3ffcc78, obstacleGeometry=..., symbol=0x0) at /…/QGIS/src/core/labeling/qgspallabeling.cpp:1958
#10 0x00007ffff56d1535 in QgsVectorLayerLabelProvider::registerFeature(QgsFeature const&, QgsRenderContext&, QgsGeometry const&, QgsSymbol const*) (this=0x5555578373b0, feature=..., context=..., obstacleGeometry=..., symbol=0x0) at /…/QGIS/src/core/labeling/qgsvectorlayerlabelprovider.cpp:177
#11 0x00007ffff53f985a in QgsVectorLayerRenderer::drawRenderer(QgsFeatureIterator&) (this=0x5555573a3740, fit=...) at /…/QGIS/src/core/qgsvectorlayerrenderer.cpp:349
#12 0x00007ffff53f8e1f in QgsVectorLayerRenderer::render() (this=0x5555573a3740) at /…/QGIS/src/core/qgsvectorlayerrenderer.cpp:282
#13 0x00007ffff51c0208 in QgsMapRendererParallelJob::renderLayerStatic(LayerRenderJob&) (job=...) at /…/QGIS/src/core/qgsmaprendererparalleljob.cpp:353
#14 0x00007ffff51c1a44 in QtConcurrent::FunctionWrapper1<void, LayerRenderJob&>::operator()(LayerRenderJob&) (this=0x5555579983b8, u=...) at /usr/include/x86_64-linux-gnu/qt5/QtConcurrent/qtconcurrentfunctionwrappers.h:80
#15 0x00007ffff51c17a5 in QtConcurrent::MapKernel<QList<LayerRenderJob>::iterator, QtConcurrent::FunctionWrapper1<void, LayerRenderJob&> >::runIteration(QList<LayerRenderJob>::iterator, int, void*) (this=0x555557998380, it=...) at /usr/include/x86_64-linux-gnu/qt5/QtConcurrent/qtconcurrentmapkernel.h:68
#16 0x00007ffff51c1835 in QtConcurrent::MapKernel<QList<LayerRenderJob>::iterator, QtConcurrent::FunctionWrapper1<void, LayerRenderJob&> >::runIterations(QList<LayerRenderJob>::iterator, int, int, void*) (this=0x555557998380, sequenceBeginIterator=..., beginIndex=13, endIndex=14) at /usr/include/x86_64-linux-gnu/qt5/QtConcurrent/qtconcurrentmapkernel.h:77
#17 0x00007ffff51c1c75 in QtConcurrent::IterateKernel<QList<LayerRenderJob>::iterator, void>::forThreadFunction() (this=0x555557998380) at /usr/include/x86_64-linux-gnu/qt5/QtConcurrent/qtconcurrentiteratekernel.h:255
#18 0x00007ffff51c19ae in QtConcurrent::IterateKernel<QList<LayerRenderJob>::iterator, void>::threadFunction() (this=0x555557998380) at /usr/include/x86_64-linux-gnu/qt5/QtConcurrent/qtconcurrentiteratekernel.h:217
#19 0x00007fffeddc5a25 in QtConcurrent::ThreadEngineBase::run() () at /usr/lib/x86_64-linux-gnu/libQt5Concurrent.so.5
#20 0x00007ffff348fcf2 in  () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#21 0x00007ffff348c872 in  () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#22 0x00007fffec9f0f27 in start_thread (arg=<optimized out>) at pthread_create.c:479
#23 0x00007ffff31222af in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

Frame 7

Let’s start here:

(gdb) frame 7
#7  0x00007ffff5704678 in QgsGeometry::intersection (this=0x7fffb3ffbc20, geometry=...) at /…/QGIS/src/core/geometry/qgsgeometry.cpp:2261
2261      std::unique_ptr< QgsAbstractGeometry > resultGeom( geos.intersection( geometry.d->geometry.get(), &mLastError ) );

and examine the QgsGeometry::intersection() arguments:

(gdb) whatis this
type = const QgsGeometry * const
(gdb) print -pretty -- geometry.boundingBox()
$… = {
  mXmin = 446283.21201385959,
  mYmin = 221761.26723054936,
  mXmax = 488357.20122167486,
  mYmax = 256581.12036805169
}
(gdb) print -elements unlimited -- geometry.asWkt(17).toStdString()
$… = "Polygon ((446283.2120138595928438 221761.26723054936155677, 488357.20122167485533282 221761.26723054936155677, 488357.20122167485533282 256581.12036805169191211, 446283.2120138595928438 256581.12036805169191211, 446283.2120138595928438 221761.26723054936155677))"
(gdb) print -pretty -- (*this).boundingBox()
[New Thread 0x7fffc8810700 (LWP 123180)]
$… = {
  mXmin = 446099.18131515954,
  mYmin = 234308.57043624669,
  mXmax = 446099.18131515954,
  mYmax = 234308.57043624669
}
(gdb) print -- (*this).asWkt(17).toStdString()
$… = "Point (446099.18131515954155475 234308.57043624669313431)"

So this is a point and geometry is a polygon. Here’s the next step: https://github.com/qgis/QGIS/blob/0a1d22574a2d804d210b4cf9e7c81b41a2f87b51/src/core/geometry/qgsgeometry.cpp#L2261. Let’s call geos.intersection() and jump to

Frame 6–5

(gdb) frame 6
#6  0x00007ffff572b065 in QgsGeos::intersection (this=0x7fffb3ffbaf0, geom=0x5555574e2330, errorMsg=0x7fffb3ffbc30) at /…/QGIS/src/core/geometry/qgsgeos.cpp:219
219       return overlay( geom, OverlayIntersection, errorMsg ).release();
(gdb) frame 5
#5  0x00007ffff573061a in QgsGeos::overlay (this=0x7fffb3ffbaf0, geom=0x5555574e2330, op=QgsGeos::OverlayIntersection, errorMsg=0x7fffb3ffbc30) at /…/QGIS/src/core/geometry/qgsgeos.cpp:1434
1434        return fromGeos( opGeom.get() );

Frame 4

(gdb) frame 4
#4  0x00007ffff572f000 in QgsGeos::fromGeos (geos=0x7fffac90a950) at /…/QGIS/src/core/geometry/qgsgeos.cpp:1098
1098          return std::unique_ptr<QgsAbstractGeometry>( coordSeqPoint( cs, 0, hasZ, hasM ).clone() );

geos seems to equal emptyCoords3d, defined in

const static FixedSizeCoordinateSequence<0> emptyCoords3d(3);

I’ll skip several frames.

Frame 0

(gdb) frame 0
#0  0x00007fffeda5798f in <lambda()>::operator()(void) const (__closure=0x7fffb3ffb7e0) at /…/geos/capi/geos_ts_c.cpp:2122
2122                *x = c.x;
(gdb) list
2117        int
2118        GEOSCoordSeq_getXYZ_r(GEOSContextHandle_t extHandle, const CoordinateSequence* cs, unsigned int idx, double* x, double* y, double* z)
2119        {
2120            return execute(extHandle, 0, [&]() {
2121                auto& c = cs->getAt(idx);
2122                *x = c.x;
2123                *y = c.y;
2124                *z = c.z;
2125                return 1;
2126            });

Here the crash happens. cs is an instance of FixedSizeCoordinateSequence<0>, that is, its m_data array has size of 0. idx is 0 as well. The getAt(0) call segfaults as m_data[0] cannot be accessed.

The trivial fix would be to check the array bound:

int
GEOSCoordSeq_getXYZ_r(GEOSContextHandle_t extHandle, const CoordinateSequence* cs, unsigned int idx, double* x, double* y, double* z)
{
    return execute(extHandle, 0, [&]() {
        if (cs.getSize() <= idx) {
            throw IllegalArgumentException("");
        }
        auto& c = cs->getAt(idx);
        *x = c.x;
        *y = c.y;
        *z = c.z;
        return 1;
    });
}

and it fixes the QGIS crash for me. But I’d like to ask for your opinions as I do not know the GEOS/QGIS code very well.

Many C API functions lack tests

Functions and code paths not tested can be seen in this codecov report: https://codecov.io/gh/libgeos/geos/src/master/capi/geos_ts_c.cpp. You should be able to view it without an account at least once, but it seems to require login after a few page views.

This would be a great task for anyone who wants to begin contributing to GEOS.

The behavior of the underlying operations is generally tested elsewhere, but C API tests should at least verify that

  • the function correctly operates with trivial inputs
  • it preserves SRID, if applicable
  • it returns the documented error code on error (if you can think of a way to trigger an error)

Diff between doc and code for GEOSisValidReason_r

In the documentation, it is said that an empty string will be return for a valid geometry, however, we get "Valid Geometry".

It seems pretty easy to fix, let me know to which version you want to stick (I prefer the empty string) and I'll do it :)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.