File:Valeriepieris circle azimuthal equal area.png
页面内容不支持其他语言。
本预览的尺寸:600 × 600像素。 其他分辨率:240 × 240像素 | 480 × 480像素 | 768 × 768像素 | 1,024 × 1,024像素。
原始文件 (1,024 × 1,024像素,文件大小:1.16 MB,MIME类型:image/png)
摘要
描述Valeriepieris circle azimuthal equal area.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 | |||
来源 |
|
|||
作者 | cmglee, jimht at shaw dot ca | |||
其他版本 |
|
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)
许可协议
我,本作品著作权人,特此采用以下许可协议发表本作品:
本文件采用知识共享署名-相同方式共享 4.0 国际许可协议授权。
- 您可以自由地:
- 共享 – 复制、发行并传播本作品
- 修改 – 改编作品
- 惟须遵守下列条件:
- 署名 – 您必须对作品进行署名,提供授权条款的链接,并说明是否对原始内容进行了更改。您可以用任何合理的方式来署名,但不得以任何方式表明许可人认可您或您的使用。
- 相同方式共享 – 如果您再混合、转换或者基于本作品进行创作,您必须以与原先许可协议相同或相兼容的许可协议分发您贡献的作品。
知识共享署名-相同方式共享4.0国际 简体中文(已转写)
文件历史
点击某个日期/时间查看对应时刻的文件。
日期/时间 | 缩略图 | 大小 | 用户 | 备注 | |
---|---|---|---|---|---|
当前 | 2024年1月20日 (六) 08:04 | 1,024 × 1,024(1.16 MB) | Cmglee | Uploaded own work with UploadWizard |
文件用途
全域文件用途
以下其他wiki使用此文件:
- en.wikipedia.org上的用途
- es.wikipedia.org上的用途
- fr.wikipedia.org上的用途
- id.wikipedia.org上的用途
- pt.wikipedia.org上的用途
- vi.wikipedia.org上的用途
元数据
此文件中包含有扩展的信息。这些信息可能是由数码相机或扫描仪在创建或数字化过程中所添加。
如果此文件的源文件已经被修改,一些信息在修改后的文件中将不能完全反映出来。
水平分辨率 | 28.34 dpc |
---|---|
垂直分辨率 | 28.34 dpc |