如何通过网络发送大量的(x,y)坐标?

3

我正在制作一款需要线性图的Android应用程序,因此我需要从服务器获取(x,y)坐标。

我们使用Ruby on Rails和Heroku构建后端(尽管我们也在考虑Google AppEngine)。

如何以最佳方式将数百个(x,y)坐标(编码为JSON?)发送到Android设备上?


如果只有一行,你只需要两个坐标(x,y),对吧? - calebds
1
Stack Overflow不是你的个人研究助手。 - Brian Roach
1
这是一条折线图,因此可能会有数百个点。就像这样http://www.mathgoodies.com/lessons/graphs/images/line_example1.jpg - BinRoot
“以 JSON 编码?”为什么不呢?JSON 传输时非常高效,并且具有良好的解析/生成支持。最有效的方法是创建一个二进制流(交替 x,y)。这也很容易“解析”。 - zapl
我认为最好的方法是使用没有空格、制表符等的JSON或XML,以获得更小的大小。但Brian Roach是正确的。 - Guillaume
4个回答

6

如果你非常关注带宽,可以将坐标打包成二进制格式。例如,假设一个二维网格的 (x,y) 坐标为 32 位整数。使用 Ruby:

points = [[107897,598654], [876432,30001], [15,754689]]
# => [[107897, 598654], [876432, 30001], [15, 754689]]

# json size
points.to_json.length
# => 44

# make a byte stream of points
data = points.flatten.pack("V*")
# => "y\xA5\x01\x00~\"\t\x00\x90_\r\x001u\x00\x00\x0F\x00\x00\x00\x01\x84\v\x00"

# binary size
data.length
# => 24

# read a byte stream to points
points = data.unpack("V*").each_slice(2).to_a
# => [[107897, 598654], [876432, 30001], [15, 754689]] 

1
如果您的整数始终适合16位,请使用更小的打包格式。显然,每个32位整数将占用4个字节的空间,即使在其小于1000的情况下,它在ASCII中占用的空间也较少。 - d11wtq
1
请注意,在编码之前,您还可以自省值,以选择适当的打包格式。问题在于如何解包字节。一种基本的方法是向流添加一个1字节的头,它将表示一个枚举,比如0=8位,1=16位,2=24位,3=32位。一旦读取了该字节,就相应地解包剩余的字符串。 - d11wtq

1

由于您正在生成折线图,您可能想从Google Chart服务的简单和扩展text encodings中获得灵感。主要的收获是您不需要传输实际值;只需传输它们的相对值和限制即可。


0
我没有 Ruby 经验,但你可以通过 XML 将坐标按顺序分隔成新行发送(也许类似于:<coordinate use='errorbar'>1,2</coordinate>),在你的 Ruby 脚本中每个坐标都用新行分隔,并使用以下代码在 Android 上下载结果:
public static String[] download(String web_url) throws IOException{
    URL website = new URL(web_url);
    BufferedReader in = new BufferedReader(
              new InputStreamReader(
              website.openStream()));
    String input;
    ArrayList<String> stringList = new ArrayList<String>();
    while ((input = in.readLine()) != null) {
        stringList.add(input);
    }
    String[] itemArray = new String[stringList.size()];
    String[] returnedArray = stringList.toArray(itemArray);
    return returnedArray;
}
// Of course, call this function with web_url as the URL to your script

这将为您提供XML输出,每行作为数组中的一个条目,然后您只需解析XML即可。如果您确定永远不需要额外的数据,您可以只发送纯文本,无需解析XML。


0

最好的方法可能是使用 JSONXML 进行编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接