Calculating Distance in the Lambert Conformal Conic projection vs WGS84/GDA94

Lambert Conformal Conic 2 Standard Parallels

This projection is commonly used around the world. An example is the NSW Lambert projection.

The definition of the projection is described here.

Note that “[the] two standard parallels […] maintain exact scale, while the scale varies along the meridians” being reduced between the parallels and increased beyond them.

Use Case

I worked on a national (Australia) scale database which stored its data in a LCC projection. What was not understood by those who chose the projection was the distance/scale issue.

When accurate distances were required the application had to project the data into a geographic SRID (4283), compute the distance/length, and then throw away the projected data (a run-time penalty).

If the database had been defined to use a geographic SRID in the first place this additional processing could have been avoided.

Examples

The question of scale difference can be easily demonstrated using PostGIS.

Lines along parallels

Firstly we calculate distance along parallels including the two standard parallels for the NSW Lambert projection.

-- NSW Lambert
-- -30.75 is standard_parallel_1 (latitude)
-- -35.75 is standard_parallel_2 (latitude)
-- Length along parallel should be same.
select round(latitude,2) as latitude,
       round(ST_Length(line,true)::numeric,3) as llLength,
       round(ST_Length(ST_Transform(line,3308))::numeric,3) as lamLength,
       round(ABS(ST_Length(line,true)::numeric - ST_Length(ST_Transform(line,3308))::numeric),3) as diff
  from (select gs::decimal/100.0 as latitude, 
               ST_GeomFromEWKT('SRID=4283;LINESTRING(139.0 '||gs::decimal/100.0||',141.0 '||gs::decimal/100.0||')') as line
          from generate_series(-4075,-2575,100) as gs
       ) as f;
latitudelllengthlamlengthdiff
-40.75168900.910170231.9091330.999
-39.75171405.356172372.050966.694
-38.75173857.373174507.424650.051
-37.75176256.234176638.748382.514
-36.75178601.231178766.725165.494
-35.75180891.670180892.0430.372
-34.75183126.877183015.379111.498
-33.75185306.192185137.399168.794
-32.75187428.976187258.759170.217
-31.75189494.604189380.109114.496
-30.75191502.471191502.0880.383
-29.75193451.989193625.335173.347
-28.75195342.586195750.480407.894
-27.75197173.711197878.152704.441
-26.75198944.828200008.9771064.148
-25.75200655.423202143.5791488.156

Note here that lines along the two standard parallels are, effectively, equal (as predicted) with parallels between and beyond the parallels being unequal.

Lines of random direction

-- Random linestrings
-- Projected Bounds: 8709235.6860, 4009911.3943, 9951732.0554, 5048642.3129
with data as (
  select 8709235.6860 as llx, 4009911.3943 as lly, 9951732.0554 as urx, 5048642.3129 as ury
)
select round(g.lamLength::numeric,3) as LamLength,
       round(g.llLength::numeric,3) as LLLength,
       round(ABS(g.lamLength-g.llLength)::numeric,3) as diff,  
       ST_Transform(g.line,4283)::geography as line
  from (select ST_Length(f.line) as lamLength,
               ST_Length(ST_Transform(f.line,4283)::geography,true) as llLength,
		       line
          from (select gs as id,
                       ST_SetSrid(
                          ST_MakeLine(ST_MakePoint(spdba.random_between(llx,urx),
                                                   spdba.random_between(lly,ury)),
                                      ST_MakePoint(spdba.random_between(llx,urx),
                                                   spdba.random_between(lly,ury))
                          ),3308) as line
                  from data,
                       generate_series(1,10,1) as gs
	           ) as f
         ) as g;
lamlengthlllengthdiffline
754406.739754650.329243.5900102000020BB10000002000000CA37AE7EDB4B62404759EA5666303DC0CC214EA682EF614037E5A12907C541C0
452723.767452998.890275.1230102000020BB1000000200000047C72184CCC86240B5A1741546493EC0388E8E2750C46240E5AD811D4C2F41C0
813066.112813314.156248.0440102000020BB1000000200000089C49BCE7D066240B35FA31A9B6B3DC0BB00C06E6E5162403049B20AEE3D42C0
198902.064199084.156182.0920102000020BB10000002000000E980B75EE44E6240B53CF4FC267340C0ADE39F8EE81E6240C3693545561741C0
422357.726422315.20042.5270102000020BB10000002000000900A38FC5380624039CCE9995DB641C0B8394B5F20126340E3E91A74CE2342C0
378277.782378208.82668.9570102000020BB10000002000000CCA7874B82C06140035D1C839D2B40C07A67832B9DA16140BCFC5C6768083DC0
190953.478190745.757207.7220102000020BB10000002000000111E0546815A6240F3259CDF7C733EC058949CAA3A4F624034FD083911C23CC0
689064.040689173.297109.2580102000020BB1000000200000060B093BC73FB61402A5BCBCD8B4B41C02EAA11C5E24E6240E09742A5A0C93CC0
564407.729564731.142323.4130102000020BB10000002000000C72C74F2D7BE61401BB989373D7B3FC06C0A5FD2ED7C6240DD81E1E110D93FC0
380615.258380768.053152.7950102000020BB100000020000004F2D3DEA7FC262401273D7CF3EBF40C0EF1690860E096340599213471F3442C0

Note that the difference in distance between random linestrings is pronounced. Whether this issue affects your use of a Lambert Conformal Conic projection in your application depends on your needs. If, for example, accurate distance is important Lambert Conformation Conic may not be suitable.

If I have misrepresented the distance/scale issue for Lambert Conformal Conic projections please contact me.

Leave a Reply

Your email address will not be published. Required fields are marked *