File:Valeriepieris circle azimuthal equal area.png

原始文件 (1,024 × 1,024像素,文件大小:1.16 MB,MIME类型:image/png


摘要

描述
English: Danny Quah's Valerispieris circle on a globe model, centred on Mong Khet, Myanmar, rendered in azimuthal equal-area projection from the equirectangular projection from http://commons.wikimedia.org/wiki/File:Earthmap1000x500.jpg by CMG Lee. The fraction of the area of circle to that of the globe is equal to its equivalent on Earth.
日期 upload 25. Oct. 2005
来源
Earthmap1000x500.jpg
作者 cmglee, jimht at shaw dot ca
其他版本
Valeriepieris circle azimuthal equidistant.png
Mecca azimuthal equidistant.png
Cambridge azimuthal equidistant.png

Python source

#!/usr/bin/env python

import re, math, png

path_in          = 'mya/Earthmap1000x500.png'
path_out         = 'Valeriepieris_circle_azimuthal_equal_area.png'
colour_circle    = [255, 255, 0]
radius_circle    = 0.51
thickness_circle = 0.01
lat_centre       = 21.7
long_centre      = 99.383333
zoom             = 0.5
# zoom             = 0.33
# out_size         = 512
out_size         = 2048
out_size_half    = out_size * 0.5

class Png:
 def __init__(self, path_in):
  (self.width, self.height, self.pixels, self.metadata) = png.Reader(path_in).read_flat()
  self.planes = self.metadata['planes']
 def __str__(self): return str((self.width, self.height, len(self.pixels), self.metadata))
 def write(self, path_out):
  png.Writer(width=self.width, height=self.height,
             bitdepth=self.metadata['bitdepth'], interlace=self.metadata['interlace'],
             planes=self.metadata['planes'], greyscale=self.metadata['greyscale'],
             alpha=self.metadata['alpha']).write_array(open(path_out, 'wb'), self.pixels)

## Formula from http://mathworld.wolfram.com/AzimuthalEquidistantProjection.html
def azimuthal_equidistant_to_equirectangular(x, y, lat_centre, long_centre):
 c              = math.hypot(x, y)
 if c == 0 or (abs(lat_centre) == 90 and y == 0): return (0, 0)
 sin_c          = math.sin(c)
 cos_c          = math.cos(c)
 lat_centre_rad = math.radians(lat_centre)
 sin_lat_centre = math.sin(lat_centre_rad)
 cos_lat_centre = math.cos(lat_centre_rad)
 to_asin  = cos_c * sin_lat_centre + y * sin_c * cos_lat_centre / c
 if abs(to_asin) > 1: return (0, 0)
 lat  =  math.degrees(math.asin(to_asin))
 long = (math.degrees(math.atan2(-x, y) if lat_centre ==  90 else
                      math.atan2( x, y) if lat_centre == -90 else
                      math.atan2(x * sin_c, c * cos_lat_centre * cos_c -
                                            y * sin_lat_centre * sin_c)) +
         long_centre + 540) % 360 - 180 ## +540%360-180 to make range [-180,180)
 return (lat, long)
## From http://mathworld.wolfram.com/LambertAzimuthalEqual-AreaProjection.html
def azimuthal_equal_area_to_equirectangular(x, y, lat_centre, long_centre):
 rho            = math.hypot(x, y)
 if rho == 0 or (abs(lat_centre) == 90 and y == 0) or abs(rho * 0.5) > 1:
  return (None, None)
 c              = 2 * math.asin(rho * 0.5)
 sin_c          = math.sin(c)
 cos_c          = math.cos(c)
 lat_centre_rad = math.radians(lat_centre)
 sin_lat_centre = math.sin(lat_centre_rad)
 cos_lat_centre = math.cos(lat_centre_rad)
 to_asin  = cos_c * sin_lat_centre + y * sin_c * cos_lat_centre / rho
 if abs(to_asin) > 1: return (None, None)
 lat  =  math.degrees(math.asin(to_asin))
 long = (math.degrees(math.atan2(x * sin_c, rho * cos_lat_centre * cos_c -
                                            y * sin_lat_centre * sin_c)) +
         long_centre + 540) % 360 - 180 ## +540%360-180 to make range [-180,180)
 return (lat, long)

png_in = Png(path_in)
print(png_in)
print(png_in.pixels[:20])
png_out = Png(path_in) ## copy most of original's metadata
png_out.width  = png_out.height = out_size
png_out.pixels = [0] * (png_out.width * png_out.height)
print(png_out)
for  out_y in range(out_size):
 for out_x in range(out_size):
  x = (out_x / out_size_half - 1) /  zoom
  y = (out_y / out_size_half - 1) / -zoom
  if abs(math.hypot(x,y) - radius_circle) < thickness_circle * zoom:
   colour = colour_circle
  else:
   # (lat, long) = azimuthal_equidistant_to_equirectangular(x, y, lat_centre, long_centre)
   (lat, long) = azimuthal_equal_area_to_equirectangular(x, y, lat_centre, long_centre)
   if lat is None or long is None:
    colour = [0] * png_out.planes
   else:
    in_y      = int(png_in.height * ( 90 - lat ) / 180.0)
    in_x      = int(png_in.width  * (180 + long) / 360.0)
    in_offset = (in_y  * png_in.width + in_x ) * png_in .planes
    colour    = png_in.pixels[in_offset :in_offset  + png_in.planes]
  out_offset  = (out_y * out_size     + out_x) * png_out.planes
  png_out.pixels[out_offset:out_offset + png_out.planes] = colour
png_out.write(path_out)

许可协议

我,本作品著作权人,特此采用以下许可协议发表本作品:
w:zh:知识共享
署名 相同方式共享
本文件采用知识共享署名-相同方式共享 4.0 国际许可协议授权。
您可以自由地:
  • 共享 – 复制、发行并传播本作品
  • 修改 – 改编作品
惟须遵守下列条件:
  • 署名 – 您必须对作品进行署名,提供授权条款的链接,并说明是否对原始内容进行了更改。您可以用任何合理的方式来署名,但不得以任何方式表明许可人认可您或您的使用。
  • 相同方式共享 – 如果您再混合、转换或者基于本作品进行创作,您必须以与原先许可协议相同或相兼容的许可协议分发您贡献的作品。

说明

添加一行文字以描述该文件所表现的内容
Danny Quah's Valerispieris circle on a globe model, centred on Mong Khet, Myanmar, rendered in azimuthal equal-area projection from the equirectangular projection

此文件中描述的项目

描绘内容

瓦列里埃皮埃里斯圈 中文(已转写)

版权状态 简体中文(已转写)

版权所有 简体中文(已转写)

文件历史

点击某个日期/时间查看对应时刻的文件。

日期/时间缩⁠略⁠图大小用户备注
当前2024年1月20日 (六) 08:042024年1月20日 (六) 08:04版本的缩略图1,024 × 1,024(1.16 MB)CmgleeUploaded own work with UploadWizard

以下2个页面使用本文件:

全域文件用途

以下其他wiki使用此文件:

元数据