Pythonを使用して、大きな円距離を作成する必要があります。これは、数値であり、できればクライアント側のマップを描画するために使用できる何らかの「曲線」です。曲線の形式(WKTであろうと座標のペアであろうと)については気にしませんが、データを取得したいだけです。
そこにはどんなツールがありますか?何を使うべきですか?
Pythonを使用して、大きな円距離を作成する必要があります。これは、数値であり、できればクライアント側のマップを描画するために使用できる何らかの「曲線」です。曲線の形式(WKTであろうと座標のペアであろうと)については気にしませんが、データを取得したいだけです。
そこにはどんなツールがありますか?何を使うべきですか?
回答:
以下に役立つリンクをいくつか示します。
http://www.koders.com/python/fid0A930D7924AE856342437CA1F5A9A3EC0CAEACE2.aspx http://code.activestate.com/recipes/393241-calculating-the-distance-between-zip-codes/
他の人から提供された答えはもう少しエレガントですが、ここでは基本を提供する、非常にシンプルで、やや非PythonyなPythonのビットを紹介します。この関数は、2つの座標ペアとユーザー指定のセグメント数を取ります。大円の経路に沿って一連の中間点を生成します。出力:KMLとして書き込めるテキスト。警告:コードは対antiを考慮せず、球体を想定しています。
Alan Glennonによるコードhttp://enj.com 2010年7月(著者はこのコードをパブリックドメインに置きます。自己責任で使用してください)。
-
def tweensegs(longitude1、latitude1、longitude2、latitude2、num_of_segments):
import math
ptlon1 = longitude1
ptlat1 = latitude1
ptlon2 = longitude2
ptlat2 = latitude2
numberofsegments = num_of_segments
onelessthansegments = numberofsegments - 1
fractionalincrement = (1.0/onelessthansegments)
ptlon1_radians = math.radians(ptlon1)
ptlat1_radians = math.radians(ptlat1)
ptlon2_radians = math.radians(ptlon2)
ptlat2_radians = math.radians(ptlat2)
distance_radians=2*math.asin(math.sqrt(math.pow((math.sin((ptlat1_radians-ptlat2_radians)/2)),2) + math.cos(ptlat1_radians)*math.cos(ptlat2_radians)*math.pow((math.sin((ptlon1_radians-ptlon2_radians)/2)),2)))
# 6371.009 represents the mean radius of the earth
# shortest path distance
distance_km = 6371.009 * distance_radians
mylats = []
mylons = []
# write the starting coordinates
mylats.append([])
mylons.append([])
mylats[0] = ptlat1
mylons[0] = ptlon1
f = fractionalincrement
icounter = 1
while (icounter < onelessthansegments):
icountmin1 = icounter - 1
mylats.append([])
mylons.append([])
# f is expressed as a fraction along the route from point 1 to point 2
A=math.sin((1-f)*distance_radians)/math.sin(distance_radians)
B=math.sin(f*distance_radians)/math.sin(distance_radians)
x = A*math.cos(ptlat1_radians)*math.cos(ptlon1_radians) + B*math.cos(ptlat2_radians)*math.cos(ptlon2_radians)
y = A*math.cos(ptlat1_radians)*math.sin(ptlon1_radians) + B*math.cos(ptlat2_radians)*math.sin(ptlon2_radians)
z = A*math.sin(ptlat1_radians) + B*math.sin(ptlat2_radians)
newlat=math.atan2(z,math.sqrt(math.pow(x,2)+math.pow(y,2)))
newlon=math.atan2(y,x)
newlat_degrees = math.degrees(newlat)
newlon_degrees = math.degrees(newlon)
mylats[icounter] = newlat_degrees
mylons[icounter] = newlon_degrees
icounter += 1
f = f + fractionalincrement
# write the ending coordinates
mylats.append([])
mylons.append([])
mylats[onelessthansegments] = ptlat2
mylons[onelessthansegments] = ptlon2
# Now, the array mylats[] and mylons[] have the coordinate pairs for intermediate points along the geodesic
# My mylat[0],mylat[0] and mylat[num_of_segments-1],mylat[num_of_segments-1] are the geodesic end points
# write a kml of the results
zipcounter = 0
kmlheader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><kml xmlns=\"http://www.opengis.net/kml/2.2\"><Document><name>LineString.kml</name><open>1</open><Placemark><name>unextruded</name><LineString><extrude>1</extrude><tessellate>1</tessellate><coordinates>"
print kmlheader
while (zipcounter < numberofsegments):
outputstuff = repr(mylons[zipcounter]) + "," + repr(mylats[zipcounter]) + ",0 "
print outputstuff
zipcounter += 1
kmlfooter = "</coordinates></LineString></Placemark></Document></kml>"
print kmlfooter
GeographicLibにはpythonインターフェースがあります:
これにより、楕円上のコンピューター測地線(平坦化をゼロに設定して大円を取得)ができ、測地線上の中間点を生成できます(サンプルの「Line」コマンドを参照)。
JFKからチャンギ空港(シンガポール)までの測地線上のポイントを印刷する方法は次のとおりです。
from geographiclib.geodesic import Geodesic
geod = Geodesic.WGS84
g = geod.Inverse(40.6, -73.8, 1.4, 104)
l = geod.Line(g['lat1'], g['lon1'], g['azi1'])
num = 15 # 15 intermediate steps
for i in range(num+1):
pos = l.Position(i * g['s12'] / num)
print(pos['lat2'], pos['lon2'])
->
(40.60, -73.8)
(49.78, -72.99)
(58.95, -71.81)
(68.09, -69.76)
(77.15, -65.01)
(85.76, -40.31)
(83.77, 80.76)
(74.92, 94.85)
...
pyprojには、パスに沿ったポイントの配列を返すGeod.npts関数があります。配列にはターミナルポイントが含まれていないため、それらを考慮する必要があることに注意してください。
import pyproj
# calculate distance between points
g = pyproj.Geod(ellps='WGS84')
(az12, az21, dist) = g.inv(startlong, startlat, endlong, endlat)
# calculate line string along path with segments <= 1 km
lonlats = g.npts(startlong, startlat, endlong, endlat,
1 + int(dist / 1000))
# npts doesn't include start/end points, so prepend/append them
lonlats.insert(0, (startlong, startlat))
lonlats.append((endlong, endlat))
geopy Python用ジオコーディングツールボックス
http://code.google.com/p/geopy/wiki/GettingStarted#Calculating_distances
私はこのパッケージを使用していませんが、興味深いと思われる解決策:http : //trac.gispython.org/lab/wiki/Shapely
Shapely is a Python package for set-theoretic analysis and manipulation of **planar** features