Select to view content in your preferred language

Map Scale, Monitor Pixel Densities and Printing

1553
2
Jump to solution
11-12-2013 05:48 AM
KennyWebster
Deactivated User
We've had a question about one of our applications and the map printing functionality built into it as it relates to scale.  The user was saying the scale is not accurate.

I honestly had not given it much thought before hand.  We're using ArcGIS server 10.0 and Alive PDF to do the printing.  The application takes a page size as input.  Alive PDF prints out at a pixel density of 72 dpi, so using those two pieces of information the pixel size of the printout can be determined.  The map scale is obtained through map.scale and printed on the map as text.

HOWEVER

The user was comparing to the print out to their computer monitor which got me thinking.  Monitors can vary widely in pixel density.  For example - a maximized map on a 27 inch 1080p monitor will actually be a different (viewable) scale then a maximized map on a 1080p 23 inch monitor the pixels are physically a bigger size.  This is assuming Flash Player does not have access to this monitor pixel density information.

So my next jump was to the origin of the data, which was the map service.  The scale is generated there, and in looking at the map service there's a DPI (96) for the cached map services and a resolution.

I'm going forward now under the assumption that the display will not be spatially accurate.  But I am wondering how I can use either the dpi or resolution to make sure that my map print outs have an accurate scale (or to determine an accurate scale even if it doesn't match what the user originally is seeing on the screen).
Tags (2)
0 Kudos
1 Solution

Accepted Solutions
KennyWebster
Deactivated User
This doesn't answer your question, but ... if possible, you might want to use a scale bar instead of a 1:scale.  This way it would be less confusing and would be correct on both your computer screen, a projected big screen and printed out.


You're right that doesn't really answer my question - and I am using a scale bar as well.  I just need to fill in the text based scale in a template that goes along with the map in addition to that.

Either way, this is what I came up with for those curious.

private function calcScale():Number    {     var lodsInfo:LOD = map.lods[map.level] as LOD; //get resolution ie: 1 pixel = x map units (m) where x is the resolution     var resInches:Number = lodsInfo.resolution * 39.3701; //convert res from m to inches     /*     Alive pdf prints at 72 pixels per inch     from the resolution we know that resInches now stores the number of inches on the ground for each pixel     So multiplying resInches by 72 will give us the number of inches on the ground one inch on the page will repesent thus giving us the proper scale     */     return Math.round(72 * resInches);    }

View solution in original post

0 Kudos
2 Replies
BjornSvensson
Esri Regular Contributor
This doesn't answer your question, but ... if possible, you might want to use a scale bar instead of a 1:scale.  This way it would be less confusing and would be correct on both your computer screen, a projected big screen and printed out.
0 Kudos
KennyWebster
Deactivated User
This doesn't answer your question, but ... if possible, you might want to use a scale bar instead of a 1:scale.  This way it would be less confusing and would be correct on both your computer screen, a projected big screen and printed out.


You're right that doesn't really answer my question - and I am using a scale bar as well.  I just need to fill in the text based scale in a template that goes along with the map in addition to that.

Either way, this is what I came up with for those curious.

private function calcScale():Number    {     var lodsInfo:LOD = map.lods[map.level] as LOD; //get resolution ie: 1 pixel = x map units (m) where x is the resolution     var resInches:Number = lodsInfo.resolution * 39.3701; //convert res from m to inches     /*     Alive pdf prints at 72 pixels per inch     from the resolution we know that resInches now stores the number of inches on the ground for each pixel     So multiplying resInches by 72 will give us the number of inches on the ground one inch on the page will repesent thus giving us the proper scale     */     return Math.round(72 * resInches);    }
0 Kudos