2013-01-09 1 views
1

XML 파일에서 좌표를 다운로드하여 mapView을 만듭니다. 나는 이미 좌표를 파싱하고 싶다.하지만 그 코드를 하드 코딩한다는 것을 알고있다. 두 가지 문제가있다. 첫째, 포인트를 배열하는 가장 좋은 방법은 GeoPoints "From XML File"인가? 두 번째 문제는 폴리곤을 분리 할 수 ​​없다는 것입니다. 각 다각형 뷰에 대해 5 개의 좌표가 있습니다. 문제는 그것이 다각형 인 것처럼 연결하는 것입니다. 누군가 내가 잘못하고있는 것을 말해 줄 수 있거나 내가해야 할 일이 있습니다. 아래는 내가 현재 어떤 도움을 주시면 감사하겠습니다.MapView에 다각형 배열

나는 원래 질문에 대한 업데이트를 가지고 있는데, 배열 부분은 Laire's question을 사용하는 xml에서 작동합니다. 그래서 모든 좌표가 xml 파일에서 맵에 다운로드되고 있지만 문제는 마치 하나의 좌표 세트처럼 연결되어 있습니다. map with polygons을 참조하십시오. 여기

내가 내 mainActivity.java에서

public class MapViewActivity extends MapActivity { 
ArrayList<HashMap<String, Object>> boslst; 
MapView mapView; 
MapController mapcontrol; 
GeoPoint p; 
Polygon polygon; 

private static final class LatLonPoints extends GeoPoint { 
    public LatLonPoints(double latitude, double longitude) { 
     super((int) (latitude * 1E6), (int) (longitude * 1E6)); 
    } 
} 
public static BigDecimal round(float d, int decimalPlace) { 
    BigDecimal bd = new BigDecimal(Float.toString(d)); 
    bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);  
    return bd; 

} 
@Override 
protected boolean isRouteDisplayed() { 
    return false; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 



    String coordinates[] = {"35.20418", "-89.86862"}; 
    double lat = Double.parseDouble(coordinates[0]); 
    double lng = Double.parseDouble(coordinates[1]); 

    p = new GeoPoint(
      (int) (lat * 1E6), 
      (int) (lng * 1E6)); 

    MapView mapView = (MapView) findViewById(R.id.mapview); 
    mapcontrol = mapView.getController(); 
    mapcontrol.animateTo(p); 
    mapcontrol.setZoom(10); 
    mapView.setBuiltInZoomControls(true); 

    ArrayList<GeoPoint> points = new ArrayList<GeoPoint>(); 
    try { 

     URL url = new URL(
       "my url"); 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(new InputSource(url.openStream())); 
     doc.getDocumentElement().normalize(); 

     NodeList nodeList = doc.getElementsByTagName("Section"); 


     for (int i = 0; i < nodeList.getLength(); i++) { 

      Node node = nodeList.item(i); 

      Element locElement = (Element) node; 
      NodeList nameList = locElement.getElementsByTagName("coords"); 


      int locationCount = nameList.getLength(); 

     for (int j = 0; j < nameList.getLength(); j++) { 

      Node nodel = nameList.item(j); 

      Element fstElement = (Element) nodel; 
      NodeList nameL = fstElement.getElementsByTagName("coords"); 
      Element nameE = (Element) nameL.item(0); 
      nameL = nameE.getChildNodes(); 

      String latit = ((Node) nameL.item(0)).getNodeValue(); 
      String[] latt = latit.split(","); 
      BigDecimal latitude = round(Float.parseFloat(latt[0]),5); 
      BigDecimal longitude = round(Float.parseFloat(latt[1]),5); 


      double Lat = latitude.doubleValue(); 
      double Long = longitude.doubleValue(); 


      points.add(new LatLonPoints(Lat,Long)); 
      polygon = new Polygon(points); 
     } 
      polygon = new Polygon(points); 

     } 
    }catch (Exception e) { 
     Log.e("APP","Failed", e); 
    }   

    mapView.getOverlays().clear(); 
    mapView.getOverlays().add(polygon); 
    mapView.invalidate(); 
} 

Polygon.java

그렇게 공정이 코드입니다
public class Polygon extends Overlay { 
ArrayList<GeoPoint> geoPoints; 

public Polygon(ArrayList<GeoPoint> points){ 
    geoPoints = points; 
} 

@Override 
public void draw(Canvas canvas, MapView mapView, boolean shadow){ 
    //Set the color and style 
    Paint paint = new Paint(); 
    paint.setColor(Color.parseColor("#88ff0000")); 
    paint.setAlpha(50); 
    paint.setStyle(Paint.Style.STROKE); 

    //Create path and add points 
    Path path = new Path(); 
    Point firstPoint = new Point(); 
    mapView.getProjection().toPixels(geoPoints.get(0), firstPoint); 
    path.moveTo(firstPoint.x, firstPoint.y); 

    for(int i = 1; i < geoPoints.size(); ++i){ 
     Point nextPoint = new Point(); 
     mapView.getProjection().toPixels(geoPoints.get(i), nextPoint); 
     path.lineTo(nextPoint.x, nextPoint.y); 
    } 

    //Close polygon 
    path.lineTo(firstPoint.x, firstPoint.y); 
    path.setLastPoint(firstPoint.x, firstPoint.y); 
    canvas.drawPath(path, paint); 
    super.draw(canvas, mapView, shadow); 

} 
} 

그래서 빌드 다각형을 얻기 위해해야 ​​할 일을 내 질문에 한 번에 하나씩 행동하지 말라.

+0

"하나가 아닌 행동"이란 무엇을 의미합니까? – Codeman

+0

이미지를 보면 정확한 위치에 폴리곤이 표시되지만 선은 각 선을 떠나서 다음 선으로 진행됩니다. – Dwill

답변

0

나는 당신이 변경해야 믿습니다

//Close polygon 
path.lineTo(firstPoint.x, firstPoint.y); 
path.setLastPoint(firstPoint.x, firstPoint.y); 
canvas.drawPath(path, paint); 
super.draw(canvas, mapView, shadow); 

이에 :

//Close polygon 
    path.lineTo(firstPoint.x, firstPoint.y); 
    path.setLastPoint(firstPoint.x, firstPoint.y); 
    canvas.drawPath(path, paint); 
    path.close(); 
    super.draw(canvas, mapView, shadow); 

마지막에 경로를 닫고 원래 지점으로 돌아갑니다.

+0

내 문제는 루프에 있다고 생각합니다. geoPoints에 대한 계산을 수행했으며 35를 반환했습니다. xml 문서에 5 개의 lat와 longs가 포함 된 7 세트가 있습니다. 무슨 일이 일어나야 만하는지 5 번마다 다각형을 만들어 35 번을 만들지 않고 만들어야합니다. – Dwill