램버트 등각 원추형 지도

램버트 등각 원추형 지도

TikZ로 지도를 그리고 싶은데, 처음에는 이 지도가 있어야 합니다.램버트 등각 원추형 투영. 하지만 편의를 위해 몇 가지를 포함하고 싶습니다.측지선 계산, 변환 및 계산을 위해 외부 도구를 사용하지 않고도 사용자가 무엇을 하고 있는지 쉽고 투명하게 볼 수 있습니다. 나는 과거에 이것을 했고 이것은 잘 작동했지만 다음 단계로 나아가서 여러분의 의견을 찾고 싶습니다.

주석에 설명이 포함된 가능한 입력 코드는 다음과 같습니다.

\begin{tikz}
\begin{projection}[type=Lambert conformal conic,stdlat1=2,stdlat2=-2,lon0=0,k=1]

\coordinate(point1) at (1.0,0.5); %1 degree North, 0.5 degree East
\coordinate(point2) at (-1.0,-0.5); %1 degree South, 0.5 degree West

\draw (point1) -- ++ (relative cs:100m,50m); %draw line from point1 to a coordinate 100 meters (in reality) to the east and 50 meters (in reality) to the north relative of point1
\draw (point1) -- (point2); %draw line from point1 to point2 (can be straight, does not have to be a geodesic)
\draw ($(point2) + (relative cs: 45:2nm)$) -- (point1); %draw a line from a point on a 45 degree bearing with a distance of 2 nautical miles from point1 to point2
\draw (point1) arc (relative cs: 60:90:3nm); %draw a circle segment from point1 with starting heading of 060 and end heading of 090 with a 3 nautical mile radius

\end{projection}
\end{tikz}

입력 매개변수의 명명법은 다음에서 가져옵니다.측지선Lib.

이것에 가까운 것을 찾을 수도 없었기 때문에 어떤 아이디어, 심지어 출발점이라도 높이 평가됩니다. LuaTeX 또는 이와 유사한 구현을 환영합니다!

답변1

댓글에 훌륭한 의견을 주신 @Schrödinger의 고양이에게 감사드립니다. 이를 적용함으로써 나는 필요한 것에 대한 기본 구조를 생각해 낼 수 있었습니다. 미국의 4개 도시, 애리조나 주 및 그리드를 그리는 작업 예제에 이것을 어떻게 적용했는지 확인할 수 있습니다. 여기에 이미지 설명을 입력하세요 이에 대한 코드(파일이 커지므로 애리조나 경계 제외)는 다음과 같습니다.

\documentclass{article}
\usepackage[a4paper, landscape, margin=0cm]{geometry}

\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}
    Arizona in Lambert Conical projection and the airports PHX, AUS, DTW and JFK
    
\directlua{lambert = require("lambert")}

\newcommand\addLUADEDplot[8]{%
\directlua{lambert.LambertConicalForward(#1,#2,#3,#4,#5,#6,#7,#8)}%
}

    \newenvironment{ellipsoid}[1][a=6378137,f=0.0033528106647475]{
    \setkeys{ellipsoid}{#1}}

    \newenvironment{lambertconical}[1][stdlat1=33,stdlat2=45,lon0=-112,k=1]{\setkeys{lambertconicalkeys}{#1}}
    
    \makeatletter
    \define@key{latlonkeys}{lat}{\def\mylat{#1}}
    \define@key{latlonkeys}{lon}{\def\mylon{#1}}
    \define@key{ellipsoid}{a}{\def\ellipsoidA{#1}}
    \define@key{ellipsoid}{f}{\def\ellipsoidF{#1}}
    \define@key{lambertconicalkeys}{stdlat1}{\def\lambertconicalStdLatONE{#1}}
    \define@key{lambertconicalkeys}{stdlat2}{\def\lambertconicalStdLatTWO{#1}}
    \define@key{lambertconicalkeys}{lon0}{\def\lambertconicalLonZERO{#1}}
    \define@key{lambertconicalkeys}{k}{\def\lambertconicalK{#1}}
    \makeatother
    \tikzdeclarecoordinatesystem{latlon}%
    {%
        \setkeys{latlonkeys}{#1}%
        \addLUADEDplot{\ellipsoidA}{\ellipsoidF}{\lambertconicalStdLatONE}{\lambertconicalStdLatTWO}{\lambertconicalK}{\lambertconicalLonZERO}{\mylat}{\mylon}%
    }

    \begin{tikzpicture}[scale=0.45]
    \begin{ellipsoid}[a=6378137,f=0.0033528106647475]
    \begin{lambertconical}[stdlat1=33,stdlat2=45,lon0=-112,k=0.00001]
        %\draw [->] (0,0,0) -- (0,0,350);
        \node at (latlon cs:lat=33.434167,lon=-112.011667){PHX};
        \node at (latlon cs:lat=30.194444,lon=-97.67){AUS};
        \node at (latlon cs:lat=42.2125,lon=-83.353333){DTW};
        \node at (latlon cs:lat=40.639722,lon=-73.778889){JFK};
        
        \foreach \lon in {-124,-123, ..., -66}
        {
            \foreach \lat in {25,26, ..., 49}
            {
                \draw (latlon cs:lat=\lat,lon=\lon) -- (latlon cs:lat=\lat,lon={\lon+1});
                \draw (latlon cs:lat=\lat,lon=\lon) -- (latlon cs:lat={\lat+1},lon=\lon);
            }
        }

    \end{lambertconical}
    \end{ellipsoid}
    \end{tikzpicture}
\end{document}

Lambert 등각 원뿔형의 Lua 구현(구체에만 복잡한 문제가 뒤따름)은 다음과 같습니다.

local function print_LambertConformalConicForward(a,f,stdlat1,stdlat2,k1,lon0,lat,lon)
lat0 = 40;
n = math.log(math.cos(math.rad(stdlat1))/math.cos(math.rad(stdlat2))) / math.log( math.tan((math.pi/4)+math.rad(stdlat2/2)) / math.tan((math.pi/4)+math.rad(stdlat1/2)))
F = (math.cos(math.rad(stdlat1)) * math.pow(math.tan((math.pi/4)+math.rad(stdlat1/2)), n)) / n
rho = (a * F) / math.pow(math.tan((math.pi/4)+(math.rad(lat)/2)), n)
rho_0 = (a * F) / math.pow(math.tan((math.pi/4)+(math.rad(lat0)/2)), n)
theta = n * (math.rad(lon-lon0))

x = (rho * math.sin(theta)) * k1
y = (rho_0 - (rho * math.cos(theta))) * k1

tex.sprint("\\pgfpointxyz{"..x.."}{"..y.."}{0}%")
end

return { LambertConicalForward = print_LambertConformalConicForward }

2021-12-10 수정: 다른 지도를 작업 중인데 TikZ로 지도 그리기를 찾는 사람이 나뿐만이 아닌 것 같습니다. 이제 이 목적을 위해 지도 타일에 구축된 패키지가 있지만 기본 지도 없이도 사용할 수 있습니다 mercatormap.https://ctan.org/pkg/mercatormap

관련 정보