Projection for Germany that preserves distance?
You don't need an equidistant projection, but geodetic distances calculated on a spheroid (Vincenty's formulae) or a sphere (Great-cicle distance).
For instance, geopy
is able to calculate them.
Here’s an example usage of Vincenty distance:
>>> from geopy.distance import vincenty >>> newport_ri = (41.49008, -71.312796) >>> cleveland_oh = (41.499498, -81.695391) >>> print(vincenty(newport_ri, cleveland_oh).miles) 538.3904451566326
Using great-circle distance:
>>> from geopy.distance import great_circle >>> newport_ri = (41.49008, -71.312796) >>> cleveland_oh = (41.499498, -81.695391) >>> print(great_circle(newport_ri, cleveland_oh).miles) 537.1485284062816
Source: https://pypi.python.org/pypi/geopy#measuring-distance
how to find point B with the above-described method?
You need to solve the direct problem, i.e. given an initial point, its azimuth and a geodesic distance calculate the final point. A Python implementation of the direct problem is available in the PyGeodesy package.
Example:
>>> from pygeodesy.ellipsoidalVincenty import LatLon
>>> p = LatLon(-37.95103, 144.42487)
>>> d = p.destination(54972.271, 306.86816)
>>> print d.lon, d.lat
143.926497668 -37.6528177174
For this, I have to project point A to a projection that preserves distance (Equidistant).
You may have misunderstood "Equidistant" in Equidistant projections. It's a common misunderstanding that "Equidistant" projections preserves distances everywhere, which is impossible due to one of Gauss's theorems.
Some projections are called "Equidistant" because they preserve distance along a set of specific lines, such as meridians or parallels, which are called standard lines.
If in your case, points A and B are always to the East/West of each other, then in Sinusoidal projection, all parallel lines are standard.
Otherwise, you can use the spheroidal distance e.g. by computing distance directly with your points in lat/long (EPSG 4326) using PostGIS's geography type.
If you do not need accuracy down to the millimeter, you can just use one of the common transverse Mercator coordinate systems for this area, UTM zone 33 (EPSG 32633) or Gauß-Krüger zone 4 (EPSG 31468):
gk4_data = latlon_data.to_crs(epsg=31468)
Berlin is near a zone border in both systems, which results in small errors. As mentioned by Matte, in UTM, deviations are around 25 cm per km; Gauß-Krüger uses narrower zones, but without UTM's scale factor, so the deviations are approximately the same.