【Python&GIS】根据像素坐标计算图片某点的地理/投影坐标
又是掉头发的一天,今天的任务是通过图片中心点的地理坐标以及图片中某点的像素坐标(即这个点位于图片中的x,y坐标)计算该点的地理/投影坐标。经过一整天的搜索,发现网上并没有这方面的教程。然后就是想啊想,头发一抓一大把,终于在网上零零散散的教程以及不断摸索中解决了这个问题。
大致思路就是,先获取图片相对真北方向的偏转角以及该点和图片中心的连线与图片的正北方向夹角;然后将图片中心点的地理坐标转换为投影坐标(如果这一步没有中心点的地理坐标,那么你就不用继续往下看了);最后就是通过图片分辨率计算点到中心的实际距离,再通过夹角和中心点的投影坐标加加减减即可。话虽这么说,但实施起来真心不简单啊!!!
一、准备工作
1.获取图片中心点的经纬度坐标/投影坐标(必须)
如果只有一张图片的话,你完全可以右键图片,查看其属性,里面就有经纬度坐标。同时也可以使用Python实现,之前分享过【Python&GIS】判断图片中心点/经纬度点是否在某个面内,所以这里就不解释了,直接上代码。
def Get_LatLon(path_image):
"""
:param path_image: 输入图片路径
:return: 返回中心点经纬度
"""
# 获取图片的经纬度信息
f = open(path_image, 'rb')
contents = exifread.process_file(f)
longitude = contents["GPS GPSLongitude"].values
longitude_f = longitude[0].num/longitude[0].den + (longitude[1].num/longitude[1].den/60) + (longitude[2].num/longitude[2].den/3600)
latitude = contents["GPS GPSLatitude"].values
latitude_f = latitude[0].num/latitude[0].den + (latitude[1].num/latitude[1].den/60) + (latitude[2].num/latitude[2].den/3600)
f.close()
return longitude_f, latitude_f
2.获取图片与真北方向的偏转角(非必须)
如果你的图片并不是无人机拍的,或者拍摄时图片与真北方向并无夹角,那么就不需要这一步。这一步主要就是矫正相机拍摄时的偏转,每种无人机的参数名可能不一样,所以需要自行修改。
下面的代码也可以获取图片中心点的经纬度,但我之前以及用过第一步的代码了,所以就继续使用第一步的了,你们可以自己简化。
def Get_Image_Yaw_angle(file_path):
"""
:param file_path: 输入图片路径
:return: 图片的偏航角
"""
# 获取图片偏航角
b = b"\x3c\x2f\x72\x64\x66\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e"
a = b"\x3c\x72\x64\x66\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20"
img = open(file_path, 'rb')
data = bytearray()
dj_data_dict = {}
flag = False
for line in img.readlines():
if a in line:
flag = True
if flag:
data += line
if b in line:
break
if len(data) > 0:
data = str(data.decode('ascii'))
lines = list(filter(lambda x: 'drone-dji:' in x, data.split("\n")))
for d in lines:
d = d.strip()[10:]
key, value = d.split("=")
dj_data_dict[key] = value
# print("Image_yaw",dj_data_dict["FlightYawDegree"][1:-1])
return float(dj_data_dict["FlightYawDegree"][1:-1])
3.获取图片目标点与中心点的连线和图片正北方向的夹角(必须)
通俗来说,就是该点与图片正上方的夹角,同样这步也是用来矫正偏转的,获取该角度后,即可得到该点在投影坐标系中与真北方向的夹角。
def Yaw_angle_calculation(x, y, x_Center, y_Center):
"""
:param x: 输入图片目标点的栅格坐标x
:param y: 输入图片目标点的栅格坐标y
:return: 目标点相对于中心点的偏转角度
"""
# 获取目标的偏转角
if x == x_Center and y == y_Center:
Yaw_angle = 0
elif x == x_Center and y != y_Center:
if y > y_Center:
Yaw_angle = 180
elif y < 1500:
Yaw_angle = 0
elif x != x_Center and y == y_Center:
if x >x_Center:
Yaw_angle = 90
elif x < x_Center:
Yaw_angle = 270
else:
if x > x_Center:
if y < y_Center:
Yaw_angle = math.degrees(math.atan((x - x_Center) / (y_Center - y)))
else:
Yaw_angle = 180 - math.degrees(math.atan((x - x_Center) / (y - y_Center)))
else:
if y < y_Center:
Yaw_angle = 360 - math.degrees(math.atan((x_Center - x) / (y_Center - y)))
else:
Yaw_angle = 180 + math.degrees(math.atan((x_Center - x) / (y - y_Center)))
# print("Yaw_angle",Yaw_angle)
return Yaw_angle
4.将图片中心点的地理坐标转为投影坐标(必须)
一般来说图片的中心点都是GPS坐标,即WGS84地理坐标系的经纬度。但当我们计算距离时,需要使用到投影坐标系,所以这里需要将其转换一下。我这里是WGS84地理坐标系转为UTM 51N投影坐标系,你们视情况修改。
def LonLat_Meter(lat, lon):
"""
:param lat: 输入WGS84经度
:param lon: 输入WGS84纬度
:return: 返回WGS84/UTM 51N的x,y
"""
source = osr.SpatialReference()
# 初始化osr.SpatialReference对象以形成一个合法的坐标系统
source.ImportFromEPSG(4326)
# 向对象中写入Source_EPSG坐标系统
target = osr.SpatialReference()
target.ImportFromEPSG(32651)
# 这里是用内置的EPSG对应的坐标系作为转换参数
transform = osr.CoordinateTransformation(source, target)
point = ogr.CreateGeometryFromWkt("POINT (%s %s)" % (lat, lon))
# 报错的话,将经纬度翻过来
point.Transform(transform)
# print(point.GetX(), point.GetY())
return point.GetX(), point.GetY()
二、转换函数
1.前期工作完成后,就可以实现转换了(必须!)
这里输入参数为图片偏转角、目标点的像素坐标(栅格坐标)、中心点的像素坐标、栅格分辨率(空间分辨率)、中心点的投影坐标。
def Target_Meter(Image_Yaw_angle, x, y, x_Center, y_Center, ratio, meter_X, meter_Y):
"""
:param Image_Yaw_angle: 输入图片的偏航角
:param x: 输入图片目标点的栅格坐标x
:param y: 输入图片目标点的栅格坐标y
:param x_Center: 输入图片中心点的栅格坐标x
:param y_Center: 输入图片中心点的栅格坐标y
:param meter_X: 输入图片中心点的投影坐标x(UTM/WGS84 51N)
:param meter_Y: 输入图片中心点的投影坐标y(UTM/WGS84 51N)
:return: 目标点的投影坐标x,y
"""
if Image_Yaw_angle < 0:
Image_Yaw_angle = 360 +Image_Yaw_angle
Yaw_angle = Yaw_angle_calculation(x, y, x_Center, y_Center)
sum_angle = Image_Yaw_angle + Yaw_angle
if sum_angle >= 360:
sum_angle = sum_angle -360
if sum_angle == 0:
meter_x = meter_X
meter_y = meter_Y - (y_Center-y)*ratio
elif sum_angle == 90:
meter_x = meter_X + (x-x_Center)*ratio
meter_y = meter_Y
elif sum_angle == 180:
meter_x = meter_X
meter_y = meter_Y + (y-y_Center)*ratio
elif sum_angle == 270:
meter_x = meter_X - (x_Center-x)*ratio
meter_y = meter_Y
elif sum_angle == 360:
meter_x = meter_X
meter_y = meter_Y - (x_Center-y)*ratio
elif 0 < sum_angle < 90:
meter_x = meter_X + math.sin(math.radians(sum_angle))*math.sqrt(math.pow(x-x_Center, 2)+math.pow(y-y_Center, 2))*ratio
meter_y = meter_Y + math.cos(math.radians(sum_angle))*math.sqrt(math.pow(x-x_Center, 2)+math.pow(y-y_Center, 2))*ratio
elif 90 < sum_angle < 180:
meter_x = meter_X + math.sin(math.radians(180-sum_angle)) * math.sqrt(math.pow(x - x_Center, 2) + math.pow(y -y_Center, 2))*ratio
meter_y = meter_Y - math.cos(math.radians(180-sum_angle)) * math.sqrt(math.pow(x - x_Center, 2) + math.pow(y -y_Center, 2))*ratio
elif 180 < sum_angle < 270:
meter_x = meter_X - math.sin(math.radians(sum_angle-180)) * math.sqrt(math.pow(x - x_Center, 2) + math.pow(y - y_Center, 2))*ratio
meter_y = meter_Y - math.cos(math.radians(sum_angle-180)) * math.sqrt(math.pow(x - x_Center, 2) + math.pow(y - y_Center, 2))*ratio
elif 270 < sum_angle < 360:
meter_x = meter_X - math.sin(math.radians(360-sum_angle)) * math.sqrt(math.pow(x - x_Center, 2) + math.pow(y - y_Center, 2))*ratio
meter_y = meter_Y + math.cos(math.radians(360-sum_angle)) * math.sqrt(math.pow(x - x_Center, 2) + math.pow(y - y_Center, 2))*ratio
return meter_x, meter_y
2.将目标点的投影坐标转为地理坐标(非必须)
我这里因为项目最后需要的是经纬度坐标,所以在计算得到目标点的投影坐标后,还需要转换一下。你们视情况而定,如果你们只要投影坐标,那么第5步输出的就已经是投影坐标啦。
def Meter_LonLat(x, y):
"""
:param x: 输入WGS84/UTM 51N的x
:param y: 输入WGS84/UTM 51N的y
:return: 返回WGS84的经纬度
"""
source = osr.SpatialReference()
# 初始化osr.SpatialReference对象以形成一个合法的坐标系统
source.ImportFromEPSG(32651)
# 向对象中写入Source_EPSG坐标系统
target = osr.SpatialReference()
target.ImportFromEPSG(4326)
# 这里是用内置的EPSG对应的坐标系作为转换参数
transform = osr.CoordinateTransformation(source, target)
point = ogr.CreateGeometryFromWkt("POINT (%s %s)" % (x, y))
# 报错的话,将经纬度翻过来
point.Transform(transform)
# print(point.GetX(), point.GetY())
return point.GetX(), point.GetY()
三、完整代码
# -*- coding: utf-8 -*-
"""
@Time : 2023/1/5 17:45
@Auth : RS迷途小书童
@File :Picture coordinate system to geographic coordinate.py
@IDE :PyCharm
@Purpose :图片某点的像素坐标转为地理坐标系
"""
import math
import exifread
from osgeo import ogr, osr
def Get_LatLon(path_image):
"""
:param path_image: 输入图片路径
:return: 返回中心点经纬度
"""
# 获取图片的经纬度信息
f = open(path_image, 'rb')
contents = exifread.process_file(f)
longitude = contents["GPS GPSLongitude"].values
longitude_f = longitude[0].num/longitude[0].den + (longitude[1].num/longitude[1].den/60) + (longitude[2].num/longitude[2].den/3600)
latitude = contents["GPS GPSLatitude"].values
latitude_f = latitude[0].num/latitude[0].den + (latitude[1].num/latitude[1].den/60) + (latitude[2].num/latitude[2].den/3600)
f.close()
return longitude_f, latitude_f
def LonLat_Meter(lat, lon):
"""
:param lat: 输入WGS84经度
:param lon: 输入WGS84纬度
:return: 返回WGS84/UTM 51N的x,y
"""
source = osr.SpatialReference()
# 初始化osr.SpatialReference对象以形成一个合法的坐标系统
source.ImportFromEPSG(4326)
# 向对象中写入Source_EPSG坐标系统
target = osr.SpatialReference()
target.ImportFromEPSG(32651)
# 这里是用内置的EPSG对应的坐标系作为转换参数
transform = osr.CoordinateTransformation(source, target)
point = ogr.CreateGeometryFromWkt("POINT (%s %s)" % (lat, lon))
# 报错的话,将经纬度翻过来
point.Transform(transform)
# print(point.GetX(), point.GetY())
return point.GetX(), point.GetY()
def Meter_LonLat(x, y):
"""
:param x: 输入WGS84/UTM 51N的x
:param y: 输入WGS84/UTM 51N的y
:return: 返回WGS84的经纬度
"""
source = osr.SpatialReference()
# 初始化osr.SpatialReference对象以形成一个合法的坐标系统
source.ImportFromEPSG(32651)
# 向对象中写入Source_EPSG坐标系统
target = osr.SpatialReference()
target.ImportFromEPSG(4326)
# 这里是用内置的EPSG对应的坐标系作为转换参数
transform = osr.CoordinateTransformation(source, target)
point = ogr.CreateGeometryFromWkt("POINT (%s %s)" % (x, y))
# 报错的话,将经纬度翻过来
point.Transform(transform)
# print(point.GetX(), point.GetY())
return point.GetX(), point.GetY()
def Get_Image_Yaw_angle(file_path):
"""
:param file_path: 输入图片路径
:return: 图片的偏航角
"""
# 获取图片偏航角
b = b"\x3c\x2f\x72\x64\x66\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x3e"
a = b"\x3c\x72\x64\x66\x3a\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6f\x6e\x20"
img = open(file_path, 'rb')
data = bytearray()
dj_data_dict = {}
flag = False
for line in img.readlines():
if a in line:
flag = True
if flag:
data += line
if b in line:
break
if len(data) > 0:
data = str(data.decode('ascii'))
lines = list(filter(lambda x: 'drone-dji:' in x, data.split("\n")))
for d in lines:
d = d.strip()[10:]
key, value = d.split("=")
dj_data_dict[key] = value
# print("Image_yaw",dj_data_dict["FlightYawDegree"][1:-1])
return float(dj_data_dict["FlightYawDegree"][1:-1])
def Yaw_angle_calculation(x, y, x_Center, y_Center):
"""
:param x: 输入图片目标点的栅格坐标x
:param y: 输入图片目标点的栅格坐标y
:return: 目标点相对于中心点的偏转角度
"""
# 获取目标的偏转角
if x == x_Center and y == y_Center:
Yaw_angle = 0
elif x == x_Center and y != y_Center:
if y > y_Center:
Yaw_angle = 180
elif y < 1500:
Yaw_angle = 0
elif x != x_Center and y == y_Center:
if x >x_Center:
Yaw_angle = 90
elif x < x_Center:
Yaw_angle = 270
else:
if x > x_Center:
if y < y_Center:
Yaw_angle = math.degrees(math.atan((x - x_Center) / (y_Center - y)))
else:
Yaw_angle = 180 - math.degrees(math.atan((x - x_Center) / (y - y_Center)))
else:
if y < y_Center:
Yaw_angle = 360 - math.degrees(math.atan((x_Center - x) / (y_Center - y)))
else:
Yaw_angle = 180 + math.degrees(math.atan((x_Center - x) / (y - y_Center)))
# print("Yaw_angle",Yaw_angle)
return Yaw_angle
def Target_Meter(Image_Yaw_angle, x, y, x_Center, y_Center, ratio, meter_X, meter_Y):
"""
:param Image_Yaw_angle: 输入图片的偏航角
:param x: 输入图片目标点的栅格坐标x
:param y: 输入图片目标点的栅格坐标y
:param x_Center: 输入图片中心点的栅格坐标x
:param y_Center: 输入图片中心点的栅格坐标y
:param meter_X: 输入图片中心点的投影坐标x(UTM/WGS84 51N)
:param meter_Y: 输入图片中心点的投影坐标y(UTM/WGS84 51N)
:return: 目标点的投影坐标x,y
"""
if Image_Yaw_angle < 0:
Image_Yaw_angle = 360 +Image_Yaw_angle
Yaw_angle = Yaw_angle_calculation(x, y, x_Center, y_Center)
sum_angle = Image_Yaw_angle + Yaw_angle
if sum_angle >= 360:
sum_angle = sum_angle -360
if sum_angle == 0:
meter_x = meter_X
meter_y = meter_Y - (y_Center-y)*ratio
elif sum_angle == 90:
meter_x = meter_X + (x-x_Center)*ratio
meter_y = meter_Y
elif sum_angle == 180:
meter_x = meter_X
meter_y = meter_Y + (y-y_Center)*ratio
elif sum_angle == 270:
meter_x = meter_X - (x_Center-x)*ratio
meter_y = meter_Y
elif sum_angle == 360:
meter_x = meter_X
meter_y = meter_Y - (x_Center-y)*ratio
elif 0 < sum_angle < 90:
meter_x = meter_X + math.sin(math.radians(sum_angle))*math.sqrt(math.pow(x-x_Center, 2)+math.pow(y-y_Center, 2))*ratio
meter_y = meter_Y + math.cos(math.radians(sum_angle))*math.sqrt(math.pow(x-x_Center, 2)+math.pow(y-y_Center, 2))*ratio
elif 90 < sum_angle < 180:
meter_x = meter_X + math.sin(math.radians(180-sum_angle)) * math.sqrt(math.pow(x - x_Center, 2) + math.pow(y -y_Center, 2))*ratio
meter_y = meter_Y - math.cos(math.radians(180-sum_angle)) * math.sqrt(math.pow(x - x_Center, 2) + math.pow(y -y_Center, 2))*ratio
elif 180 < sum_angle < 270:
meter_x = meter_X - math.sin(math.radians(sum_angle-180)) * math.sqrt(math.pow(x - x_Center, 2) + math.pow(y - y_Center, 2))*ratio
meter_y = meter_Y - math.cos(math.radians(sum_angle-180)) * math.sqrt(math.pow(x - x_Center, 2) + math.pow(y - y_Center, 2))*ratio
elif 270 < sum_angle < 360:
meter_x = meter_X - math.sin(math.radians(360-sum_angle)) * math.sqrt(math.pow(x - x_Center, 2) + math.pow(y - y_Center, 2))*ratio
meter_y = meter_Y + math.cos(math.radians(360-sum_angle)) * math.sqrt(math.pow(x - x_Center, 2) + math.pow(y - y_Center, 2))*ratio
return meter_x, meter_y
if __name__ == "__main__":
path = "G:/DJI_26_W.jpeg"
x = 1600
y = 2500
x_Center = 2000
y_Center = 1500
ratio = 0.046
longitude_f, latitude_f = Get_LatLon(path)
meter_X, meter_Y = LonLat_Meter(latitude_f, longitude_f)
Image_Yaw_angle = Get_Image_Yaw_angle(path)
# 获取图片的偏转角
meter_x, meter_y = Target_Meter(Image_Yaw_angle, x, y, x_Center, y_Center, ratio, meter_X, meter_Y)
lat_x, lon_y = Meter_LonLat(meter_x, meter_y)
print(longitude_f, latitude_f)
print(meter_X, meter_Y)
print(Image_Yaw_angle)
print(meter_x, meter_y)
print(lat_x, lon_y)
大家可以自己添加for、while循环实现多张图片或图片中多个目标物的坐标转换。博主这里是为了目标识别后的目标物真实坐标的计算,所以将循环部分内置到了其他程序。
本文章主要是分享个人在学习Python过程中写过的一些代码。有些部分参考了前人以及官网的教程,如有侵权请联系作者删除,大家有问题可以随时留言交流,博主会及时回复。
【Python&GIS】根据像素坐标计算图片某点的地理/投影坐标的更多相关文章
- 不同手机根据坐标计算控件、图片的像素,px 与 dp, sp换算公式?
参考该帖子:http://www.cnblogs.com/bluestorm/p/3640786.html PPI = Pixels per inch,每英寸上的像素数,即 "像素密度&qu ...
- (数据科学学习手札147)Python GIS利器shapely全新2.0版本一览
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,我写过很多篇介绍geopand ...
- 使用Python爬虫爬取网络美女图片
代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...
- 20190710记录:去掉中转图,直接以1280*1024进行反坐标计算,填补pbFinal。
1.记录:去掉中转图,直接以1280*1024进行反坐标计算.pbFinal=1280*1024. // Imagejoint.cpp : 定义控制台应用程序的入口点. // #include &qu ...
- 使用Python的PIL模块来进行图片对比
使用Python的PIL模块来进行图片对比 在使用google或者baidu搜图的时候会发现有一个图片颜色选项,感觉非常有意思,有人可能会想这肯定是人为的去划分的,呵呵,有这种可能,但是估计人会累死, ...
- iOS开发UI篇—九宫格坐标计算
iOS开发UI篇—九宫格坐标计算 一.要求 完成下面的布局 二.分析 寻找左边的规律,每一个uiview的x坐标和y坐标. 三.实现思路 (1)明确每一块用得是什么view (2)明确每个view之间 ...
- python爬取某个网页的图片-如百度贴吧
python爬取某个网页的图片-如百度贴吧 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用告诉我 #coding:utf-8 import urllib imp ...
- 测试开发Python培训:实现屌丝的图片收藏愿望(小插曲)
测试开发Python培训:实现屌丝的图片收藏愿望(小插曲) 男学员在学习python的自动化过程中对于爬虫很感兴趣,有些学员就想能收藏一些图片,供自己欣赏.作为讲师只能是满足愿望,帮助大家实现对美的追 ...
- 在使用document.getElementById('xxx').files[0]时,关于计算图片大小
在使用文件上传属性时,一直好奇图片上传的大小时如何计算的,最近在使用中认识到的计算方式: 首先,图片大小的存储基本单位是字节(byte).每个字节是由8个比特(bit)组成.所以,一个字节在十进制中 ...
- java 根据经纬度坐标计算两点的距离算法
/** * @Desc 根据经纬度坐标计算两点的距离算法<br> * @Author yangzhenlong <br> * @Data 2018/5/9 18:38 */ p ...
随机推荐
- 传参base64时的+号变空格问题
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明. 问题发生 上上周,看到一位老哥找我们组同事联调接口,不知道是什么问题,两人坐一起搞了快1个小时,看起来好像有点复 ...
- DevOps 在未来将如何演进?丨行业观察
自2007年 DevOps 这一概念推出以来,越来越多企业开始将开发和运维团队结合在一起,以加快部署速度,提高软件开发生命周期的效率和协作.但是,诸多因素都会对 DevOps 是否成功产生影响,例如组 ...
- offsetX与offsetLeft
offsetX:鼠标指针距离当前绑定元素左侧距离,他并不是相对于带有定位的父盒子的x,y坐标, 记住了,很多博客都解释错了 offsetLeft,offsetTop 相对于最近的祖先定位元素.
- 鸿蒙开发学习笔记-UIAbility-Router页面跳转接口源码分析
在鸿蒙开发中,UIAbility的跳转使用 router 方法. 在使用的时候需导入 import router from '@ohos.router'; 该方法接口成员如下: 1.interface ...
- odoo 开发入门教程系列-准备一些操作(Action)?
准备一些操作(Action)? 到目前为止,我们主要通过声明字段和视图来构建模块.在任何真实的业务场景中,我们都希望将一些业务逻辑链接到操作按钮.在我们的房地产示例中,我们希望能够: 取消或将房产设置 ...
- 二进制安装Kubernetes(k8s) v1.26.1 IPv4/IPv6双栈 可脱离互联网
二进制安装Kubernetes(k8s) v1.26.1 IPv4/IPv6双栈 可脱离互联网 https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star ...
- k8s 1.24 1.25 集群使用docker作为容器
Kubernetes 1.24 1.25 集群使用docker作为容器 背景 在新版本Kubernetes环境(1.24以及以上版本)下官方不在支持docker作为容器运行时了,若要继续使用docke ...
- MySQL MHA信息的收集【Filebeat+logstash+MySQL】
一.项目背景 随着集团MHA集群的日渐增长,MHA管理平台话越来越迫切.而MHA平台的建设第一步就是将这些成百上千套的MHA集群信息收集起来,便于查询和管理. MHA主要信息如下: (1)基础配置信息 ...
- DRF的限流组件(源码分析)
DRF限流组件(源码分析) 限流,限制用户访问频率,例如:用户1分钟最多访问100次 或者 短信验证码一天每天可以发送50次, 防止盗刷. 对于匿名用户,使用用户IP作为唯一标识. 对于登录用户,使用 ...
- UE中根据场景模型,导出缩略图
在实际使用中,我们有了很多模型,但是有时候我们需要这些模型对应的缩略图,比如我有很多物品,我想弄个仓库,有2种方式,要么,弄个仓库场景,一个物体一个格子摆放第二种,就是为每个物体制作一个缩略图 如果一 ...