Ich möchte eine Karte mit TikZ zeichnen und als Startpunkt sollte diese Karte inLambert-konforme Kegelprojektion. Um es jedoch bequemer zu machen, möchte ich einigeGeodätische Berechnungen, sodass es für den Benutzer einfach und transparent ist, was er tut, ohne ein externes Tool für die Konvertierung und Berechnung zu verwenden. Ich habe das in der Vergangenheit getan, es funktioniert gut, aber ich möchte es auf die nächste Ebene bringen und freue mich auf Ihren Input.
Ein möglicher Eingabecode mit Erläuterungen in den Kommentaren könnte wie folgt aussehen:
\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}
Die Nomenklatur der Eingabeparameter ist übernommen aus derGeodätische Bibliothek.
Ich bin für alle Ideen und auch für Ansätze dankbar, da ich nicht einmal etwas in der Art finden konnte. Mögliche Implementierungen mit LuaTeX oder ähnlichem sind willkommen!
Antwort1
Vielen Dank, @Schrödinger's cat, für deine tollen Beiträge in den Kommentaren. Indem ich sie angewendet habe, konnte ich eine Grundstruktur für das entwickeln, was ich brauchte. Du kannst sehen, wie ich dies in einem funktionierenden Beispiel umgesetzt habe, das 4 Städte in den USA, den Bundesstaat Arizona und ein Raster darstellt: Der Code hierfür (ohne die Grenzen von Arizona, da diese die Datei zu groß machen) sieht folgendermaßen aus:
\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}
Die Lua-Implementierung der konformen Lambert-Kegelkurve (nur für eine Kugel, Komplikationen folgen) sieht folgendermaßen aus:
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 }
EDIT am 10.12.2021: Ich arbeite an einer weiteren Karte und es scheint, dass ich nicht der Einzige war, der nach Möglichkeiten suchte, Karten mit TikZ zu zeichnen. Jetzt gibt es ein Paket für diesen Zweck, das auf Kartenkacheln basiert, aber auch ohne eine Basiskarte verwendet werden kann: mercatormap
zu finden unterhttps://ctan.org/pkg/mercatormap