Not ideal, a whole-of-Norway projection would have even more error minimization, but not a bad stopgap, certainly better than using UTM projections way outside their areas of validity. Check a few measurements, and do things like comparing an ST_Distance(A, B) with ST_Distance(A::geography, B::geography) to see how much deviation from truth the projection is adding.
P. > On Jun 11, 2019, at 4:34 AM, Lars Aksel Opsahl <lars.ops...@nibio.no> wrote: > > Hi > > I had a discussion with Knut Bjørkelo a co worker of me today. > > He was wondering if we could use https://epsg.io/3035 <https://epsg.io/3035>, > then all the area values should be correct for all valid UTM Zones in Noway. > > When we need to show a map we transform in to the correct to UTM zone to get > a visual correct map also. > > If I test a single point the transformation seems be accurate up to 4. > decimal using 3035 even for a extreme point. > > select > ST_AStexT(ST_Transform(ST_Transform(ST_Transform(ST_Transform(ST_setSrid(ST_MakePoint(1108142.0,7788000.0),25835),3035),25832),3035),25835)); > st_astext > ------------------------------------------ > POINT(1108142.00005503 7787999.99979103) > (1 row) > > Lars > > > From: postgis-users <postgis-users-boun...@lists.osgeo.org> on behalf of Lars > Aksel Opsahl <lars.ops...@nibio.no> > Sent: Monday, June 10, 2019 10:50 PM > To: PostGIS Users Discussion > Cc: Sandro Santilli > Subject: Re: [postgis-users] Tolerance/SnapTo in Postgis Topology for meter > and degrees. > > Hi > > You have this C-code > > 4870 _lwt_minTolerance( LWGEOM *g ) > 4871 { > 4872 const GBOX* gbox; > 4873 double max; > 4874 double ret; > 4875 > 4876 gbox = lwgeom_get_bbox(g); > 4877 if ( ! gbox ) return 0; /* empty */ > 4878 max = FP_ABS(gbox->xmin); > 4879 if ( max < FP_ABS(gbox->xmax) ) max = FP_ABS(gbox->xmax); > 4880 if ( max < FP_ABS(gbox->ymin) ) max = FP_ABS(gbox->ymin); > 4881 if ( max < FP_ABS(gbox->ymax) ) max = FP_ABS(gbox->ymax); > 4882 > 4883 ret = 3.6 * pow(10, - ( 15 - log10(max?max:1.0) ) ); > 4884 > 4885 return ret; > 4886 } > > In postgis branch svn-2.5 we have this SQL code. > > CREATE OR REPLACE FUNCTION topology._st_mintolerance(ageom Geometry) > RETURNS float8 > AS $$ > SELECT 3.6 * power(10, - ( 15 - log(coalesce( > nullif( > greatest(abs(ST_xmin($1)), abs(ST_ymin($1)), > abs(ST_xmax($1)), abs(ST_ymax($1))), > 0), > 1)) )); > $$ LANGUAGE 'sql' IMMUTABLE STRICT; > > I am not that into C-code but the SQL code looks like the C-code above as you > suggested in your mail. > > So I did a small test > https://github.com/NibioOpenSource/pgtopo_update_sql/blob/develop/src/test/sql/snapto/snapto_code_example_degrees_st_min_tolerance.sql > > <https://github.com/NibioOpenSource/pgtopo_update_sql/blob/develop/src/test/sql/snapto/snapto_code_example_degrees_st_min_tolerance.sql> > using topology._st_mintolerance and yes I was able to get snap to every > second line both vertically and horizontally to work and both and north and > south in Norway. I just got this to work by playing around with > topology._st_mintolerance together different factor values. > > But I have no idea about how I can use this min tolerance code to make a > generic code that behaves like 10 meter tolerance in a planar projection. > > And I am also little unsure about what projection that is correct to use for > datasets that covers all of Norway now. > > Before we did not really have any choice because the projection was quite bad > if moved outside the bonds of the projection limits. We pretty much had to > use degrees to get the a OK quality if we needed to store the data in one > single dataset. > > So whats the "correct projection" now to use for original dataset that covers > all of Norway and which are updated regularly ? > > Thanks a lot. > > Lars > > > From: s...@kbt.io <s...@kbt.io> on behalf of Sandro Santilli <s...@kbt.io> > Sent: Saturday, June 8, 2019 2:06 PM > To: PostGIS Users Discussion > Cc: Lars Aksel Opsahl > Subject: Re: [postgis-users] Tolerance/SnapTo in Postgis Topology for meter > and degrees. > > On Fri, Jun 07, 2019 at 10:02:23AM +0000, Lars Aksel Opsahl wrote: > > > So the problem is how to use tolerances so we get a behavior equal to > > the test using meter. > > > > > > We can we define the layer in Postgis Topology with quite big value > > because this is just max value as it seems. So we can adjust the tolerance > > parameter as we add lines but the problem is that we need to adjust this > > parameter depending on where we are and what orientation the line has. For > > vertical lines we need a bigger tolerance than for horizontal lines in > > Norway. This makes it quite complicated to handle adding new lines. > > I'm not sure if it'd help but PostGIS Topology has an internal > function (not to be relied upon, but could be copied to your own > function) to determine "min tolerance" based on absolute coordinate > values. That function is meant to deal with non-uniform floating-point > resolution. What you're after is a function to deal with non-uniform > tolerances. See > https://trac.osgeo.org/postgis/browser/trunk/liblwgeom/lwgeom_topo.c?rev=14251#L4866 > > <https://trac.osgeo.org/postgis/browser/trunk/liblwgeom/lwgeom_topo.c?rev=14251#L4866> > It used to be done in SQL with previous versions. > > Could that help ? > > --strk;
_______________________________________________ postgis-users mailing list postgis-users@lists.osgeo.org https://lists.osgeo.org/mailman/listinfo/postgis-users