Class HilbertEncoder

 1 /*
 2  * Copyright (c) 2019 Martin Davis.
 3  *
 4  * All rights reserved. This program and the accompanying materials
 5  * are made available under the terms of the Eclipse Public License 2.0
 6  * and Eclipse Distribution License v. 1.0 which accompanies this distribution.
 7  * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v20.html
 8  * and the Eclipse Distribution License is available at
 9  *
10  * http://www.eclipse.org/org/documents/edl-v10.php.
11  */
12 package org.locationtech.jts.index.hprtree;
13  
14 import org.locationtech.jts.geom.Envelope;
15 import org.locationtech.jts.shape.fractal.HilbertCode;
16  
17 public class HilbertEncoder {
18   private int level;
19   private double minx;
20   private double miny;
21   private double strideX;
22   private double strideY;
23  
24   public HilbertEncoder(int level, Envelope extent) {
25     this.level = level;
26     int hside = (int) Math.pow(2, level) - 1;
27     
28     minx = extent.getMinX();
29     double extentX = extent.getWidth();
30     strideX = extentX / hside;
31     
32     miny = extent.getMinX();
33     double extentY = extent.getHeight();
34     strideY = extentY / hside;
35   }
36  
37   public int encode(Envelope env) {
38     double midx = env.getWidth()/2 + env.getMinX();
39     int x = (int) ((midx - minx) / strideX);
40  
41     double midy = env.getHeight()/2 + env.getMinY();
42     int y = (int) ((midy - miny) / strideY);
43       
44     return HilbertCode.encode(level, x, y);
45   }
46  
47 }
48