জিডিএল ব্যবহার করে নির্দিষ্ট অক্ষাংশ / দ্রাঘিমাংশের অবস্থানগুলি সহ চিত্র তৈরি করছেন?


9

অক্ষাংশ, দ্রাঘিমাংশ এবং ডেটা_ওয়াল সহ আমার নীচের ফর্ম্যাটটিতে একটি ASCII ফাইল রয়েছে।

35-13.643782N, 080-57.190157W, 118.6
...

আমার একটি জিওটিফ ইমেজ ফাইল রয়েছে এবং আমি এটি সহজেই দেখতে পারি।

আমি ASCII ফাইলটিতে সুনির্দিষ্ট অক্ষাংশ / দ্রাঘিমাংশ অবস্থানে চিত্রটিতে একটি "পিন" (বিন্দু / পতাকা / তারা বা যা সহজতম কিছু হতে পারে) রাখতে চাই।

আমি এখন পর্যন্ত যা করতে পেরেছি তা এখানে:

আমার উত্স চিত্রটি দেখতে এমন দেখাচ্ছে:

Driver: GTiff/GeoTIFF
Files: /tmp/Charlotte SEC 100.tif
Size is 16867, 12358
Coordinate System is:
PROJCS["Lambert Conformal Conic",
    GEOGCS["NAD83",
        DATUM["North_American_Datum_1983",
            SPHEROID["GRS 1980",6378137,298.2572221010042,
                AUTHORITY["EPSG","7019"]],
            AUTHORITY["EPSG","6269"]],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433],
        AUTHORITY["EPSG","4269"]],
    PROJECTION["Lambert_Conformal_Conic_2SP"],
    PARAMETER["standard_parallel_1",38.66666666666666],
    PARAMETER["standard_parallel_2",33.33333333333334],
    PARAMETER["latitude_of_origin",34.11666666666667],
    PARAMETER["central_meridian",-78.75],
    PARAMETER["false_easting",0],
    PARAMETER["false_northing",0],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]]]
Origin = (-365041.822331817995291,240536.419747152860509)
Pixel Size = (42.334586069440391,-42.334898968590878)
Metadata:
  AREA_OR_POINT=Area
  TIFFTAG_DATETIME=2016:06:24 12:46:45
  TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
  TIFFTAG_SOFTWARE=Adobe Photoshop CS5 Windows
  TIFFTAG_XRESOLUTION=300
  TIFFTAG_YRESOLUTION=300
Image Structure Metadata:
  COMPRESSION=LZW
  INTERLEAVE=BAND
Corner Coordinates:
Upper Left  ( -365041.822,  240536.420) ( 82d48'55.43"W, 36d13' 4.92"N)
Lower Left  ( -365041.822, -282638.262) ( 82d35'10.11"W, 31d30'17.00"N)
Upper Right (  349015.641,  240536.420) ( 74d51'46.40"W, 36d13'26.16"N)
Lower Right (  349015.641, -282638.262) ( 75d 4'55.60"W, 31d30'36.99"N)
Center      (   -8013.091,  -21050.921) ( 78d50'12.11"W, 33d55'36.35"N)
Band 1 Block=16867x1 Type=Byte, ColorInterp=Palette
  Color Table (RGB with 256 entries)
    0: 255,255,255,255
...

পাইথনে আমি একসাথে আবদ্ধ হওয়ার ব্যবস্থা করেছি:

from osgeo import gdal, osr

src_filename = '/tmp/Charlotte SEC 100.tif'
dst_filename = '/tmp/foo.tiff'

# Opens source dataset
src_ds = gdal.Open(src_filename)
format = "GTiff"
driver = gdal.GetDriverByName(format)

# Open destination dataset
dst_ds = driver.CreateCopy(dst_filename, src_ds, 0)

# Specify raster location through geotransform array
# (upperleftx, scalex, skewx, upperlefty, skewy, scaley)
# Scale = size of one pixel in units of raster projection
# this example below assumes 100x100
gt = [-365041.822, 100, 0, 240536.420, 0, -100]

# Set location
dst_ds.SetGeoTransform(gt)

# Get raster projection
epsg = 4269            # http://spatialreference.org/ref/sr-org/lambert_conformal_conic_2sp/
srs = osr.SpatialReference()
srs.ImportFromEPSG(epsg)
dest_wkt = srs.ExportToWkt()

# Set projection
dst_ds.SetProjection(dest_wkt)

# Close files
dst_ds = None
src_ds = None

তবে, আমি কীভাবে "লাল বিন্দু" স্থাপন করতে পারি তা বেশ বুঝতে পারি না 35-13.643782N, 080-57.190157W এ

আমি এখানে কিছু নতুন বিশদ শিখছি (জিআইএস সম্পর্কিত নাম)।


আপনার যে বিষয়টির তদন্তের প্রয়োজন হতে পারে তা হ'ল জিওরফেরেন্সিং।
পলিজিও

ধন্যবাদ .. আমি জিওরফারেন্সিং শব্দটি ব্যবহার করে কিছু গুগল অনুসন্ধান করেছি। এটা সহায়ক ছিল। অর্ধেক যুদ্ধটি কী প্রযুক্তিগত পদগুলি ব্যবহার করবেন তা জেনে চলেছে ..
ব্র্যাড ওয়াকার

আমি নিশ্চিত যে আমি কিছু অনুপস্থিত, তবে আপনি কি কেএমএল বা অন্য কিছুতে ডেটা রূপান্তর করার বিষয়টি বিবেচনা করেছেন?
ব্যারিকার্টার

1
আপনার ডিডি-এমএম.এমএমএমএমএইচ স্থানাঙ্ককে দশমিক ডিগ্রীতে রূপান্তর করতে হতে পারে। আপনাকে গোলার্ধের তথ্যের পার্স করা দরকার ডাব্লু বা এস এর অর্থ একটি নেতিবাচক মান (এটি শেষ পদক্ষেপ হিসাবে করুন)। মিনিটগুলি 60 দ্বারা বিভক্ত করা উচিত এবং ডিগ্রি অংশের সাথে যুক্ত বা সংযুক্ত হওয়া দরকার।
মাকনেডি

উত্তর:


7

আপনার gdalinfoআউটপুটটি দেখায় যে রঙের টেবিলের সাথে আপনার একক ব্যান্ড জিওটিআইএফএফ রয়েছে (একে একে প্যালেট)। আমি সেই রঙের টেবিলের মানগুলি দেখতে পাচ্ছি না তাই নীচের কমান্ডগুলি একক ব্যান্ড + রঙ টেবিলটিকে তিনটি ব্যান্ড আরজিবি জিওটিআইএফএফতে রূপান্তর করে। কমান্ডগুলিও আপনার ASCII ফাইলটির একটি শিরোনাম সারি রয়েছে এবং দশমিক ডিগ্রীতে সমন্বয় রয়েছে, এটি যদি না হয় তবে আপনার ফাইলটি পরিবর্তন করতে হবে।

ইনপুট:

$ cat testlonlat.csv
LON,LAT
143.798425,-15.551485
143.827437,-15.535119
143.84561,-15.530017
143.859107,-15.54819
143.812347,-15.523641
143.853581,-15.534694
143.883337,-15.537669
143.885356,-15.561687
143.887694,-15.588468

$ gdalinfo testutm.tif
Driver: GTiff/GeoTIFF
Files: testutm.tif
Size is 1102, 959
Coordinate System is:
PROJCS["WGS 84 / UTM zone 54S",
    GEOGCS["WGS 84",
        DATUM["WGS_1984",
            SPHEROID["WGS 84",6378137,298.257223563,
                AUTHORITY["EPSG","7030"]],
            AUTHORITY["EPSG","6326"]],
        PRIMEM["Greenwich",0,
            AUTHORITY["EPSG","8901"]],
        UNIT["degree",0.0174532925199433,
            AUTHORITY["EPSG","9122"]],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",141],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",10000000],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]],
    AXIS["Easting",EAST],
    AXIS["Northing",NORTH],
    AUTHORITY["EPSG","32754"]]
Origin = (798741.168775000027381,8282084.855279999785125)
Pixel Size = (10.000000000000000,-10.000000000000000)
Metadata:
  AREA_OR_POINT=Area
Image Structure Metadata:
  INTERLEAVE=BAND
Corner Coordinates:
Upper Left  (  798741.169, 8282084.855) (143d47' 4.96"E, 15d31'16.22"S)
Lower Left  (  798741.169, 8272494.855) (143d47' 9.15"E, 15d36'27.98"S)
Upper Right (  809761.169, 8282084.855) (143d53'14.43"E, 15d31'11.47"S)
Lower Right (  809761.169, 8272494.855) (143d53'18.78"E, 15d36'23.20"S)
Center      (  804251.169, 8277289.855) (143d50'11.83"E, 15d33'49.74"S)
Band 1 Block=1102x7 Type=Byte, ColorInterp=Palette
  Color Table (RGB with 256 entries)
    0: 120,112,136,255
    1: 96,104,88,255
    ...
    254: 76,124,140,255
    255: 232,228,236,255

প্রসেস:

$ gdal_translate -expand rgb testutm.tif testutm_rgb.tif

$ ogr2ogr -f "GeoJSON" -dialect sqlite                      \
  -sql "select ST_buffer(Geometry,0.001) from testlonlat"   \
  -s_srs EPSG:4326 -t_srs EPSG:32754                        \
  /vsistdout/ CSV:testlonlat.csv -oo X_POSSIBLE_NAMES=Lon   \
  -oo Y_POSSIBLE_NAMES=Lat |  gdal_rasterize -b 1 -b 2 -b 3 \
  -burn 255 -burn 0 -burn 0 /vsistdin/ testutm_rgb.tif

শেষ আদেশটি নিম্নলিখিতটি করে:

  • লন / ল্যাটকে একটি বৃহত্তর বহুভুজের দিকে বাফার করে যাতে এটি আরও ভাল প্রদর্শিত হয় (আপনি যদি কেবল একটি পিক্সেল রঙিন লাল চান তবে আপনি এড়িয়ে যেতে পারেন)
  • WGS84 ল্যাট / লোন (EPSG: 4326) থেকে রাস্টার হিসাবে একই স্থানাঙ্ক ব্যবস্থায় রূপান্তর করে (EPSG: 32754 যা ডাব্লুজিএস 84 ইউটিএম জোন 54 এস, আপনার সিআরএস আলাদা হবে)
  • আউটপুট বহুভুজটি জিওজেসন হিসাবে স্টোডে লিখে এবং এতে পাইপ দেয় gdal_rasterize
  • আরজিবি রাস্টার ব্যান্ড 1, 2 এবং 3 তে আরজিবি 255,0,0 পোড়ায়

ফলাফল:

এখানে চিত্র বর্ণনা লিখুন


3

আপনি একটি ভাল শুরু আছে। gdal.CreateCopyজিওরফারেন্সিংয়ের যত্ন নেবে, তাই আপনাকে ভূ-ট্রান্সফর্ম এবং প্রক্ষেপণ ব্যবহার করে দ্বিতীয়বার সেট করতে হবে না।

সম্পূর্ণ প্রক্রিয়াটি লাস্ট / লেট কমর্ডগুলি রাস্টার স্থানিক রেফারেন্সের এক্সওয়াই স্থানাঙ্কে রূপান্তরিত করবে। তারপরে এই এক্সওয়াই কর্ডগুলি বিপরীত জিওট্রান্সফর্ম ব্যবহার করে রাস্টারগুলির সারি, কর সূচকগুলিতে রূপান্তরিত হবে। কিছু পিক্সেল মান সেই পজিশনে লেখা হবে।

from osgeo import gdal, osr
import numpy as np

src_filename = '/tmp/Charlotte SEC 100.tif'
dst_filename = '/tmp/foo.tiff'

# Opens source dataset
src_ds = gdal.Open(src_filename)
format = "GTiff"
driver = gdal.GetDriverByName(format)

# Open destination dataset
dst_ds = driver.CreateCopy(dst_filename, src_ds, 0)

# Get raster projection
epsg = 4269         # http://spatialreference.org/ref/sr-org/lambert_conformal_conic_2sp/
srs = osr.SpatialReference()
srs.ImportFromEPSG(epsg)

# Make WGS84 lon lat coordinate system
world_sr = osr.SpatialReference()
world_sr.SetWellKnownGeogCS('WGS84')

# Transform lon lats into XY
lonlat = [[0.,30.], [20., 30.], [25., 30.]]
coord_transform = osr.CoordinateTransformation(world_sr, srs)
newpoints = coord_transform.TransformPoints(lonlat) # list of XYZ tuples

# Make Inverse Geotransform  (try:except due to gdal version differences)
try:
    success, inverse_gt = gdal.InvGeoTransform(gt)
except:
    inverse_gt = gdal.InvGeoTransform(gt)

# [Note 1] Set pixel values
marker_array_r = np.array([[255]], dtype=np.uint8)
marker_array_g = np.array([[0]], dtype=np.uint8)
marker_array_b = np.array([[0]], dtype=np.uint8)
for x,y,z in newpoints:
    pix_x = int(inverse_gt[0] + inverse_gt[1] * x + inverse_gt[2] * y)
    pix_y = int(inverse_gt[3] + inverse_gt[4] * x + inverse_gt[5] * y)
    dst_ds.GetRasterBand(1).WriteArray(marker_array_r, pix_x, pix_y)
    dst_ds.GetRasterBand(2).WriteArray(marker_array_g, pix_x, pix_y)
    dst_ds.GetRasterBand(3).WriteArray(marker_array_b, pix_x, pix_y)

# Close files
dst_ds = None
src_ds = None

নোট 1:

কমান্ডটি gdal.RasterBand.WriteArray(array, xoff, yoff)উপরের বাম কোণ থেকে কাজ করে। এই উদাহরণে আমি মান 255 সঙ্গে একটি 1x1 অ্যারের সরবরাহ করে, তাই xoffএবং yoffপ্রকৃত সারি, Lon / Lat পদের জন্য কর্নেল সূচকের হয়। আপনি যদি 3x3 স্কোয়ার লিখতে চান তবে আপনাকে সামঞ্জস্য করতে হবে xoffএবং yoff1 টি বিয়োগের মাধ্যমে আপনাকে এও নিশ্চিত করতে হবে যে অ্যারে ডেটাটাইপটি রাস্টারগুলির সাথে মেলে। আপনি বলেছিলেন যে আপনি একটি "লাল বিন্দু" চান, তাই আমি ধরে নিচ্ছি যে তিনটি ব্যান্ড ইউিন্ট 8 রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.