ドローン画像の後処理にDrone2Mapを使用している方の参考になればと思い、ここでワークフローを紹介します。これはDJIドローンを使っている方向けです。すでに他で説明されていたらすみません。<\/P>
<\/P>
各画像のEXIFメタデータを生成するとき、画像の高度はDJI機体のGPS高度の読み取り値で埋められます。これは数百フィートもずれていることがあり、Drone2Mapで3Dビューで画像を見ると明らかです。例えば、私は3D建物調査を行い、地上約30フィートと60フィートの2つのループを飛行しました。Drone2Mapの3Dビューで撮影した画像を見ると、地上から200〜230フィートほど離れているように見え、GCPを使っても処理結果が奇妙なものになりました。DJIフォーラムを調べたところ、解決策が見つかりました。<\/P>
補足:データ収集時には、まずDJI goアプリでIMUをキャリブレーションし、異なる作業現場間の天候や標高変化により気圧計の読み取りができるだけ正確になるようにしてください。<\/SPAN><\/P><\/P>EXIFメタデータにはRelativeAltitudeという別のフィールドがあり、これは機体の気圧計から取得されます。この高度ははるかに正確ですが、Drone2Mapで画像高度をこの値に調整するには少し作業が必要です。<\/P><\/P>DJIとDroneDeployによるほとんどの飛行は離陸地点からの相対的な飛行高度にナビゲートし、その高度を維持して飛行し続けるため、地形に対して飛行高度は調整されません。したがって、離陸地点の標高に基づいて飛行高度を調整したいわけです。離陸地点の標高は複数の方法で取得できます。GCPから標高がある場合はそれを使います。なければ、「GCP管理」に行き、「地図から追加」を選択してください。離陸地点をクリックすると追加されたGCPが標高を示します。<\/P><\/P>次のステップは、離陸標高のみを全ラスタにわたって持つ平坦なDEMを作成することです。私はポリゴンを作成し、フィールドを追加して離陸標高を入力し、「ラスターからポリゴンへ変換」ツールでDEMにしました。Drone2MapではDEMは.tif形式である必要がありますのでご注意ください。<\/SPAN><\/P><\/P>これが準備できたら、高度が異なる2セットの画像(異なる高度で飛行)を調整する必要がありましたが、Drone2Map 1.3ではこれを行うための機能が追加されました。まず、一枚の画像をこのツールJeffrey Friedl's Image Metadata Viewer<\/A>に読み込み、RelativeAltitudeの読み取り値を確認します。次に同じ高さで飛行したすべての画像を選択し、「画像高度調整」を選びます。一つの高さで飛行したすべての画像に対してRelativeAltitudeから得た値を入力し、自分で作成したDEMを選択してOKを押します。すべての画像高度が離陸標高に調整されます。Elevationサービスを使うと正しく動作せず、地形に基づいて画像高度が調整されてしまいます。この手順は異なる飛行高度ごとに繰り返してください。<\/P><\/P>完璧に理解できるかどうかわかりませんが、とにかく以上です。この方法はコマンドラインEXIFリーダーより簡単で、MapsMadeEasyの画像高度調整ツールより安価でした。誰かのお役に立てば幸いです。GCP使用時でも結果が大幅に改善しました。<\/P><\/P>よろしくお願いします<\/P><\/BODY><\/HTML>
完璧に理解できるかどうかわかりませんが、とにかく以上です。この方法はコマンドラインEXIFリーダーより簡単で、MapsMadeEasyの画像高度調整ツールより安価でした。誰かのお役に立てば幸いです。GCP使用時でも結果が大幅に改善しました。<\/P>
よろしくお願いします<\/P><\/BODY><\/HTML>
Hi David
This was an incredibly useful post, thank you. I have a DJI drone and I have been struggling with creating a 3D products from Drone2Map that are vertically aligned with the surrounding landscape. I have tried adding GCP points but that usually results in a very skewed final product. This ultimately results in me not wanting to share my Drone2Map products with others until such time as I sort out the altitude problem. Your workflow has solved that.
To simplify your workflow, I have created a new idea for Drone2Map on the ArcGIS Ideas site. Do see https://community.esri.com/ideas/15040
Thanks so much.
Regards
Mervyn
Hi all,
also not being a command line king I found an easy tool to adjust EXIF data - the ExifToolGui.
With the following steps you can adjust eg. the wrong height and/or the shifted coordinates from the new DJI Mavic 2 Pro.
exiftool -GPSAltitude=123 m a.jpg b.jpg c.jpg
Late to the party, but i had a similar issue. DJI drone had altitude reading offset by 50 meters. I used this python script to adjust the exif tag instead of re-flying the mission. Hope it can help other people.
-Edit. Provided additional script to adjust XMP header as well. Turns out Drone2Map will read XMP data instead of EXIF when xmp is available. However it should be run on Linux unless you want to compile exempi on windows. I used a Vbox image for this.
<SPAN class="comment token">## piexif, python3.7</SPAN> <SPAN class="keyword token">import</SPAN> glob <SPAN class="keyword token">import</SPAN> piexif <SPAN class="keyword token">from</SPAN> fractions <SPAN class="keyword token">import</SPAN> Fraction <SPAN class="keyword token">def</SPAN> <SPAN class="token function">to_deg</SPAN><SPAN class="punctuation token">(</SPAN>value<SPAN class="punctuation token">,</SPAN> loc<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">"""convert decimal coordinates into degrees, munutes and seconds tuple Keyword arguments: value is float gps-value, loc is direction list ["S", "N"] or ["W", "E"] return: tuple like (25, 13, 48.343 ,'N') """</SPAN> <SPAN class="keyword token">if</SPAN> value <SPAN class="operator token"><</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">:</SPAN> loc_value <SPAN class="operator token">=</SPAN> loc<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="keyword token">elif</SPAN> value <SPAN class="operator token">></SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">:</SPAN> loc_value <SPAN class="operator token">=</SPAN> loc<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN> loc_value <SPAN class="operator token">=</SPAN> <SPAN class="string token">""</SPAN> abs_value <SPAN class="operator token">=</SPAN> abs<SPAN class="punctuation token">(</SPAN>value<SPAN class="punctuation token">)</SPAN> deg <SPAN class="operator token">=</SPAN> int<SPAN class="punctuation token">(</SPAN>abs_value<SPAN class="punctuation token">)</SPAN> t1 <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">(</SPAN>abs_value<SPAN class="operator token">-</SPAN>deg<SPAN class="punctuation token">)</SPAN><SPAN class="operator token">*</SPAN><SPAN class="number token">60</SPAN> min <SPAN class="operator token">=</SPAN> int<SPAN class="punctuation token">(</SPAN>t1<SPAN class="punctuation token">)</SPAN> sec <SPAN class="operator token">=</SPAN> round<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>t1 <SPAN class="operator token">-</SPAN> min<SPAN class="punctuation token">)</SPAN><SPAN class="operator token">*</SPAN> <SPAN class="number token">60</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">5</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">return</SPAN> <SPAN class="punctuation token">(</SPAN>deg<SPAN class="punctuation token">,</SPAN> min<SPAN class="punctuation token">,</SPAN> sec<SPAN class="punctuation token">,</SPAN> loc_value<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">def</SPAN> <SPAN class="token function">change_to_rational</SPAN><SPAN class="punctuation token">(</SPAN>number<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">"""convert a number to rantional Keyword arguments: number return: tuple like (1, 2), (numerator, denominator) """</SPAN> f <SPAN class="operator token">=</SPAN> Fraction<SPAN class="punctuation token">(</SPAN>str<SPAN class="punctuation token">(</SPAN>round<SPAN class="punctuation token">(</SPAN>number<SPAN class="punctuation token">,</SPAN><SPAN class="number token">4</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">return</SPAN> <SPAN class="punctuation token">(</SPAN>f<SPAN class="punctuation token">.</SPAN>numerator<SPAN class="punctuation token">,</SPAN> f<SPAN class="punctuation token">.</SPAN>denominator<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">def</SPAN> <SPAN class="token function">change_to_decimal</SPAN><SPAN class="punctuation token">(</SPAN>fraction<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">"""convert fraction tuple to decimal keyword arguments: fraction -- tuple like (numerator, denominator) return: float"""</SPAN> <SPAN class="keyword token">return</SPAN> <SPAN class="punctuation token">(</SPAN>fraction<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="operator token">/</SPAN>fraction<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">def</SPAN> <SPAN class="token function">set_gps_location</SPAN><SPAN class="punctuation token">(</SPAN>file_name<SPAN class="punctuation token">,</SPAN> lat<SPAN class="punctuation token">,</SPAN> lng<SPAN class="punctuation token">,</SPAN> altitude<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="string token">"""Adds GPS position as EXIF metadata Keyword arguments: file_name -- image file lat -- latitude (as float) lng -- longitude (as float) altitude -- altitude (as float) """</SPAN> lat_deg <SPAN class="operator token">=</SPAN> to_deg<SPAN class="punctuation token">(</SPAN>lat<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">"S"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"N"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN> lng_deg <SPAN class="operator token">=</SPAN> to_deg<SPAN class="punctuation token">(</SPAN>lng<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">"W"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"E"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN> exiv_lat <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">(</SPAN>change_to_rational<SPAN class="punctuation token">(</SPAN>lat_deg<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> change_to_rational<SPAN class="punctuation token">(</SPAN>lat_deg<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> change_to_rational<SPAN class="punctuation token">(</SPAN>lat_deg<SPAN class="punctuation token">[</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> exiv_lng <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">(</SPAN>change_to_rational<SPAN class="punctuation token">(</SPAN>lng_deg<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> change_to_rational<SPAN class="punctuation token">(</SPAN>lng_deg<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> change_to_rational<SPAN class="punctuation token">(</SPAN>lng_deg<SPAN class="punctuation token">[</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> gps_ifd <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN> piexif<SPAN class="punctuation token">.</SPAN>GPSIFD<SPAN class="punctuation token">.</SPAN>GPSVersionID<SPAN class="punctuation token">:</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> piexif<SPAN class="punctuation token">.</SPAN>GPSIFD<SPAN class="punctuation token">.</SPAN>GPSAltitudeRef<SPAN class="punctuation token">:</SPAN> <SPAN class="number token">1</SPAN><SPAN class="punctuation token">,</SPAN> piexif<SPAN class="punctuation token">.</SPAN>GPSIFD<SPAN class="punctuation token">.</SPAN>GPSAltitude<SPAN class="punctuation token">:</SPAN> change_to_rational<SPAN class="punctuation token">(</SPAN>round<SPAN class="punctuation token">(</SPAN>altitude<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> piexif<SPAN class="punctuation token">.</SPAN>GPSIFD<SPAN class="punctuation token">.</SPAN>GPSLatitudeRef<SPAN class="punctuation token">:</SPAN> lat_deg<SPAN class="punctuation token">[</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> piexif<SPAN class="punctuation token">.</SPAN>GPSIFD<SPAN class="punctuation token">.</SPAN>GPSLatitude<SPAN class="punctuation token">:</SPAN> exiv_lat<SPAN class="punctuation token">,</SPAN> piexif<SPAN class="punctuation token">.</SPAN>GPSIFD<SPAN class="punctuation token">.</SPAN>GPSLongitudeRef<SPAN class="punctuation token">:</SPAN> lng_deg<SPAN class="punctuation token">[</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> piexif<SPAN class="punctuation token">.</SPAN>GPSIFD<SPAN class="punctuation token">.</SPAN>GPSLongitude<SPAN class="punctuation token">:</SPAN> exiv_lng<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">}</SPAN> exif_dict <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="string token">"GPS"</SPAN><SPAN class="punctuation token">:</SPAN> gps_ifd<SPAN class="punctuation token">}</SPAN> exif_bytes <SPAN class="operator token">=</SPAN> piexif<SPAN class="punctuation token">.</SPAN>dump<SPAN class="punctuation token">(</SPAN>exif_dict<SPAN class="punctuation token">)</SPAN> piexif<SPAN class="punctuation token">.</SPAN>insert<SPAN class="punctuation token">(</SPAN>exif_bytes<SPAN class="punctuation token">,</SPAN> file_name<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">def</SPAN> <SPAN class="token function">change_gps_altitude</SPAN><SPAN class="punctuation token">(</SPAN>file_name<SPAN class="punctuation token">,</SPAN> delta_altitude<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN> exif_dict <SPAN class="operator token">=</SPAN> piexif<SPAN class="punctuation token">.</SPAN>load<SPAN class="punctuation token">(</SPAN>file_name<SPAN class="punctuation token">)</SPAN> gps_altitude <SPAN class="operator token">=</SPAN> exif_dict<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'GPS'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN>piexif<SPAN class="punctuation token">.</SPAN>GPSIFD<SPAN class="punctuation token">.</SPAN>GPSAltitude<SPAN class="punctuation token">]</SPAN> gps_altitude <SPAN class="operator token">=</SPAN> change_to_rational<SPAN class="punctuation token">(</SPAN>change_to_decimal<SPAN class="punctuation token">(</SPAN>gps_altitude<SPAN class="punctuation token">)</SPAN><SPAN class="operator token">+</SPAN>delta_altitude<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"altitude: "</SPAN> <SPAN class="operator token">+</SPAN> str<SPAN class="punctuation token">(</SPAN>gps_altitude<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> exif_dict<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'GPS'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN>piexif<SPAN class="punctuation token">.</SPAN>GPSIFD<SPAN class="punctuation token">.</SPAN>GPSAltitude<SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> gps_altitude exif_bytes <SPAN class="operator token">=</SPAN> piexif<SPAN class="punctuation token">.</SPAN>dump<SPAN class="punctuation token">(</SPAN>exif_dict<SPAN class="punctuation token">)</SPAN> piexif<SPAN class="punctuation token">.</SPAN>insert<SPAN class="punctuation token">(</SPAN>exif_bytes<SPAN class="punctuation token">,</SPAN> file_name<SPAN class="punctuation token">)</SPAN> <SPAN class="comment token">##End Utility Functions </SPAN> delta_altitude <SPAN class="operator token">=</SPAN> <SPAN class="number token">47.97</SPAN> path <SPAN class="operator token">=</SPAN> <SPAN class="string token">"C:\\Users\\tli\\Pictures\\Drone2Map_Pilot\\"</SPAN> file_list <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>f <SPAN class="keyword token">for</SPAN> f <SPAN class="keyword token">in</SPAN> glob<SPAN class="punctuation token">.</SPAN>glob<SPAN class="punctuation token">(</SPAN>path <SPAN class="operator token">+</SPAN> <SPAN class="string token">"**/*.JPG"</SPAN><SPAN class="punctuation token">,</SPAN> recursive<SPAN class="operator token">=</SPAN><SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="keyword token">for</SPAN> file_name <SPAN class="keyword token">in</SPAN> file_list<SPAN class="punctuation token">:</SPAN> <SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Processing: "</SPAN> <SPAN class="operator token">+</SPAN> file_name<SPAN class="punctuation token">)</SPAN> change_gps_altitude<SPAN class="punctuation token">(</SPAN>file_name<SPAN class="punctuation token">,</SPAN> delta_altitude<SPAN class="punctuation token">)</SPAN> <SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
<SPAN class="comment token"># This script needs to run on linux due to dependencies on exempi library</SPAN> <SPAN class="comment token"># python-xmp-toolkit, python 3.6</SPAN> <SPAN class="keyword token">from</SPAN> libxmp <SPAN class="keyword token">import</SPAN> XMPFiles<SPAN class="punctuation token">,</SPAN> consts <SPAN class="keyword token">import</SPAN> glob <SPAN class="keyword token">def</SPAN> <SPAN class="token function">change_xmp_altitude</SPAN><SPAN class="punctuation token">(</SPAN>file_name<SPAN class="punctuation token">,</SPAN> delta_altitude<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN> xmpfile <SPAN class="operator token">=</SPAN> XMPFiles<SPAN class="punctuation token">(</SPAN>file_path<SPAN class="operator token">=</SPAN>file_name<SPAN class="punctuation token">,</SPAN> open_forupdate<SPAN class="operator token">=</SPAN><SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">)</SPAN> xmp <SPAN class="operator token">=</SPAN> xmpfile<SPAN class="punctuation token">.</SPAN>get_xmp<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="comment token"># list the uri for prefix drone-dji</SPAN> <SPAN class="comment token"># xmp_sub = xmp.get_namespace_for_prefix("drone-dji")</SPAN> dji_uri <SPAN class="operator token">=</SPAN> <SPAN class="string token">"http://www.dji.com/drone-dji/1.0/"</SPAN> xmp_absalt <SPAN class="operator token">=</SPAN> xmp<SPAN class="punctuation token">.</SPAN>get_property<SPAN class="punctuation token">(</SPAN>dji_uri<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"AbsoluteAltitude"</SPAN><SPAN class="punctuation token">)</SPAN> str_translation <SPAN class="operator token">=</SPAN> dict<SPAN class="punctuation token">.</SPAN>fromkeys<SPAN class="punctuation token">(</SPAN>map<SPAN class="punctuation token">(</SPAN>ord<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'+'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> None<SPAN class="punctuation token">)</SPAN> xmp_absalt <SPAN class="operator token">=</SPAN> xmp_absalt<SPAN class="punctuation token">.</SPAN>translate<SPAN class="punctuation token">(</SPAN>str_translation<SPAN class="punctuation token">)</SPAN> xmp_absalt <SPAN class="operator token">=</SPAN> <SPAN class="string token">"+"</SPAN> <SPAN class="operator token">+</SPAN> str<SPAN class="punctuation token">(</SPAN>round<SPAN class="punctuation token">(</SPAN>float<SPAN class="punctuation token">(</SPAN>xmp_absalt<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">+</SPAN> delta_altitude<SPAN class="punctuation token">,</SPAN> <SPAN class="number token">2</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> xmp<SPAN class="punctuation token">.</SPAN>set_property<SPAN class="punctuation token">(</SPAN>dji_uri<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"AbsoluteAltitude"</SPAN><SPAN class="punctuation token">,</SPAN> xmp_absalt<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">if</SPAN> xmpfile<SPAN class="punctuation token">.</SPAN>can_put_xmp<SPAN class="punctuation token">(</SPAN>xmp<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN> xmpfile<SPAN class="punctuation token">.</SPAN>put_xmp<SPAN class="punctuation token">(</SPAN>xmp<SPAN class="punctuation token">)</SPAN> xmpfile<SPAN class="punctuation token">.</SPAN>close_file<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN>xmp_absalt<SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"New XMP Altitude Entered for: "</SPAN><SPAN class="punctuation token">,</SPAN> file_name<SPAN class="punctuation token">)</SPAN> delta_altitude <SPAN class="operator token">=</SPAN> <SPAN class="number token">47.97</SPAN> path <SPAN class="operator token">=</SPAN> <SPAN class="string token">"/home/tli/COG/Drone2MapTest"</SPAN> file_list <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>f <SPAN class="keyword token">for</SPAN> f <SPAN class="keyword token">in</SPAN> glob<SPAN class="punctuation token">.</SPAN>glob<SPAN class="punctuation token">(</SPAN>path <SPAN class="operator token">+</SPAN> <SPAN class="string token">"**/*.JPG"</SPAN><SPAN class="punctuation token">,</SPAN> recursive<SPAN class="operator token">=</SPAN><SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="keyword token">for</SPAN> file_name <SPAN class="keyword token">in</SPAN> file_list<SPAN class="punctuation token">:</SPAN> <SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Processing: "</SPAN> <SPAN class="operator token">+</SPAN> file_name<SPAN class="punctuation token">)</SPAN> change_xmp_altitude<SPAN class="punctuation token">(</SPAN>file_name<SPAN class="punctuation token">,</SPAN> delta_altitude<SPAN class="punctuation token">)</SPAN> <SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
サインインしたメンバーは投稿、更新のフォローなどができます。初めてですか?無料アカウントを登録してください。
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.